Bash 变量字符替换最终为空字符串或命令无效

2024-01-18

我正在编写一个 shell 脚本,通过 JQ 从 JSON 文件中检索变量内容。 JSON 文件采用字符串格式(无论这是真实字符串还是数字),为了在 bash 脚本中检索变量,我做了类似的事情

my_domain=$(cat /vagrant/data_bags/config.json | jq ."app"[0]."domain")

上面的代码曾经回显“mydomain”的结果,并带有开头和结尾的引号。我认为这是 echo 命令的正常行为。但是,当将我的变量与另一个 shell 命令连接时,系统会引发错误。例如,以下命令

cp /vagrant/public_html/index.php "/var/www/"+$my_domain+"/index.php"

失败并出现以下错误

cp: cannot create regular file `/var/www/+"mydomain"+/index.php': No such file or directory

在这个阶段,我无法确定是我与加号进行了错误的连接,还是变量有效地包含了引号,无论如何最终都会生成错误。

我尝试替换变量中的引号,但最终系统出现“找不到命令”错误。

有人可以建议我做错了什么吗?


+不用于 bash(或 perl、php)中的字符串连接。只是:

cp /vagrant/public_html/index.php "/var/www/$my_domain/index.php"

在双引号文本字符串中嵌入变量称为插值法,这就是我们需要的原因之一$前缀,表明这是一个变量。特别是在单引号字符串内不进行插值。

Braces ${my_domain}不需要,因为/目录分隔符不是变量名中的有效字符,因此不会产生歧义。

例如:

var='thing'
echo "Give me your ${var}s"    # Correct, appends an 's' after 'thing'
echo "Give me your $vars"      # incorrect, looks for a variable called vars.

如果变量(如“vars”)不存在,那么(默认情况下)它不会抱怨,只会给出一个空字符串。 c-shell(csh 或 tcsh)中需要更多大括号(方括号),因为修改变量需要额外的语法,其中涉及特殊的尾随字符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 变量字符替换最终为空字符串或命令无效 的相关文章

随机推荐