Linux 加入“的理由_&引用;在“if比较”中;如果[“str”=“str”];然后“金融机构”;

Linux 加入“的理由_&引用;在“if比较”中;如果[“str”=“str”];然后“金融机构”;,linux,bash,shell,sh,Linux,Bash,Shell,Sh,我在shell脚本中多次看到它们在if比较中使用“\u”,如下所示: if [ "_$str" = "_" ]; then ....; fi 上面的代码检查str变量是否为空,比较if[“\u$str”=“\u”] 如果[“$str”=”],为什么不使用?为什么要在两个字符串中都添加“quot?据我所知,这是出于历史原因。曾经有(也许在一些模糊的系统上仍然有)shell在处理空字符串(可能是以破折号开头的字符串)时有问题。因此,一个简单的想法是通过添加前缀来防止空字符串(以及类似选项的字符串)

我在shell脚本中多次看到它们在if比较中使用
“\u”
,如下所示:

if [ "_$str" = "_" ]; then ....; fi
上面的代码检查str变量是否为空,比较
if[“\u$str”=“\u”]


如果[“$str”=”],为什么不使用
?为什么要在两个字符串中都添加
“quot

据我所知,这是出于历史原因。曾经有(也许在一些模糊的系统上仍然有)shell在处理空字符串(可能是以破折号开头的字符串)时有问题。因此,一个简单的想法是通过添加前缀来防止空字符串(以及类似选项的字符串)。现在所有常见的外壳都不再有这些问题。

据我所知,这是出于历史原因。曾经有(也许在一些模糊的系统上仍然有)shell在处理空字符串(可能是以破折号开头的字符串)时有问题。因此,一个简单的想法是通过添加前缀来防止空字符串(以及类似选项的字符串)。现在所有常见的shell都不再存在这些问题。

我只能猜测,在学习如何正确使用引号之前,您所看到的脚本的编写者遇到了类似的问题

if [[ $str = "" ]]; then ....
如果$str为空,则会失败,因为参数扩展为零。鉴于

if [[ _$str = _ ]]

会有用,但这是一个难题。

我只能猜测,在学习如何正确使用引号之前,你所看到的脚本的作者遇到了类似的问题

if [[ $str = "" ]]; then ....
如果$str为空,则会失败,因为参数扩展为零。鉴于

if [[ _$str = _ ]]

将起作用,但这是一个难题。

请记住,
[
是命令
test
的别名。问题是,如果字符串以破折号开头,会发生什么

在旧版本的
test
中,当使用标准Bourne shell时,会出现以下错误:

$ test -gt = "some_string"
invalid argument
如果

$ string="-gt"
$ if [ "$string" = "some_other_string" ]
> then
> echo "Match"
> else
> echo "No Match"
> fi
if: invalid argument
这是因为
test
命令会看到带破折号的参数,并假设它是一个命令参数,那么要么它是一个无效的命令参数,要么命令的格式不正确。如果使用
[[
而不是
[
,这根本不是问题,因为
[[
是针对
if
的内置测试

这不再是一个问题。
[
test
是Kornshell和BASH的内部命令,这些shell可以处理此问题。即使是较新版本的test也不再抛出:

$ test -gt = "some_string"  # No error.
$ echo $?
1
然而,旧的脚本,以及那些要么从旧的计时器学习,要么在使用Xenix的16 Mhz 386芯片上运行32 Mb内存的系统是最先进的系统时重新编写脚本的人已经养成了习惯

if [ x$var = x$foo ]

请记住,
[
是命令
test
的别名。问题是,如果字符串以破折号开头,会发生什么情况

在旧版本的
test
中,当使用标准Bourne shell时,会出现以下错误:

$ test -gt = "some_string"
invalid argument
如果

$ string="-gt"
$ if [ "$string" = "some_other_string" ]
> then
> echo "Match"
> else
> echo "No Match"
> fi
if: invalid argument
这是因为
test
命令会看到带破折号的参数,并假设它是一个命令参数,那么要么它是一个无效的命令参数,要么命令的格式不正确。如果使用
[[
而不是
[
,这根本不是问题,因为
[[
是针对
if
的内置测试

这不再是一个问题。
[
test
是Kornshell和BASH的内部命令,这些shell可以处理此问题。即使是较新版本的test也不再抛出:

$ test -gt = "some_string"  # No error.
$ echo $?
1
然而,旧的脚本,以及那些要么从旧的计时器学习,要么在使用Xenix的16 Mhz 386芯片上运行32 Mb内存的系统是最先进的系统时重新编写脚本的人已经养成了习惯

if [ x$var = x$foo ]

这似乎是一种跳过空字符串比较的好方法。在两个字符串中添加一个字符可以避免边缘大小写并保留结果。只需使用
[-z“${str}”]
。@devnull的可能重复有趣的是,该命令将在受影响的shell中间接成功。如果
$str
为空,则扩展将被错误删除,留下
[-z]
。但是,这可能被视为非空字符串(而不是运算符
-z
),它的计算结果无论如何都是真的。它的可能重复项似乎是跳过空字符串比较的好方法。在两个字符串中添加一个字符可以避免边缘大小写并保留结果。只需使用
[-z“${str}”]
。@devnull的可能重复有趣的是,该命令将在受影响的shell中间接成功。如果
$str
为空,则扩展将被错误删除,留下
[-z]
。但是,这可能被视为非空字符串(而不是运算符
-z
),不管怎样,这都是正确的。可能的重复是我在1992年左右第一次看到这个时听到的原因。所以今天可能是因为古代或史前的原因。这是我在1992年左右第一次看到这个时听到的原因。所以今天可能是因为古代或史前的原因。这个问题出现在
[[…]
bash
中的表达式(它可以很好地处理空值参数的扩展),事实上是旧Bourne shell中的
test
命令在处理引用的空值参数时的一个真正的错误。这个问题早于
bash
中的
[…]
表达式(它可以很好地处理空值参数的扩展),事实上,在旧Bourne shell中的
test
命令处理引用的空值参数时,它是一个真正的bug。+1用于提示参数问题