変数の一重引用符をスペースで区切られた文字列で置き換えます。

変数の一重引用符をスペースで区切られた文字列で置き換えます。

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で複数の値を使用するには、配列を使用してコマンドに渡すだけですreadread -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[@]}"適切な配列の場合は、常に代わりに使用したいと思います[*]

望むより:噴射スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?そしてソート

おすすめ記事