Bash 回显字符串 $"$value" 对比 "$value" 对比方法 $"${@}"
Bash Echo String $"$value" versus "$value" versus in method $"${@}"
具体来说,我正在使用
$ 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})
除了在不带引号的情况下回显时被解释的换行符之外,上面所有的都是等价的吗?当我 运行 这个脚本时,我得到 "Some Generic String" 打印了十三次。有理由用一种方式代替另一种方式吗?我可以将其简化为分别使用 echo ${mystr}
和 echo "${mystr}"
吗?
您的问题似乎更多地是关于变量替换而不是字符串。请注意,与其他编程语言相比,Bash 不需要引用字符串。引号和双引号用于影响标记化、替换和扩展。
变量替换有两个最佳实践要记住:
变量替换应该(几乎)总是用双引号引起来:
"$VARIABLE"
这确保 Bash 将内容视为一个标记,即使变量值中有空白字符也是如此。如果变量包含要循环的标记,则 not 双引号变量的示例。
双引号字符串中的变量替换不仅包含变量,还应括在花括号中:
"${VARIABLE}something/else"
最后但同样重要的是,特殊语法 $"..."
导致双引号部分被翻译。正如 bash(1)
所述:
A double-quoted string preceded by a dollar sign ($"string") will
cause the string to be translated according to the current locale. If
the current locale is C or POSIX, the dollar sign is ignored. If the
string is translated and replaced, the replacement is double-quoted.
具体来说,我正在使用
$ 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})
除了在不带引号的情况下回显时被解释的换行符之外,上面所有的都是等价的吗?当我 运行 这个脚本时,我得到 "Some Generic String" 打印了十三次。有理由用一种方式代替另一种方式吗?我可以将其简化为分别使用 echo ${mystr}
和 echo "${mystr}"
吗?
您的问题似乎更多地是关于变量替换而不是字符串。请注意,与其他编程语言相比,Bash 不需要引用字符串。引号和双引号用于影响标记化、替换和扩展。
变量替换有两个最佳实践要记住:
变量替换应该(几乎)总是用双引号引起来:
"$VARIABLE"
这确保 Bash 将内容视为一个标记,即使变量值中有空白字符也是如此。如果变量包含要循环的标记,则 not 双引号变量的示例。
双引号字符串中的变量替换不仅包含变量,还应括在花括号中:
"${VARIABLE}something/else"
最后但同样重要的是,特殊语法 $"..."
导致双引号部分被翻译。正如 bash(1)
所述:
A double-quoted string preceded by a dollar sign ($"string") will cause the string to be translated according to the current locale. If the current locale is C or POSIX, the dollar sign is ignored. If the string is translated and replaced, the replacement is double-quoted.