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

Łuk*_*Lew 143 bash command-line

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

unw*_*ind 216

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

  • 实际上"$ @"比$*更安全 (22认同)
  • `$ @`基本上将数组的每个元素视为带引号的字符串 - 它们是在没有扩展机会的情况下传递的.它还确保每个都被视为一个单独的单词.这个解释以及展示差异的测试脚本在这里:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF (21认同)
  • 有什么不同? (4认同)
  • 注意使用引号!阅读更多关于为什么它们很重要的信息:http://stackoverflow.com/a/4824637/4575793 (2认同)
  • 为了澄清我在尝试此解决方案之前遇到的一个问题:`"$@"` 不会将脚本/命令名称本身作为参数传递,这与 C 系列语言中的 `sys.argv[0]` 不同。换句话说,您可以简单地将任何命令调用为 `cmd_inside_script "$@"` (2认同)

Ste*_* B. 29

bash使用shift命令:

例如shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2
Run Code Online (Sandbox Code Playgroud)

shifttest.sh 1 2 3产生

1
2 3
Run Code Online (Sandbox Code Playgroud)

  • @TamásZahola 关心解释吗? (2认同)
  • 如果您将参数转发为`$ 1`而不将其引为`“ $ 1”`,那么外壳程序将执行单词拆分,因此例如`foo bar`将分别转发为`foo`和`bar`。 (2认同)
  • 我的大脑混淆了“shifttest”中的几个字母,因此我把它读成了其他东西。 (2认同)

Rob*_*ujo 16

bash支持子集化参数(请参阅子集和子字符串),因此您可以选择要处理/传递的参数,如下所示:

打开新文件并进行编辑:vim r.sh

echo "params only 2    : ${@:2:1}"
echo "params 2 and 3   : ${@:2:2}"
echo "params all from 2: ${@:2:99}"
Run Code Online (Sandbox Code Playgroud)

运行:

$ chmod u+x r.sh
$ ./r.sh 1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)

结果是:

params only 2    : 2
params 2 and 3   : 2 3
params all from 2: 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)