简单的条件在bash中意外失败,如果语句
问题描述:
我花了一段令人尴尬的漫长时间试图理解为什么下面的“foo”脚本中的第二个条件失败,但第一个条件成功。简单的条件在bash中意外失败,如果语句
请注意:
- 当前目录包含两个文件:酒吧和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
>
答
引用变量呼应时。
echo -n "$s3" | hexdump -C
你会看到文件名之间的换行符,作为ls
使用-1
当输出重定向。
答
你的演示将更有说服力与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
$
但是,请注意's3 = \'ls \''不是将文件名列表读入变量的方式。阅读[为什么你不应该解析ls(1)]的输出(http://mywiki.wooledge.org/ParsingLs),然后再根据你的实验开始编写任何实际的代码。 – chepner
欢迎来到Stack Overflow。 请注意,在这里说'谢谢'的首选方式是通过 提高投票的好问题和有用的答案(一旦你有足够的声誉这样做),并接受任何 问题最有用的答案,你问(这也给你一个小小的提升,以你的声望 )。 请参阅[关于]页面,以及[如何在此处提问 ?]和 [当有人回答我的 问题时,我该怎么办? ?](http://stackoverflow.com/help/someone-answers) –