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:以空格作为参数传递路径?的主要内容,如果未能解决你的问题,请参考以下文章

Shell数组以脚本传递参数

Shell数组以脚本传递参数

在bash中将包含空格的变量传递给命令[重复]

Makefile将变量传递给bash脚本

在bash中将数组作为参数传递

bash 在运行作为参数传递的文件时忽略 shebang