bash:传递带空格的路径作为参数?

fbr*_*eto 16 bash whitespace parameter-passing filepath delimiter

我有一个bash脚本,可以从用户那里收到一组文件.这些文件有时位于名称中带有空格的目录下.不幸的是,与此问题不同,所有文件名都通过命令行界面传递.让我们假设路径在用户传入时正确引用,因此空格(保存为引用空格)是路径之间的分隔符.如何以保留引用空格的方式将这些参数转发到我的bash脚本中的子例程?

Rol*_*lig 21

#! /bin/bash

for fname in "$@"; do
  process-one-file-at-a-time "$fname"
done
Run Code Online (Sandbox Code Playgroud)

注意过度使用引号.这一切都是必要的.

将所有参数传递给另一个程序甚至更简单:

process-all-together "$@"
Run Code Online (Sandbox Code Playgroud)

棘手的情况是你想把参数分成两半.这需要在简单的POSIX shell中添加更多代码.但也许Bash有一些特殊功能.

  • 您可以通过删除"$ in"$ @"`"部分来保存令人难以置信的八个字符 - 它默认循环参数. (3认同)

P.T*_*.T. 5

您想要"$@",它具有扩展$@但保留调用方的空白引用的特殊语法(它不会创建包含所有参数的单个巨大字符串)。所以有人可以像这样调用你的脚本:

bash-script.sh AFile "Another File With Spaces"
Run Code Online (Sandbox Code Playgroud)

然后在您的脚本中,您可以执行以下操作:

for f in "$@"; do 
  echo "$f"; 
done
Run Code Online (Sandbox Code Playgroud)

并获得两行输出(不是 5 行)。

在此处阅读有关特殊参数“@”的段落:http : //www.gnu.org/s/bash/manual/bash.html#Special-Parameters