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 ?
下面的脚本显示了如何获取传递给脚本的第一个和最后一个参数:
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)
为此,您可以使用:
${@: -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)
引用这里的一种方式:
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)