bash 脚本中的 ls 命令显示“没有这样的文件或目录”

use*_*592 4 linux bash command-line ls

以下是我正在运行的脚本

#$1 - Argument
declare IPATH="sample/"
declare F=$IPATH$1
echo $F
ls $F
Run Code Online (Sandbox Code Playgroud)

输入是 ./script.sh "Fil*"

回声输出是 -

sample/Fil*
Run Code Online (Sandbox Code Playgroud)

当我运行命令时,ls sample/Fil*我得到了所需的输出 - 名称以 FIL 开头且位于示例文件夹中的文件列表,如下所示 -

sample/File  sample/File1  sample/File2
Run Code Online (Sandbox Code Playgroud)

但是脚本会引发以下异常。我究竟做错了什么?

ls: sample/Fil*: No such file or directory ls: $IPATH: No such file or directory
Run Code Online (Sandbox Code Playgroud)

l0b*_*0b0 10

Glob不在引号中展开。您可以在脚本中扩展它们,但这是非常糟糕的做法(如果有人的文件名包含*?怎么办?他们将无法使用您的脚本来操作它)。最佳实践是引用脚本中的所有变量引用,并将实际路径传递给脚本:

$ 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
Run Code Online (Sandbox Code Playgroud)

或者更好的是,循环遍历所有文件:

$ 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
Run Code Online (Sandbox Code Playgroud)

如果你想对路径的一部分进行硬编码,你可以find它来扩展它:

while IFS= read -r -d '' -u 9 path
do
    ls -- "$path"
done 9< <( find "sample" -name "$1" -exec printf '%s\0' {} + )
Run Code Online (Sandbox Code Playgroud)