重击,无争议警告和案件判决


110

我正在学习bash。

我想做一个简单的脚本,当没有给出参数时显示一些信息。当我根据数值给数字作为参数时,它会做一件事或另一件事。

我也想知道bash初学者最佳在线手册的建议

谢谢

Answers:


176
if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 0
fi

case "$1" in
    1) echo 'you gave 1' ;;
    *) echo 'you gave something else' ;;
esac

高级Bash脚本编程指南是相当不错的。尽管它的名字,它确实对待基础知识。


RE:“退出0”。我不知道退出脚本是否是他的想法。但是,是的,这是一个很好的指南。
Trampas Kirk,2010年

假设消息是一些帮助文本,我将“和”解释为“其他”。但是我确定Werner能够弄清楚那条线是做什么的以及他是否想要它:)
托马斯(Thomas)2010年

谢谢,当然!最后一件事,我该如何关闭脚本中的错误消息,使错误消息不显示在shell中?
在2010年

您的意思是从您正在调用的特定程序中出现错误?您可以放置> /dev/null和/或2> /dev/null之后将其标准输出和/或标准错误流发送到遗忘中。
Thomas

4
如果您认为缺少参数的情况不好(例如脚本,则无法成功执行),请返回非0(exit 1)的值。您可以在网上快速找到关于返回/退出代码的其他约定,但重要的一点是,它不应为0,这表示成功。
Felix '18

25

如果仅对缺少特定参数的情况感兴趣,则参数替换非常有用:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

11

 if [ -z "$*" ]; then echo "No args"; fi

结果

No args

细节

-z是字符串长度为零的一元运算符。 $*是所有争论。引号是为了安全起见,并且如果存在的话则封装多个参数。

使用man bash和搜索(/键)“一元”以获取更多此类操作符。


7
一个(次要)问题是,它不区分不传递参数和传递空字符串作为参数。在某些情况下,这可能很重要。使用[$#-eq 0]可以正确处理这两种情况。
Idelic

1
啊,(ba)sh编程的精妙之处...这就是为什么我讨厌它。
托马斯

1
被认为-z令人头晕的
Ray Foss

4

老了,但由于先前的困惑,我现在有理由重新设计答案:

if [[ $1 == "" ]] #Where "$1" is the positional argument you want to validate 

 then
 echo "something"
 exit 0

fi

如果没有位置参数$ 1,它将回显“ Something”。但是,它不会验证$ 1包含特定信息。


$#明确地是参数数量的整数;它可以是“ 0”,即使没有参数,您也将回显“ something”,或者它将是一些正数,并且您将正确回显“ something”。但是,支票本身永远不会做任何事情,无论您使用的是输入还是缺少输入,它都将始终报告$#包含值的报告。因此,这是完全错误的,并且永远不会像声称的那样起作用。
eschwartz

您对此表示完全肯定吗?我有几个使用此确切格式的脚本可以按预期工作。读完您的回复后,我什至重新测试了匹配与否。如果没有指定位置变量,则$#将不包含值(如果未指定)。为什么bash会在不存在的位置参数中假设一个值,这是没有道理的。
瑞安·史密斯

尝试echo $#为脚本/tmp/test.sh的内容,然后在/斌/运行bash作为您有可用以及/ bin / sh的(或/斌/破折号和任何其他shell的实现。/tmp/test.sh将回声“0” /bin/dash /tmp/test.sh另一方面,控制台/tmp/test.sh foo将回显“ 1”,/tmp/test.sh first second并将回显“ 2”
eschwartz

按照man bash,在“特殊参数”部分中,“外壳程序专门处理几个参数。只能引用这些参数;不允许对其进行赋值。”和“#扩展为十进制的位置参数数”。同样由POSIX强制要求,如pubs.opengroup.org/onlinepubs/9699919799/utilities/…中所述
eschwartz

抱歉,好像沟通不畅!我的意思是#作为特定位置参数(即$ 2,如果您要表示第二个参数)的占位符,而不是文字$#。在检查了您的上述内容之后,您绝对是正确的,文字$#将始终解析为参数数量。抱歉造成混乱。
瑞安·史密斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.