次の単純化されたbashスクリプトがあります。
#!/bin/bash
files=("$@")
if [ "X$files" = "X" ]; then
files=$HOME/print/*.pdf;
fi
for file in "${files[@]}"; do
ls "$file";
done
引数(ファイル名)を引数として渡すと、このスクリプトは正しいファイル名を印刷します。一方、パラメータを渡さないと、次のものが印刷されます。
/home/user/print/*.pdf: No such file or directory
この場合、ファイル名が拡張されない理由と回避策は何ですか?一般的な「files = $ *」よりも優先されることを読んだので、files=("$@")
AND設定を使用したことに注意してください。"${files[@]}"
ベストアンサー1
files
次のように指定します。スカラー代わりに変数大量に変える
存在する
files=$HOME/print/*.pdf
一部を割り当てていますひも/home/highsciguy/print/*.pdf
$files
スカラー(文字列とも呼ばれる)変数と同じです。
使用:
files=(~/print/*.pdf)
または
files=("$HOME"/print/*.pdf)
代わりに。シェルはワイルドカードパターンをファイルパスリストに展開し、各ファイルパスを次に割り当てます。$files
大量に。
glob の拡張は割り当て中に行われます。
非標準のsh機能を使用する必要はなく、sh
ここではなくシステムで動作するように作成して使用できます。bash
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
set
"$@"
割り当てられた位置パラメータの配列。
もう一つのアプローチは保存することです。ワイルドカードパターンスカラー変数から:
files=$HOME/print/*.pdf
$files
そして、変数が拡張されたときにシェルにglobを拡張させます。
IFS= # disable word splitting
for file in $files; do ...
これには$files
引用符がないため(通常は行わないでください)、拡張は単語の区切り(ここでは無効)とワイルドカード/ファイル名の生成の影響を受けます。
したがって、*.pdf
一致するファイルのリストが拡張されます。ただし、$HOME
ワイルドカードを含めると拡張される可能性があるため、配列変数を使用することをお勧めします。