我想创建一个ls
使用提供的参数执行命令的脚本。为什么它不起作用?我尝试使用 example 运行它-R
,然后它回显(我回显相同的内容进行比较):
ls "-R"
但说它无法访问“-R”:没有这样的文件或目录。但是当我ls "-R"
在终端中执行时,它起作用了。
脚本本身:
text='ls'
while [[ $# -gt 0 ]]
do
text+=' "'
text+=$1
text+='"'
shift
done
echo 'ls "-R"'
echo $text
$text
答案1
错误的引用是问题所在。"
如果它包含在变量中,则不引用(并且,这就是这里的问题,不会被删除!)。例外:eval $text
您应该将参数分配给数组并使用ls "${vars[@]}"
orls "$@"
代替。
比较两个调用:
set -x
ls -l
ls "-l"
set +x
答案2
这不是 bash 中引用的工作方式。输入时
ls "-R"
引号删除发生在命令上,因此命令变为
ls -R
另一方面,如果您设置
text='ls "-R"'
并运行$text
,引号删除不会发生。请参阅man bash
扩展部分:
在前面的扩展之后,所有不是由上述扩展之一产生的未加引号的字符 \、' 和 " 出现的位置都将被删除。
"
这里是参数扩展的结果,所以没有被删除。