Linux 获取shell脚本上的最后一个参数
案例1: 假设我正在向shell脚本传递多个参数,如下所示:Linux 获取shell脚本上的最后一个参数,linux,bash,shell,unix,Linux,Bash,Shell,Unix,案例1: 假设我正在向shell脚本传递多个参数,如下所示: ./myshell_script a b c d 如果我运行echo$#将从我已传递的命令行中获得大量参数,并将其存储在一个变量中,如[因为我不知道用户正在传递的参数数量]: var1 = `echo "$#"` 案例2: $4给出了最后一个参数的名称 如果我想把它储存在 那么var2呢 var2 = $4 我的问题是: 若我想直接将从var1得到的值存储到var2,那个么如何在shell脚本中实现呢 例如: ./myshe
./myshell_script a b c d
如果我运行echo$#
将从我已传递的命令行中获得大量参数,并将其存储在一个变量中,如[因为我不知道用户正在传递的参数数量]:
var1 = `echo "$#"`
案例2:
$4给出了最后一个参数的名称
如果我想把它储存在
那么var2呢
var2 = $4
我的问题是:
若我想直接将从var1得到的值存储到var2,那个么如何在shell脚本中实现呢
例如:
./myshell_script.sh a b c
var1 = `echo "$#"` ie var1 = 3
现在我想要
var2=c[即始终是最后一个参数,因为我不知道用户从comand line传递了多少个参数]
我必须做什么?为此,您可以使用:
${@: -1}
试验
引述以下方式:
传递给脚本的最后一个参数将存储在变量last
中
正如链接中提到的,这将在POSIX兼容的shell中起作用,它适用于任意数量的参数
顺便说一句,我怀疑你的剧本是否像你在问题中写的那样有效:
var1 = `echo "$#"`
您需要删除=
周围的空格,例如:
var1=`echo "$#"`
或
下面的脚本显示了如何获取传递给脚本的第一个和最后一个参数:
numArgs="$#"
echo "Number of args: $numArgs"
firstArg="$1"
echo "First arg: $firstArg"
lastArg="${!#}"
echo "Last arg: $lastArg"
输出:
$ ./myshell_script.sh a b c d e f
Number of args: 6
First arg: a
Last arg: f
重新组织参数可能更好。将最后一个参数放在第一位(因此它是
$1
),并将可变数量的参数放在后面,而不是将可变数量的参数跟在特定的最终参数后面。所以不是
myshell_script a b c d
当var2
最终被设置为“d”时,使用
打个电话
myshell_script d a b c
现在
var2
的值将是“d”,并且$@
(在轮班后)将包含“a”、“b”和“c”。记录${!#}
的位置在哪里?这只是一个Bash特性吗?它在POSIX中吗?它是特定于Bash的。因此,如果你在bash中使用shebang,请使用它。如果您需要一些可移植的东西,我只找到@devnull建议的循环。对于旧Solaris,旧bourne shell(不是POSIX),我必须在“$@”中写“最后一个”;do:;done”这种方法无法达到目的。它让我想起了C中的printf,但是如果我们想做一些类似于test
命令的事情呢;如果参数超过4个,POSIX将保留指定测试命令的结果。
$ ./myshell_script.sh a b c d e f
Number of args: 6
First arg: a
Last arg: f
myshell_script a b c d
var2=$1; shift
myshell_script d a b c