数行のテキストを印刷するスクリプトがあります。このテキストは、他のプロセスで構成として使用されます。
プログラムを正常に実行すると、標準出力をファイルにリダイレクトし、正常に動作します。
./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を除く多くのシェルは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
次のコマンドを試してください。ここの例をご覧ください。。