所以下面我有一个问题,但我的问题更通用 - 如何查看bash变量引用的内存的确切内容,以了解它们不匹配的原因:
# [[ $c1 == $c ]] || echo nope
nope
# [[ $c1 == "bkup dt" ]] || echo nope
# [[ $c == "bkup dt" ]] || echo nope
nope
# hexdump -C <<<$c
00000000 62 6b 75 70 20 64 74 0a |bkup dt.|
00000008
# hexdump -C <<<$c1
00000000 62 6b 75 70 20 64 74 0a |bkup dt.|
00000008
# [ "$c1" = "$c" ] || echo nope
nope
# [ ! "$c1" = "$c" ] || echo nope
Run Code Online (Sandbox Code Playgroud)
或者它看起来像一个错误?我可以重复这个问题:
$ cd /tmp
$ mkdir aaa
$ echo 2 > aaa/1
$ echo 2 > aaa/2
$ c=$(ls -A aaa)
$ [[ $c == $(echo $c) ]] || echo not equal
not equal
$ hexdump -C <<<$c
00000000 31 20 32 0a |1 2.|
00000004
$ hexdump -C <<<$(echo $c)
00000000 31 20 32 0a |1 2.|
00000004
$ c1="1 2"
$ [[ $c1 == $(echo $c1) ]] || echo not equal
$ [[ $c1 == $(echo $c) ]] || echo not equal
$ [[ $c1 == $c ]] || echo not equal
not equal
Run Code Online (Sandbox Code Playgroud)
gni*_*urf 10
检查变量内容的最好方法是使用declare -p:
$ c="1 2"
$ declare -p c
declare -- c="1 2"
Run Code Online (Sandbox Code Playgroud)
请注意,您的测试是错误的,因为您在变量扩展中遗漏了引号!
看:
$ c="1 2" # with two spaces
$ declare -p c
declare -- c="1 2"
$ echo $c
1 2
$ echo "$c"
1 2
$ d=$(echo $c)
$ declare -p d
1 2
Run Code Online (Sandbox Code Playgroud)
您必须引用每个变量扩展,除非您真的想要应用单词拆分和路径名扩展!(通常,你当然不希望这种情况发生).
即使你的hexdump策略,你需要报价:
$ c="1 2" # two spaces
$ hexdump <<< $c
00000000 31 20 32 0a |1 2.|
00000004
$ hexdump <<< "$c"
00000000 31 20 20 32 0a |1 2.|
00000005
Run Code Online (Sandbox Code Playgroud)
你正在经历的是这样的:
$ mkdir aaa; touch aaa/{1,2}
$ c=$(ls -A aaa)
$ declare -p c
declare -- c="1
2"
$ # see? there's a new line between the files.
$ echo $c
1 2
$ echo "$c"
1
2
$ # Use quotes!
Run Code Online (Sandbox Code Playgroud)
有时declare -p不会很好地显示空间.在这种情况下,您可以这样使用printf:
$ c=$' \n'
$ declare -p c
declare -- c="
"
$ # there are spaces, but you can't see them
$ printf '%q\n' "$c"
$' \n'
Run Code Online (Sandbox Code Playgroud)
声明策略也很好,因为您也可以检查数组和函数:
$ a=( one two "three four" )
$ declare -p a
declare -a a='([0]="one" [1]="two" [2]="three four")'
$ declare -A h=( [one]=1 [two]=2 )
$ declare -p h
declare -A h='([one]="1" [two]="2" )'
$ f() { echo hello; } > somewhere > >(over the rainbow)
$ declare -pf f
f ()
{
echo hello
} > somewhere 2> >(over the rainbow)
$ # You need also the -f switch to target functions
Run Code Online (Sandbox Code Playgroud)
您还可以访问变量的标志:
$ declare -litux hello=world
$ declare -p hello
declare -itx hello="0"
$ # Have fun!
Run Code Online (Sandbox Code Playgroud)