web-dev-qa-db-ja.com

bashスクリプトのLsコマンドに「そのようなファイルやディレクトリはありません」と表示されます

以下は私が実行しているスクリプトです

#$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
3
user657592

Globsquotes では展開されません。スクリプト内でできますが、それは本当に悪い習慣です(誰かが*または?を含むファイル名を持っていた場合はどうなりますか? ?スクリプトを使用して操作することはできません)。ベストプラクティスは、スクリプト内のすべての変数参照を引用し、実際のパスをスクリプトに渡すことです。

$ 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' {} + )
9
l0b0