使用$@
可以在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[@]}"
。如果反过来做,当输入包含通配符、空格等内容时,就会出现细微的(或明显的)错误。 - Charles Duffyplot for [file in '$list'] file ...
- Jonatan Öström