bash:以空格作为参数传递路径?
Posted
技术标签:
【中文标题】bash:以空格作为参数传递路径?【英文标题】:bash: passing paths with spaces as parameters? 【发布时间】:2011-11-24 00:59:21 【问题描述】:我有一个 bash 脚本,它从用户那里接收一组文件。这些文件有时位于名称中带有空格的目录下。不幸的是,与this question 不同,所有文件名都是通过命令行界面传递的。假设路径在用户传入时被正确引用,因此空格(除了引用的空格)是路径之间的分隔符。如何以保留引号空格的方式将这些参数转发到我的 bash 脚本中的子例程?
【问题讨论】:
【参考方案1】:#! /bin/bash
for fname in "$@"; do
process-one-file-at-a-time "$fname"
done
注意引号的过度使用。都是必须的。
将所有参数传递给另一个程序更简单:
process-all-together "$@"
棘手的情况是您想将参数分成两半。这需要在一个简单的 POSIX shell 中编写更多代码。但也许 Bash 有一些特殊功能。
【讨论】:
谢谢;如果我需要批量处理它们怎么办? 另外,请确保子程序正确地双引号所有内容,例如process-one-file-at-a-time() cp "$1" "backupdir/$(basename "$1")";
您可以通过删除“in "$@"
”部分来保存令人难以置信的八个字符 - 默认情况下它会遍历参数。【参考方案2】:
您需要"$@"
,它具有扩展$@
的特殊语法,但保留调用者的空白引用(它不会创建包含所有参数的单个巨大字符串)。所以有人可以像这样调用你的脚本:
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
【讨论】:
【参考方案3】:好极了@Roland。非常感谢您的解决方案
真的成功了!
我写了一个简单的脚本函数,用 nautilus 打开一个给定的路径。
我刚刚在主函数中嵌套了一个带有这个“helper”-for-loop 的函数:
fmp ()
fmp2()
nautilus "$@";
;
for fname in "$@";
do
fmp2 "$fname";
done;
现在我可以让我的所有脚本都可以处理路径,只需将它们转换为嵌套函数,并由具有此 helper-for-loop 的函数包装。
【讨论】:
【参考方案4】:"$var"
例如,
$ var='foo bar'
$ perl -E'say "<<$_>>" for @ARGV' $var
<<foo>>
<<bar>>
$ perl -E'say "<<$_>>" for @ARGV' "$var"
<<foo bar>>
【讨论】:
以上是关于bash:以空格作为参数传递路径?的主要内容,如果未能解决你的问题,请参考以下文章