read
次の2つの文字列で変数を読み取るbashスクリプトを作成しています。
log.*.console.log log.*.log
スペースで区切られています。
出力が文字列形式になるように、スクリプトから呼び出される次のプログラムの変数出力をどのように書き換えることができますか?'log.*.console.log' 'log.*.log'
私はsedとawkを試していますが、何とか動作しません。
フルスクリプト:
#!/bin/bash
if [ -z "$*" ] ; then
echo "USAGE: ./some text"
exit 1
else
echo "some text"
read varlogname
i=1
for file in $@
do
echo "Doing" $file
GTAR=$(gtar -xvf $file --wildcards --ignore-case --no-anchored "$varlogname")
for file in ${GTAR[*]}
do
mv $file $file"."${i}
i=$((i+1))
done
done
echo "Files extracted."
fi
exit 0
ベストアンサー1
私はあなたが周りに一重引用符を付けたくないと思いますgtar
。シェルは、somecmd 'foo bar' 'files*.log'
特殊文字を特に処理せずにsomecmd
引数foo bar
や渡すように指示するなどのコマンドで引用符を処理しますfiles*.log
。 Unixプログラムは、コマンドラインを1つの文字列にインポートするのではなく、複数のパラメータ文字列を取得します。コマンドラインを文字列に分割するのはシェルです。
Bashで複数の値を使用するには、配列を使用してコマンドに渡すだけですread
。read -a array
-a array assign the words read to sequential indices of the array
variable ARRAY, starting at zero
つまり
read -a filenames
gtar "${filenames[@]}"
(引用符で囲む)を使用して配列にインデックスを付けると、配列[@]
メンバーは必要に応じて別の単語に展開されます。
また、配列としてアクセスさfor file in ${GTAR[*]}
れるように見えますが、GTAR
配列ではなく、コマンドの出力をgtar
文字列として割り当てるだけです。この場合${GTAR[*]}
と同じです$GTAR
。拡張子が引用されていないので、文字列はトークン化され、デフォルトで空白に分割されます。しかしそれ以降に起こることは返品ファイル名はグローバルに扱われ、一致するファイル名に展開されます。
ファイル名にスペースまたはglob文字()が含まれていない限り、*?[]
問題はありません。しかし、一般的に言えば、これは望む仕事ではありません。
"${array[@]}"
適切な配列の場合は、常に代わりに使用したいと思います[*]
。