私は古いファイルを圧縮するスクリプトを書いていますが、オンラインの例の中で以下を見つけました。"${files[@]}"
特殊文字の意味や読み方について詳しく知りたいです。"${files[@]}"
files=($(find /var/cdrs -maxdepth 1 -name \*.C*R -mtime +150))
tar cvfz /var/cdrs_backup/CDRBackup_$(date +%Y%m%d_%H%M%S).tar.gz "${files[@]}"
答え1
つまり、files
配列を作成して拡張します。
あなたは次のように読んだ。
VAR=...
変数を割り当てるという意味です。VAR=(...)
bash 配列を変数に代入するという意味です。
$(...)
これは、コマンドを実行してその出力をキャプチャすることを意味します。あなたの場合、これは与えられたパターンに一致するファイルのリストであり、非常に古いファイルのリストであり、各ファイルをbash配列の要素に割り当てます。
${...}
変数値を読み込んでいることを示します。たとえば、次のようになります。
$ SOMEVAR="a value"
$ echo "${SOMEVAR}"
a value
Bashでは$VAR
同じ${VAR}
ですが、${VAR}
表記法を使用するといくつかの追加操作を実行できます。最も注目に値するのは、変数を拡張して文字列に関連付けるのecho "${VAR}iable"
ではなく、変数を拡張しようとすることです。あなたもできます$VAR
iable
echo $VARiable
$VARiable
高度な代替記号を使用してください${...}
。
私たちの場合は、ファイル変数を読んでいます${file...}
。次に、[...]
私たちが読んでいることを示します。バッシュ配列。だから私たちはファイル配列の要素にアクセスしようとしています。内部ビットは、どの要素にアクセスできるのか、最初の要素にアクセスできるのか、2番目の要素にアクセスできるのか[...]
などを示します。 (bash配列は0ではなく1からインデックスが付けられます。)すべての要素を意味するので、bash配列のすべての要素にアクセスしようとしています。1
2
@
file
次の方法を試すことができます。
% ARRAY=("a value" "another value" "fred")
% for x in "${ARRAY[@]}"; do echo "$x"; done
a value
another value
fred
スペースで区切られた文字列を使用するよりも配列を使用すると、上記のように値にスペースを含めることができるという利点があります。したがって、あなたの場合、配列内の各ファイルはfiles
別々の引数として扱われ、ファイル名のスペースは正しく処理されます。
したがって、本質的に、スニペットはファイルのリストを見つけて収集し、tarコマンドに別々の引数として渡します。
答え2
files=(...)
作成済み大量にファイル名数
構文は、"${files[@]}"
配列の各要素、つまり見つかった各ファイル名を意味します。"..."
ラップに注意してください。一部のファイル名が分割されるのを防ぐことが重要です。
(ファイル名にキャリッジリターン文字が含まれていると失敗する可能性があります)。
答え3
files=(...)
作る大量にこの構文を作成した文字列ksh
と、後でこれを採用したシェルなどbash
。
$(find /var/cdrs -maxdepth 1 -name \*.C*R -mtime +150)
指定された基準に一致するスペースで区切られたパス名のリストを作成します。ただし、ファイル名にIFS文字(通常はスペース、タブ、および改行)の1つが含まれている場合、ファイル名は複数の部分に分割され、配列に誤って格納されます。
"${files[@]}"
各要素が参照される文字列のリストに展開されます。前の段落で説明したように、配列にスペース、タブ、またはキャリッジリターンを含めることはできないため、ここで要素を参照することは役に立ちません。これにより、この構文を少し単純化できます${files[*]}
。