脚本输出取决于参数

脚本输出取决于参数

我有一个脚本可以打印出几行文本。该文本被其他进程用作配置。

当我正常运行程序时,我将标准输出重定向到文件,这很好:

./generateConfig.sh > normal.cfg

但问题是,normal.cfg确实是恒定的,我想通过提供附加参数(如-o,没有参数参数)让用户选择打印到文件或在屏幕上。

如果脚本内容是:

#!/bin/bash
echo "8.8.8.8"

我如何参数化输出,以便根据参数将其打印到文件或标准输出?

这似乎不起作用:

#!/bin/bash
output="/dev/stdout"
if [ $# -gt 0 ]; then
  output="normal.cfg"
fi
echo "8.8.8.8" > $output

答案1

几种做法:

一个功能

 #! /bin/sh -
 [ "$#" -gt 0 ] && redir=true || redir=false
 redir() if "$redir"; then "$@" > normal.cfg; else "$@"; fi

 redir echo 8.8.8.8

别名:

 #! /bin/sh -
 [ -z "$BASH_VERSION" ] || shopt -s expand_aliases

 [ "$#" -gt 0 ] && alias redir='>normal.cfg' || alias redir=

 redir echo 8.8.8.8

(不适用于posh禁用的别名,或者如果来源(使用.命令)在 AT&T 实现中ksh)。

专用文件描述符:

 #! /bin/sh -
 [ "$#" -gt 0 ] && exec 3> normal.cfg || exec 3>&1

 echo 8.8.8.8 >&3

(请注意,除了 ksh93 之外,没有多少 shell 在 fd 3 上设置 close-on-exec 标志,因此您可能需要关闭手动执行的命令)

答案2

您可以使用重定向整个脚本的输出exec

#! /bin/bash

if [[ $1 = -o ]]
then
    exec > "$2"
fi

echo "8.8.8.8"

现在,如果您使用 运行脚本-o foo,输出将位于文件 中foo

$ ./foo.sh 
8.8.8.8
$ ./foo.sh -o bar
$ cat bar
8.8.8.8

答案3

尝试使用:

#!/bin/bash
output="normal.cfg"
if [ $# -gt 0 ]; 
 then
  echo "8.8.8.8" > $output
 else
  echo "8.8.8.8"
fi

如果你想做更复杂的事情,你可以尝试tee命令:请参阅此处的示例

相关内容