首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >‘`set -u` (nounset) vs检查我是否有参数

‘`set -u` (nounset) vs检查我是否有参数
EN

Stack Overflow用户
提问于 2017-04-30 22:49:31
回答 5查看 7.7K关注 0票数 8

我正在努力改进这个nasty old script。我发现了一个需要修复的未定义变量错误,所以我添加了set -u来捕获任何类似的错误。

由于以下代码,我得到了"$1“的未定义变量错误

代码语言:javascript
运行
复制
if [ -z "$1" ]; then
     process "$command"

它只想知道是否有争论。(将空字符串作为第一个参数传递时的行为并不是故意的。如果我们碰巧也解决了这个问题,那就不成问题了)。

在使用set -u运行时,检查是否有参数的好方法是什么

如果我们将"$1“替换为"$@",上面的代码将无法工作,因为当有多个参数时,"$@”会以特殊的方式展开。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-04-30 22:54:55

$#包含参数的数量,因此您可以在访问$1$2等之前测试它们是否存在。

代码语言:javascript
运行
复制
if (( $# == 0 )); then
    # no arguments
else
    # have arguments
fi;
票数 13
EN

Stack Overflow用户

发布于 2017-05-01 01:19:49

通过在参数扩展中设置默认值,可以忽略set -u导致的自动退出:

代码语言:javascript
运行
复制
#!/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}

代码语言:javascript
运行
复制
if [ "${1+x}" != x ] ; then
    echo "\$1 is not set"
fi
票数 13
EN

Stack Overflow用户

发布于 2017-04-30 23:42:38

我个人最喜欢的:

代码语言:javascript
运行
复制
if
  (($#))
then
  # We have at least one argument
fi

或者:

代码语言:javascript
运行
复制
if
  ((!$#))
then
  # We have no argument
fi
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43707685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档