Bash:获取第一个命令行参数并传递其余参数

use*_*005 67 bash

例:

check_prog hostname.com /bin/check_awesome -c 10 -w 13

check_remote -H $HOSTNAME -C "$ARGS"
#To be expanded as
check_remote -H hostname.com -C "/bin/check_awesome -c 10 -w 13"
Run Code Online (Sandbox Code Playgroud)

我希望上面的内容是有道理的,论点会改变,因为我将使用它来处理大约20多个命令.它是一个包装程序的奇怪方法,但是它可以解决我们在这里使用的一些系统的一些问题(需要来自70年代的代码)

上面的内容可以用perl或python编写,但Bash是首选的方法

rav*_*avi 91

你可以使用班次

shift是一个内置的shell,它根据位置参数进行操作.每次调用shift时,它都会将所有位置参数"向下移动"一个.$ 2变为$ 1,$ 3变为$ 2,$ 4变为$ 3,依此类推

  • 真棒!就像一个魅力`echo $ 1 shift echo $*`是一个如何使用shift为未来人们搜索它的例子,运行它像`./script.sh cmd1 cmd2 cmd3 cmd4`它将设置$ 1到cmd1和休息将像我想要的cmd2 cmd3 cmd4 (9认同)
  • @ user554005:你应该几乎总是使用`echo"$ @"`而不是`echo $*`或`echo'$*"`因为不带引号的形式和引用的`$*`形式"扁平化"通常的参数不想要. (7认同)
  • @BradParks在将文件名作为参数传递时将被另一个命令读取,并且如果文件名包含空格,我认为您需要`SOME_VAR = $ 1;。转移; some_cmd“ $ @”`,因为`“ $ @”`可以确保转义的空格以反斜杠作为前缀传递。`“ $ *”`将删除`\`字符(或如上所述平整文件名) (4认同)
  • 并且`$#减少1,除非它已经为0.你也可以给`shift`一个数字参数移位多个地方. (3认同)
  • 所以典型的用法是`SOME_VAR=$1; 转移; some_cmd“$*”`。现在 `some_cmd` 被传递给 args 2..n。效果很好...谢谢! (2认同)

Hos*_*Aly 31

稍微调整一下阿卜杜拉的答案:

your_command "$1" "${@:2}"
Run Code Online (Sandbox Code Playgroud)

在 Bash(v3.2 和 v5.1)和 Zsh(v5.8)上测试


小智 25

作为程序员,我强烈建议不shift要这样做,因为修改状态的操作会影响脚本的大部分内容,并使其更难理解、修改和调试:sweat_smile:。您可以改为使用以下内容:

#!/usr/bin/env bash

all_args=("$@")
first_arg=$1
second_args=$2
rest_args=("${all_args[@]:2}")

echo "${rest_args[@]}"
Run Code Online (Sandbox Code Playgroud)

  • 我强烈建议不要将参数列表存储在简单的字符串变量中和/或扩展不带双引号的变量(例如此处的“REST_ARGS”)。使用数组(如“ALL_ARGS”)并用“[@]”和双引号扩展它。 (3认同)
  • 我对其进行了编辑以显示我推荐的表格。将参数列表存储为字符串会失去多个参数与包含空格的单个参数之间的区别;不使用双引号扩展它们将在*所有*空格上进行拆分(包括最初在参数内的空格),并且还会扩展任何看起来像文件名通配符的内容。例如,如果您将原始文件运行为 `./script "foo" "bar" "six * nine"`,它将打印“six <当前目录中的文件列表> nine”。 (3认同)
  • 我还建议使用小写或混合大小写的变量名称,以避免与具有特殊含义的各种全大写名称发生冲突。哦,[shellcheck.net](https://www.shellcheck.net) 擅长指出有问题的引用和其他常见错误。 (2认同)