以下は私が実行しているスクリプトです
#$1 - Argument
declare IPATH="sample/"
declare F=$IPATH$1
echo $F
ls $F
入力は./script.sh "Fil*"
エコー出力は-
sample/Fil*
コマンドを実行するとls sample/Fil*
必要な出力が得られます-名前がFILで始まり、次のようにサンプルフォルダーにあるファイルのリスト-
sample/File sample/File1 sample/File2
ただし、スクリプトは以下の例外をスローします。私は何が間違っているのですか?
ls: sample/Fil*: No such file or directory ls: $IPATH: No such file or directory
Globs は quotes では展開されません。スクリプト内でできますが、それは本当に悪い習慣です(誰かが*
または?
を含むファイル名を持っていた場合はどうなりますか? ?スクリプトを使用して操作することはできません)。ベストプラクティスは、スクリプト内のすべての変数参照を引用し、実際のパスをスクリプトに渡すことです。
$ mkdir sample
$ touch sample/File1 sample/File2
$ cat script.sh
#!/bin/sh
F="$1"
echo "$F"
ls "$F"
$ ./script.sh sample/Fil*
sample/File1
sample/File1
またはさらに良いことに、すべてのファイルをループします。
$ cat script.sh
#!/bin/sh
for path
do
echo "$path"
ls "$path"
done
$ ./script.sh sample/Fil*
sample/File1
sample/File1
sample/File2
sample/File2
パスの一部をハードコーディングする場合は、 find
を使用してパスを展開できます。
while IFS= read -r -d '' -u 9 path
do
ls -- "$path"
done 9< <( find "sample" -name "$1" -exec printf '%s\0' {} + )