我有一个bash脚本,可以从用户那里收集一组文件。这些文件有时位于名称中带有空格的目录下。不幸的是,与this question不同,所有文件名都通过命令行界面传递。让我们假设路径在用户传入时正确引用,因此空格(保存为引用空格)是路径之间的分隔符。如何以保留引用空格的方式将这些参数转发到我的bash脚本中的子例程?
答案 0 :(得分:20)
#! /bin/bash
for fname in "$@"; do
process-one-file-at-a-time "$fname"
done
注意过度使用引号。这一切都是必要的。
将所有参数传递给另一个程序甚至更简单:
process-all-together "$@"
棘手的情况是你想把参数分成两半。这需要在简单的POSIX shell中添加更多代码。但也许Bash有一些特殊的功能。
答案 1 :(得分:3)
你想要"$@"
,它具有扩展$@
的特殊语法,但保留了调用者的空格引用(它不会创建一个包含所有参数的巨大字符串)。所以有人可以像你一样调用你的脚本:
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
答案 2 :(得分:0)
Bravo @Roland。为你的解决方案做了很多努力
它确实奏效了!
我写了一个简单的脚本函数,用nautilus打开一个给定的路径。
我刚刚将一个带有“helper”-for-loop的函数嵌套到main函数中:
fmp () {
fmp2() {
nautilus "$@";
};
for fname in "$@";
do
fmp2 "$fname";
done;
}
现在,我可以通过将这些脚本转换为由函数包装的嵌套函数来使所有脚本处理路径。使用此辅助对象循环。
答案 3 :(得分:-1)
"$var"
例如,
$ var='foo bar'
$ perl -E'say "<<$_>>" for @ARGV' $var
<<foo>>
<<bar>>
$ perl -E'say "<<$_>>" for @ARGV' "$var"
<<foo bar>>