Unix 带有用户输入的Bourne shell脚本

Unix 带有用户输入的Bourne shell脚本,unix,sh,Unix,Sh,我试图用从图书馆借来的教科书自学伯恩·谢尔脚本的基本知识,并且在每一章的结尾处解决问题。然而,我刚刚得到一个,我被难住了 编写一个接受零个或多个参数的脚本,并打印列表中的最后一个参数。例如,给定参数“myProgram arg1 arg2 arg3”,输出将为“arg3” 有人能给我一些关于如何设置这个的建议吗?我正试着复习关于用户输入和参数的部分,但到目前为止我还没有做那么多的工作,所以我还没有太多的练习。我只给你一些提示。既然您想学习bash,那么您可能不想只需要一段代码来满足问题的要求:

我试图用从图书馆借来的教科书自学伯恩·谢尔脚本的基本知识,并且在每一章的结尾处解决问题。然而,我刚刚得到一个,我被难住了

编写一个接受零个或多个参数的脚本,并打印列表中的最后一个参数。例如,给定参数“myProgram arg1 arg2 arg3”,输出将为“arg3”


有人能给我一些关于如何设置这个的建议吗?我正试着复习关于用户输入和参数的部分,但到目前为止我还没有做那么多的工作,所以我还没有太多的练习。

我只给你一些提示。既然您想学习bash,那么您可能不想只需要一段代码来满足问题的要求:

1) 您知道如何计算bash函数有多少个参数吗

2) 你知道如何循环吗

3) 你知道如何“弹出”其中一个论点吗

4) 你知道如何打印第一个参数吗

如果你把所有这些放在一起,我打赌你会想出办法的

echo ${!#}         # bash only
eval echo \${$#}   # sh-compatible
解释 参数的数量为
$#
。变量可以通过
${!VAR}
间接访问。例如:

$ VAR="PATH"
$ echo ${!VAR}
/sbin:/bin:/usr/sbin:/usr/bin
把它们放在一起,如果我们有一个包含整数的变量
$n
,我们可以使用
${!n}
访问
$n
第个命令行参数。或者,让我们使用
$#
来代替
$n
;最后一个命令行参数是
${!#}


此外,可以使用数组切片(数组切片是一个包含所有命令行参数的数组)更冗长地编写它,如下所示:

奇怪的是,您不能使用数组索引:

# Does not work
echo ${@[$#]}

谢谢你详尽的提纲!我想理解肯定比只要求代码行要好,但我才刚刚开始学习参数,所以我对这方面还是相当陌生的。我确实知道1和2,我想我理解4,但在解决这个问题之前,我也会阅读3。在4上寻找“移位”。但是,约翰·库格曼(John Kugelman)发布了一个比我想象的更有效的解决方案。我很可能是不正确的,但不是所有这些巴西主义(除了
$\code>)吗?我不确定他们会不会用老式的伯恩壳牌。谢谢你的提示!我一定错过了提到命令
$#
的那一节。。。对于这个问题,它似乎绝对有用!不过有一件事是——
的目的是什么在您的命令中
${!#}
?我在书中找不到任何关于感叹号的东西。(编辑:没关系,我刚注意到你在刷新时的解释!)@TimPote说得不错。我添加了一个与sh兼容的替代解决方案。我尝试使用与sh兼容的代码,我想我遇到了一个问题。在计算了9个以上的参数后,我收到一个奇怪的输出(例如,运行
myProgram q w r t y u I o p
outputs
q0
)。为什么会发生这种情况?我认为我在键入代码时没有犯任何错误。@user41419很好。要访问第10个参数,您不能执行
$10
,因为它被解释为
${1}0
。你必须写
${10}
。我已经编辑了我的答案,加入了花括号。
# Does not work
echo ${@[$#]}