gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:03 25 4
gpt4 key购买 nike

这里有一系列情况,其中 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/56055144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com