以下のスクリプト例では、スクリプトを使用するプロセスに応じて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
。彼らは違う:
シェル:
set -- foo bar baz buzz zap bang ; echo $2
2番目の単語のみを出力します。
bar
read
2つの変数名を使用するコマンド:echo foo bar baz buzz zap bang | (read x y ; echo $y )
2番目の単語を含むすべてを出力します。
bar baz buzz zap bang