我有一个bash脚本,它接收来自用户的一组文件。这些文件有时位于名称中包含空格的目录下。不幸的是,与this question不同,所有的文件名都是通过命令行接口传递的。让我们假设路径在用户传入时正确地加了引号,因此空格(除了引号空格)是路径之间的分隔符。如何以保留引用空格的方式将这些参数转发到bash脚本中的子例程?
发布于 2011-09-24 07:04:06
#! /bin/bash
for fname in "$@"; do
process-one-file-at-a-time "$fname"
done
注意引号的过度使用。这一切都是必要的。
将所有参数传递给另一个程序甚至更简单:
process-all-together "$@"
棘手的情况是当您想要将参数一分为二时。这需要在一个简单的POSIX shell中编写更多的代码。但也许Bash有一些特殊的功能。
发布于 2011-09-24 07:05:51
您需要使用"$@"
,它具有扩展$@
但保留调用者的空格引号的特殊语法(它不会创建一个包含所有参数的巨大字符串)。因此,有人可以像这样调用您的脚本:
bash-script.sh AFile "Another File With Spaces"
然后,在您的脚本中,您可以执行以下操作:
for f in "$@"; do
echo "$f";
done
并得到两行输出(而不是5行)。
请在此处阅读有关特殊参数"@“的段落:http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
发布于 2017-09-24 23:41:21
太棒了@Roland。这对您的解决方案有很大帮助
它真的起作用了!
我编写了一个简单的脚本函数,它使用nautilus打开给定的路径。
我刚刚用这个“helper”-for循环嵌套了一个函数到main函数中:
fmp () {
fmp2() {
nautilus "$@";
};
for fname in "$@";
do
fmp2 "$fname";
done;
}
现在,我可以让我的所有脚本处理路径,只需将它们转换为嵌套函数,并使用此helper-for循环将其封装。
https://stackoverflow.com/questions/7535677
复制相似问题