bash - 查看 bash 变量的确切内容? (hexdump 没有帮助)

标签 bash hex quoting

所以我在下面遇到了一个问题,但我的问题更笼统——如何查看 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

或者它看起来像一个错误?我可以重复这个问题:

$ 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

最佳答案

检查变量内容的最佳方式是使用declare -p:

$ c="1 2"
$ declare -p c
declare -- c="1 2"

请注意,您的测试是错误的,因为您在变量扩展中遗漏了引号!

看:

$ 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

您必须引用每个变量扩展,除非您真的想对它们应用分词和路径名扩展!(通常,您当然不希望这种情况发生)。 p>

即使使用 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

您遇到的正是这样:

$ 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!

有时 declare -p 不会正确显示空格。在这种情况下,您可以像这样使用 printf:

$ c=$'    \n'
$ declare -p c
declare -- c="    
"
$ # there are spaces, but you can't see them
$ printf '%q\n' "$c"
$'    \n'

声明策略也很好,因为您也可以检查数组和函数:

$ 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

您还可以访问变量的标志:

$ declare -litux hello=world
$ declare -p hello
declare -itx hello="0"
$ # Have fun!

关于bash - 查看 bash 变量的确切内容? (hexdump 没有帮助),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41409437/

相关文章:

c - 警告 : format string contains '\0' within the string body [-Wformat]

Bash 忽略我的条件 : if [[ $variable < 10 ]]

python - 使用 subprocess.Popen 执行 bash

python - Swift 中的十六进制/二进制字符串转换

sql - Amazon Redshift 中的十六进制字符串到整数转换

c# - 反向或算法?

php - 无法使用 MSSQL 在 PDO 中引用表名

Linux Bash - 日期格式

linux - 有人可以解释这是做什么的吗? (恶意)

Pandas 导出 to_csv() 在列名周围加上引号