Linux 获取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

案例1: 假设我正在向shell脚本传递多个参数,如下所示:

./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