bash if语句中的简单条件意外失败

时间:2017-06-01 22:19:08

标签: bash

我花了很长时间试图理解为什么下面的“foo”脚本中的第二个条件失败但第一个成功。

请注意:

  • 当前目录包含两个文件:bar和foo。
  • 根据hexdump,所有三个字符串$ s1,$ s2和$ s3相等。

提前感谢您的帮助。

会话:(在Centos7主机上运行):

>ls
bar  foo
>cat foo
#!/bin/bash

s1="bar foo"
s2="bar foo"
s3=`ls`

echo -n $s1 | hexdump -C
echo -n $s2 | hexdump -C
echo -n $s3 | hexdump -C

if [ "$s1" = "$s2" ]; then  # True
    echo s1 = s2
fi

if [ "$s1" = "$s3" ]; then  # NOT true! Why?
    echo s1 = s3
fi

>foo
00000000  62 61 72 20 66 6f 6f                              |bar foo|
00000007
00000000  62 61 72 20 66 6f 6f                              |bar foo|
00000007
00000000  62 61 72 20 66 6f 6f                              |bar foo|
00000007
s1 = s2
>

2 个答案:

答案 0 :(得分:4)

在回显时引用变量。

echo -n "$s3" | hexdump -C

您会在文件名之间看到换行符,因为ls在重定向输出时会使用-1

答案 1 :(得分:2)

您的演示会更加令人信服echo -n "$s1"等。这会显示s3中间有一个换行符s1中有s2的空格echo。没有双引号的#!/bin/bash s1="bar foo" s2="bar foo" s3=`ls` echo -n "$s1" | hexdump -C echo -n "$s2" | hexdump -C echo -n "$s3" | hexdump -C if [ "$s1" = "$s2" ]; then # True echo s1 = s2 fi if [ "$s1" = "$s3" ]; then # NOT true because s3 contains a newline! echo s1 = s3 fi 会将换行符转换为空格(通常将字符串中的一个或多个空格字符的每个序列转换为单个空格)。

假设:

$ sh foo
00000000  2d 6e 20 62 61 72 20 66  6f 6f 0a                 |-n bar foo.|
0000000b
00000000  2d 6e 20 62 61 72 20 66  6f 6f 0a                 |-n bar foo.|
0000000b
00000000  2d 6e 20 62 61 72 0a 66  6f 6f 0a                 |-n bar.foo.|
0000000b
s1 = s2
$ bash foo
00000000  62 61 72 20 66 6f 6f                              |bar foo|
00000007
00000000  62 61 72 20 66 6f 6f                              |bar foo|
00000007
00000000  62 61 72 0a 66 6f 6f                              |bar.foo|
00000007
s1 = s2
$

我明白了:

a