获取shell脚本的最后一个参数

use*_*942 2 unix linux bash shell

情况1:假设我将一些参数传递给我的shell脚本,如下所示:

./myshell_script a b c d 
Run Code Online (Sandbox Code Playgroud)

and if I run echo $# will give me number of parameters from command line I have passed and I stored it in a variable like [ since I dont know number of arguments a user is passing ]:

var1 = `echo "$#"`
Run Code Online (Sandbox Code Playgroud)

case 2 : $4 gives me the name of last argument .

if i want it to store in

var2 then

var2 = $4 
Run Code Online (Sandbox Code Playgroud)

My question is :

If I want to store value I get from var1 to var2 directly , how would be it possible in shell script ?

for ex :

./myshell_script.sh a b c

var1 = `echo "$#"` ie var1 = 3
Run Code Online (Sandbox Code Playgroud)

now I want

var2 = c [ ie always last parameter , since I dont know how many number of parameters user is passing from comand line ]

what I have to do ?

dog*_*ane 9

下面的脚本显示了如何获取传递给脚本的第一个和最后一个参数:

numArgs="$#"
echo "Number of args: $numArgs"

firstArg="$1"
echo "First arg: $firstArg"

lastArg="${!#}"
echo "Last arg: $lastArg"
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./myshell_script.sh a b c d e f
Number of args: 6
First arg: a
Last arg: f
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 5

为此,您可以使用:

${@: -1}
Run Code Online (Sandbox Code Playgroud)

测试

$ cat a
#!/bin/bash

echo "passed $# parameters, last being --> ${@: -1}"

$ ./a a b c d
passed 4 parameters, last being --> d
$ ./a a b c d e f g
passed 7 parameters, last being --> g
Run Code Online (Sandbox Code Playgroud)


dev*_*ull 5

引用这里的一种方式:

for last; do : ; done
echo "${last}"
Run Code Online (Sandbox Code Playgroud)

传递给脚本的最后一个参数将存储在变量中last

正如链接中提到的,这可以在 POSIX 兼容的 shell 中工作,它适用于任意数量的参数。


顺便说一句,我怀疑你的脚本是否按照你在问题中所写的方式工作:

var1 = `echo "$#"`
Run Code Online (Sandbox Code Playgroud)

您需要删除 周围的空格=,即:

var1=`echo "$#"`
Run Code Online (Sandbox Code Playgroud)

或者

var1=$(echo "$#")
Run Code Online (Sandbox Code Playgroud)