【发布时间】:2015-02-02 14:52:41
【问题描述】:
使用$@,您可以对 bash 中的文件列表执行操作。示例:
script.sh:
#!/bin/bash
list=$@
for file in $list; do _commands_; done
然后我可以调用这个程序
~/path/to/./script dir1/{subdir1/*.dat,subdir2/*}
此参数将扩展为多个参数,变为$list。但现在我想要其他参数,比如 1 美元、2 美元,而这个清单是 3 美元。所以我希望dir1/{subdir1/*.dat,subdir2/*} 的扩展发生在脚本内部,而不是成为许多参数。在命令行上你可以这样做:
find dir1/{subdir1/*.dat,subdir2/*}
并获得所需的输出,即文件列表。所以我尝试了这样的事情:
arg1=$1
arg2=$2
list=$(find $3)
for file in $list; do _commands_; done
...
调用:
~/path/to/./script arg_1 arg_2 'dir1/{subdir1/*.dat,subdir2/*}'
但没有成功。非常感谢有关如何将此列表扩展为脚本内的变量的一些帮助!:)
编辑:所以下面的答案使用这些命令给出了解决方案:
arg1="$1"
arg2="$2"
shift 2
for f in "$@"; do echo "processing $f"; done;
但出于好奇,是否仍然可以将字符串dir1/{subdir1/*.dat,subdir2/*} 传递给脚本内的find 命令(或任何相同的结尾),而不使用$@,并以这种方式获取列表?这可能很有用,例如如果最好将列表作为第一个或最后一个参数,或者在某些其他情况下,即使它需要转义字符或引用参数。
【问题讨论】:
-
list=$@不会将$@复制到数组中。list=( "$@" )会,但您需要将其扩展为for file in "${list[@]}"。当您的输入变得有趣(全局字符、空格等)时,以另一种方式执行此操作会产生细微(或不那么细微)的错误。 -
该列表将包含具有相当好名称的数据文件,因此这不应该成为问题。尽管 $list 用于调用 gnuplot 以将列出的文件绘制在一个图中。与
plot for [file in '$list'] file ...并且它现在得到的格式运行良好。 -
现在听起来这样可以满足您的需求,那么。不过,我敦促您要小心养成习惯——我已经看到 TB 的备份被删除,因为有人认为一个目录只有好听的名称,然后缓冲区溢出创建了一个带有星号的文件,并被空格包围.
标签: linux bash shell variable-expansion brace-expansion