以下是我正在运行的脚本
#$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
这将如您所期望的那样工作。