我正在努力改进这个nasty old script。我发现了一个需要修复的未定义变量错误,所以我添加了set -u来捕获任何类似的错误。
由于以下代码,我得到了"$1“的未定义变量错误
if [ -z "$1" ]; then
process "$command"它只想知道是否有争论。(将空字符串作为第一个参数传递时的行为并不是故意的。如果我们碰巧也解决了这个问题,那就不成问题了)。
在使用set -u运行时,检查是否有参数的好方法是什么
如果我们将"$1“替换为"$@",上面的代码将无法工作,因为当有多个参数时,"$@”会以特殊的方式展开。
发布于 2017-04-30 22:54:55
$#包含参数的数量,因此您可以在访问$1、$2等之前测试它们是否存在。
if (( $# == 0 )); then
# no arguments
else
# have arguments
fi;发布于 2017-05-01 01:19:49
通过在参数扩展中设置默认值,可以忽略set -u导致的自动退出:
#!/bin/sh
set -u
if [ -z "${1-}" ] ; then
echo "\$1 not set or empty"
exit 1
fi
echo "$2" # this will crash if $2 is unset语法为${parameter-default},如果未设置命名参数,则会给出字符串default,否则会给出参数值。类似地,如果命名参数未设置或为空,${parameter:-default}将返回default。在上面,我们只使用了一个空默认值。(${1:-}在这里也是一样的,因为我们只需要将一个空值更改为一个空值。)
这是一个feature of the POSIX shell,也适用于其他变量,而不仅仅是位置参数。
如果要区分未设置的变量和空值,请使用${par+x}
if [ "${1+x}" != x ] ; then
echo "\$1 is not set"
fi发布于 2017-04-30 23:42:38
我个人最喜欢的:
if
(($#))
then
# We have at least one argument
fi或者:
if
((!$#))
then
# We have no argument
fihttps://stackoverflow.com/questions/43707685
复制相似问题