Bashシェルスクリプトでは、$ 2がコマンドラインの複数の引数と同じになることはありますか?それとも3ドル、4ドルなどの費用はかかりますか?

Bashシェルスクリプトでは、$ 2がコマンドラインの複数の引数と同じになることはありますか?それとも3ドル、4ドルなどの費用はかかりますか?

以下のスクリプト例では、スクリプトを使用するプロセスに応じて1つまたは2つのEメールアドレスに送信するために使用されます。追加のメールアドレスを購入するには3ドルを追加する必要がありますか、それとも2ドルで十分ですか?

(
for file in /usr/app/tst/$1/MS_CASE_ST*.csv;
do
   uuencode ${file} $(basename ${file})
done
) | mailx -s "MS_CASE_ST*.csv file contains data. Please Research" $2 

example.sh スクリプトの実行方法の例:

$ ./example.sh output [email protected] [email protected]

答え1

$2常に2番目の引数のみが使用されます。 $@はすべてのパラメータの配列なので、2番目のパラメータを最後まで望む場合は、次のようにできます。

... | mailx -s "MS_CASE_ST*.csv file contains data.  Please research" "${@:2}"

オフセット:2を指定しますパラメータ拡張$@配列を拡張するとき

答え2

この特定のスクリプトを使用して複数の受信者をサポートするには、$1パス要素として使用し、位置パラメータリストの外に移動します。リスト$@には受信者のみが含まれます。

#!/bin/bash

dir=$1
shift

shopt -s nullglob

for file in "/usr/app/tst/$dir/MS_CASE_ST"*.csv; do
    uuencode "$file" "$( basename "$file" )"  # or uuencode "$file" "${file##*/}"
done | mailx -s 'MS_CASE_ST*.csv file(s) contains data. Please Research' "$@"

いくつかの注意:

  • 注意して、変数拡張を二重引用符で囲んでください。そうしないと、パス名にスペースやファイル名のワイルドカード文字など(単一引用符で囲まれた静的文字列を含む)が含まれている場合に問題が発生します。

  • $@次の引用は、"$@"個別に引用された要素まで拡張されます。

  • nullglobシェルオプションを設定すると、bashループで使用されるワイルドカードパターンが次に展開されます。何もない既存のパス名と一致しない場合。

答え3

この問題は混乱しているようです。シェルコマンドのパラメータですread。彼らは違う:

  1. シェル:

    set -- foo bar baz buzz zap bang ; echo $2
    

    2番目の単語のみを出力します。

    bar
    
  2. read2つの変数名を使用するコマンド:

    echo foo bar baz buzz zap bang | (read x y ; echo $y )
    

    2番目の単語を含むすべてを出力します。

    bar baz buzz zap bang
    

関連情報