具体来说,我正在使用
$ bash --version
GNU bash, version 3.2.25(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
我正在阅读一些旧的bash代码,并且在字符串的显示和传递方式方面存在很多不一致。
据我所知,使用换行字符回显字符串而不包含引号将由bash处理:
newstr="Some
Dummy
String"
echo ${newstr}
echo "${newstr}"
# Returns
Some Dummy String
Some
Dummy
String
以下回显显示字符串的方法有什么区别?
#!/bin/bash
mystr="Some Generic String"
echo $mystr
echo ${mystr}
echo "$mystr"
echo "${mystr}"
echo $"$mystr"
echo $"${mystr}"
jobSecurityEcho()
{
echo $"$@"
}
jobSecurityEcho $mystr
jobSecurityEcho ${mystr}
jobSecurityEcho "$mystr"
jobSecurityEcho "${mystr}"
jobSecurityEcho $"$mystr"
jobSecurityEcho $"${mystr}"
jobSecurityEcho $(jobSecurityEcho ${mystr})
除了在没有引号的echo'd时解释的换行符,以上都是等价的吗?当我运行这个脚本时,我会打印出“Some Generic String”十三次。是否有理由以另一种方式做某种方式?我可以简化此操作,只需分别使用echo ${mystr}
和echo "${mystr}"
吗?
答案 0 :(得分:3)
您的问题似乎更多地是关于变量替换而不是关于字符串。请注意,与其他编程语言相比,Bash不需要引用字符串。引号和双引号用于影响标记化,替换和扩展。
要记住变量替换有两种最佳实践:
变量替换应该(几乎)总是双引号:
"$VARIABLE"
这确保即使变量的值中有空格字符,Bash也会将内容视为一个标记。如果不对变量进行双引号,那么它将包含您想要循环的标记。
包含多个变量的双引号字符串中的变量替换应该用大括号括起来:
"${VARIABLE}something/else"
最后但并非最不重要的是,特殊语法$"..."
会导致双引号部分被翻译。正如bash(1)
所述:
以美元符号开头的双引号字符串($"字符串")将会 导致根据当前语言环境翻译字符串。如果 当前区域设置为C或POSIX,忽略美元符号。如果 字符串被翻译和替换,替换是双引号。