参数替换和错误消息:抑制行号等

参数替换和错误消息:抑制行号等

这是我的示例文件:

!/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提前做好准备。

相关内容