在Bash中获取尾随参数

时间:2016-02-25 01:06:37

标签: bash

假设我有一个脚本,它带有两个参数组 - 选项-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的尾随参数?

1 个答案:

答案 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"; doneshift类型迭代才能正确删除。