6

案例 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 [即始终是最后一个参数,因为我不知道用户从命令行传递了多少个参数]

我必须做什么?

4

4 回答 4

10

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

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
于 2013-10-30T09:25:07.230 回答
8

为此,您可以使用:

${@: -1}

测试

$ 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
于 2013-10-30T09:18:40.167 回答
4

从这里引用一种方式:

for last; do : ; done
echo "${last}"

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

如链接中所述,这将适用于与 POSIX 兼容的 shell,它适用于任意数量的参数。


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

var1 = `echo "$#"`

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

var1=`echo "$#"`

或者

var1=$(echo "$#")
于 2013-10-30T09:24:26.587 回答
-1

重新组织参数可能会更好。不是可变数量的参数后跟一个特定的最终参数,而是将最后一个参数放在第一位(因此它是$1),然后将可变数量的参数放在后面。所以而不是

myshell_script a b c d

var2最终设置为“d”,使用

var2=$1; shift

并打电话给

myshell_script d a b c

现在var2将具有“d”的值,并且$@(在移位之后)将包含“a”、“b”和“c”。

于 2013-10-30T13:04:07.097 回答