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

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

答案1

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

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

答案2

ls 在单独的 shell 中运行。在该 shell 上,IPATH 未定义,因为您尚未导出它。

将“declare”改为“export”就可以了。

答案3

采取宣布关键字,它就会起作用。不需要打字在 Bash 中:

   #!/bin/sh
   IPATH="sample/"
   F=$IPATH$1
   echo $F
   ls $F

这将如您所期望的那样工作。

相关内容