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.