如何将参数转发到bash脚本中的其他命令?


165

在我的bash脚本中,我想解析零个,一个或两个参数(脚本可以识别它们),然后将其余参数转发到脚本中调用的命令。我怎样才能做到这一点?

Answers:


239

使用shift内置命令来“吃掉”参数。然后调用子进程并将其传递给"$@"参数,以包括所有剩余的参数。注意引号,应该保留引号,因为引号会导致引数列表的扩展被正确引号。


23
实际上“ $ @”比$ *更安全
pixelbeat

1
@pixelbeat:谢谢,很好。我编辑了。@ŁukaszLew:请参见手册中的链接页面。:)基本上,它可以处理更好的报价。
放松

22
$@本质上将数组的每个元素都视为带引号的字符串-传递时没有扩展的机会。它还确保将每个单词视为一个单独的单词。此处的解释以及展示差异的测试脚本是:tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel,2009年

2
注意使用引号!在此处详细了解为什么它们如此重要:stackoverflow.com/a/4824637/4575793
Cadoiz

32

bash使用shift命令:

例如shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3产生

1
2 3

2
@TamásZahola在乎解释吗?
凯尔·查达

2
如果在$1不引号的情况下以形式转发参数"$1",则外壳程序将执行单词拆分,因此例如foo bar将分别转发为foobar
塔玛·扎霍拉(TamásZahola)

在此处阅读更多有关为何具有双倍“的重要性的信息:stackoverflow.com/a/4824637/4575793
Cadoiz

1
我的大脑在“ shifttest”中混乱了几个字母,因此我将其读为别的东西。
亚历克斯

21

Bash支持子集参数(请参阅Subsets和substrings),因此您可以像这样选择要处理/传递的参数。

  1. 打开新文件并编辑它:vim r.sh

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
  2. 运行:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. 结果是:

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.