首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么bash -n和-z测试运算符不适用于$@

为什么bash -n和-z测试运算符不适用于$@
EN

Stack Overflow用户
提问于 2013-03-04 16:59:17
回答 2查看 17.9K关注 0票数 16
代码语言:javascript
运行
复制
function wtf() {
  echo "\$*='$*'"
  echo "\$@='$@'"
  echo "\$@='"$@"'"
  echo "\$@='""$@""'"
  if [ -n "$*" ]; then echo " [ -n \$* ]"; else echo "![ -n \$* ]"; fi
  if [ -z "$*" ]; then echo " [ -z \$* ]"; else echo "![ -z \$* ]"; fi
  if [ -n "$@" ]; then echo " [ -n \$@ ]"; else echo "![ -n \$@ ]"; fi
  if [ -z "$@" ]; then echo " [ -z \$@ ]"; else echo "![ -z \$@ ]"; fi
}

wtf

产生

$*=‘$$=’$‘$=’$$=‘-n $@

虽然在我看来,[-n $@]应该是假的,因为7.3其他比较运算符表示[ -n "$X" ]应该是所有$X[ -z "$X" ]的反义词。

-z 字符串为空,即为零长度。 字符串=‘’#零长度("null")字符串变量。如果-z "$String“,那么回显"\$String为null”。否则回显"\$String不为空“。fi # $String为空。 -n 字符串不是空的。 -n测试要求在测试括号中引用字符串。在! -z中使用未引用的字符串,甚至仅在测试括号内使用未引用的字符串(参见示例7-6)通常有效,但这是一种不安全的做法。总是引用测试过的字符串。1

我知道$@是特殊的,但我不知道它有足够的特殊性来违反布尔否定。这里发生了什么事?

代码语言:javascript
运行
复制
$ bash -version | head -1
GNU bash, version 4.2.42(2)-release (i386-apple-darwin12.2.0)

实际的数字退出代码都是10

代码语言:javascript
运行
复制
$ [ -n "$@" ]; echo "$?"
0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-04 17:05:47

$@为空时,"$@"不会展开为空字符串;它将被完全删除。所以你的测试不是

代码语言:javascript
运行
复制
[ -n "" ]

但更确切地说

代码语言:javascript
运行
复制
[ -n ]

现在,-n不是一个运算符,而是一个非空字符串,它总是测试为true。

票数 18
EN

Stack Overflow用户

发布于 2013-03-05 08:22:26

"$@"不做你想做的事。它不是一种不同形式的"$*",它扩展到引用的传递给当前脚本的参数列表。

如果没有争论,它就会扩大到一无所有。如果有两个参数ab c,则扩展到"a" "b c" (即在参数中保留空格),"$*"扩展到"a b c"$*扩展到a b c (三个单词)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15206840

复制
相关文章

相似问题

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