スクリプトの出力はパラメータによって異なります。

スクリプトの出力はパラメータによって異なります。

数行のテキストを印刷するスクリプトがあります。このテキストは、他のプロセスで構成として使用されます。

プログラムを正常に実行すると、標準出力をファイルにリダイレクトし、正常に動作します。

./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次のコマンドを試してください。ここの例をご覧ください。

関連情報