bash - 我刚刚分配了一个变量,但 echo $variable 显示了其他内容

标签 bash shell sh quoting

这里有一系列情况,其中 echo $var 可以显示与刚刚分配的值不同的值。无论分配的值是“双引号”、“单引号”还是未引号,都会发生这种情况。

如何让 shell 正确设置我的变量?

星号

预期的输出是/* Foobar is free software */,但我得到的是文件名列表:

$ var="/* Foobar is free software */"
$ echo $var 
/bin /boot /dev /etc /home /initrd.img /lib /lib64 /media /mnt /opt /proc ...

方括号

期望值是[a-z],但有时我得到的是一个字母!

$ var=[a-z]
$ echo $var
c

换行(换行)

预期值是一列单独的行,但所有值都在一行上!

$ cat file
foo
bar
baz

$ var=$(cat file)
$ echo $var
foo bar baz

多个空格

我希望表格标题仔细对齐,但多个空格要么消失,要么折叠成一个!

$ var="       title     |    count"
$ echo $var
title | count

标签

我期望有两个制表符分隔的值,但我得到的却是两个空格分隔的值!

$ var=$'key\tvalue'
$ echo $var
key value

最佳答案

在上述所有情况下,变量设置正确,但读取不正确!正确的方法是引用时使用双引号:

echo "$var"

这给出了所有给定示例中的期望值。始终引用变量引用!


为什么?

当变量未被引用时,它将:

  1. 接受 field splitting其中值在空格上拆分为多个单词(默认情况下):

    之前:/* Foobar 是免费软件*/

    之后:/*Foobar免费软件 , */

  2. 这些词中的每一个都将经历 pathname expansion ,其中模式被扩展为匹配文件:

    之前:/*

    之后:/bin/boot/dev/etc/home , ...

  3. 最后,所有参数都传递给 echo,echo 将它们写出 separated by single spaces , 给予

    /bin /boot /dev /etc /home Foobar is free software Desktop/ Downloads/
    

    而不是变量的值。

当变量被引用时,它将:

  1. 替换它的值。
  2. 没有第 2 步。

这就是为什么您应该始终引用所有变量引用,除非您特别需要分词和路径名扩展。 shellcheck 等工具在那里提供帮助,并会在上述所有情况下警告遗漏引号。

关于bash - 我刚刚分配了一个变量,但 echo $variable 显示了其他内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33709774/

相关文章:

linux - 更改以编程方式调用 bash 的当前工作目录

linux - 为什么 "find . -print0 | xargs -r0 du -chx"和 "du -chx"结果不同?

java - 将 PEM 证书解析为 JSON

bash - 如何为 Docker 命令编写参数化 Bash 别名

linux - 如何在 Linux shell 中根据第一个字符分割文件

linux - exit 命令在 bash 中不起作用

Linux 如何从父目录执行 bash 脚本?

iOS 使用 FFmpeg+libx264 构建 PJSIP

shell - 如何在没有 readlink 或 realpath 的情况下递归解析符号链接(symbolic link)?

bash - 在 cat 命令中转义 Unix 中的美元符号