这是我的示例文件:
!/bin/bash
# argument-one
# Is first argument missing?
# First method
[[ "$1" == "" ]] && echo "Usage: $(basename $0) filename"; exit 1
# Second method
# filename=${1?"Usage: $(basename $0) filename"}
在上面的脚本中,我收到一条“干净”的消息
Usage: argument-one filename
当我不带参数运行上面的脚本时;并且它干净地退出。
但是,如果我注释掉第 7 行并取消注释第 10 行,则程序退出时会收到此错误消息:
./argument-one: line 10: 5: Usage: argument-one filename
此消息表明程序出现问题导致其退出,而实际上,它实际上是不带参数的调用,这是一个使用问题。
但第 10 行更可取,因为它更简洁,并且还分配了一个变量(如果可用)。
我的问题是:“如何仅保留消息部分并过滤或禁用./argument-one: line 10: 5:
使用消息部分?
谢谢。
答案1
您可以使用$#
特殊变量来测试给定命令的参数数量:
usage() {
echo "Usage: $0 arg"
exit 1
}
if [[ "$#" -eq 0 ]]; then
usage
fi
echo "called with $1"
exit 0
执行时,该脚本给出:
$ ./foo.sh
Usage: ./foo.sh arg
$ ./foo.sh bar
called with bar
答案2
您可以使用参数替换来进行分配,但捕获错误并更改它:
filename=$((printf "${1:?}") 2>/dev/null || { echo "Usage $(basename $0) filename"; exit 1; })
(printf
可以echo
用于更少的字符,但需要额外的叉子)。请注意,printf/echo 位于其自己的子 shell 中,并且实际上是通过管道传输到 /dev/null 的子 shell 的 stderr。
或者,您可以仅测试使用参数替换分配后的变量是否已设置且非空白,然后打印您的使用字符串并手动退出(一行一行):
[ -z "${filename:=$1}" ] && { echo "Usage $(basename $0) filename"; exit 1; }
我倾向于选择第二个选项,因为它的字符更少,更明显/直接,并且返工更少。一个缺点是,如果文件名已在您的环境中设置,则不会使用 $1 。如果您担心这一点,请unset filename
提前做好准备。