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

Bash:获取第一个命令行参数并传递其余参数,bash,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" 我希望上面的内容有意义,参数会改变,因为我将在大约20多个命令中使用它。这是一种奇怪的包装程序的方法,但它可以解决我们在这里使用的一些系统的一些

例如:

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"
我希望上面的内容有意义,参数会改变,因为我将在大约20多个命令中使用它。这是一种奇怪的包装程序的方法,但它可以解决我们在这里使用的一些系统的一些问题(必须喜欢70年代的代码)

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

shift是对位置参数进行操作的shell内置项。每次调用shift时,它都会将所有位置参数下移一次$2变成1美元,3变成2美元,4变成3美元,依此类推

例如:

$ function foo() { echo $@; shift; echo $@; } 
$ foo 1 2 3
1 2 3
2 3

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

#/usr/bin/env bash
所有参数=(“$@”)
第一个参数=$1
第二个参数=$2
rest_args=(“${all_args[@]:2}”)
回显“${rest_args[@]}”

太棒了!像charm一样工作
echo$1 shift echo$*
是一个示例,说明了如何使用shift来让未来的人搜索它,像
/script.sh cmd1 cmd2 cmd3 cmd4
一样运行它,它会将$1设置为cmd1,其余的将是我想要的cmd2 cmd3 cmd4,
$\code>减少1,除非它已经是0。您还可以为
shift
指定一个数字参数,使其移位多个位置。@user554005:您几乎应该始终使用
echo“$@”
而不是
echo$*
echo“$*”
,因为不带引号的表单和带引号的
$*
表单“展平”通常不需要的参数。因此典型的用法是
SOME_VAR=$1;转移;一些命令“$*”
。现在
some_cmd
被传递给args 2..n。工作很好。。。谢谢@当将文件名作为参数传递给另一个命令时,如果文件名包含空格,我想您需要
SOME_VAR=$1;转移;有些命令“$@”
,因为
“$@”
确保转义空格将以反斜杠前缀传递<代码>“$*”
将删除
\
字符(或如上所述展平文件名),我强烈建议不要将参数列表存储在简单的字符串变量中和/或不使用双引号展开变量(如
此处的REST\u ARGS
)。使用数组(如
ALL_ARGS
)并用
[@]
和双引号将其展开。@Gordondavison您可以根据您的建议重写
bash
代码段,还是编写其他代码段?我非常想更多地理解它,并在我现在正在编写的一些
bash
脚本中使用它。提前感谢,继续做好工作!我已对其进行了编辑,以显示我推荐的表单。将参数列表存储为字符串将失去多个参数与包含空格的单个参数之间的区别;如果不使用双引号展开它们,将在所有空格(包括最初位于参数中的空格)上拆分,并且还会展开任何看起来像文件名通配符的空格。例如,如果以
/script“foo”“bar”“six*nine”
的形式运行原始变量,它将打印“six-nine”。我还建议使用小写或混合大小写变量名,以避免与具有特殊含义的各种全大写名称冲突。哦,并且善于指出有问题的引用和其他常见错误。谢谢@GordonDavisson,现在我可以写更好的BASH脚本了,遵循我答案的人不会重复我的错误。