假设我有一个脚本,它带有两个参数组 - 选项-e
和目录/文件/path/to/file
和/path/to/folder
。
./myscript -e /path/to/file /path/to/folder
我知道$@
获取所有参数,$#
获取参数数量。
这方面的一个例子是rm
。使用rm
,可以将参数-rf
与目录/path/to/file /path/to/another/file /path/to/some/folder
一起传递,依此类推。
在我的脚本中,该选项被处理为$1
,但我该如何处理rm-style的尾随参数?
答案 0 :(得分:2)
在bash中,除shift
运算符外,您还可以使用${@:n}
语法返回以n
开头的所有尾随位置参数。继续使用第一个参数'-e'
并将剩余参数发送到rm -rf
的示例,您可以使用:
rm -rf "${@:2}"
一个简短的实际例子可以让你更好地感受它:
#!/bin/bash
for ((i=1; i<=$#; i++)); do
echo "\${@:$i} : ${@:$i} ($(($#-i+1)) args)"
done
示例强>
$ bash atargs.sh -e dir/a.txt dir/b.txt dir/c.txt
${@:1} : -e dir/a.txt dir/b.txt dir/c.txt (4 args)
${@:2} : dir/a.txt dir/b.txt dir/c.txt (3 args)
${@:3} : dir/b.txt dir/c.txt (2 args)
${@:4} : dir/c.txt (1 args)
注意:您没有获得带有空格等文件名的免费通行证。虽然正确保留了参数数量,并且如果您已将最后一个参数传递为"dir/c with a space.txt"
,参数数字将保持不变,上面的最后一行输出正确为:
${@:4} : dir/c with a space.txt (1 args)
您无法简单地将"${@:2}"
传递给rm -rf
。对于引用参数中的空格,您仍然需要在参数中使用for i in "${@:2}"; do rm -rm "$i"; done
或shift
类型迭代才能正确删除。