Bash Echo String $" $ value"与" $ value"方法$" $ {@}"

时间:2015-03-07 00:04:36

标签: string bash printing echo

具体来说,我正在使用

$ 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}"吗?

1 个答案:

答案 0 :(得分:3)

您的问题似乎更多地是关于变量替换而不是关于字符串。请注意,与其他编程语言相比,Bash不需要引用字符串。引号和双引号用于影响标记化,替换和扩展。

要记住变量替换有两种最佳实践:

  • 变量替换应该(几乎)总是双引号:

    "$VARIABLE"
    

    这确保即使变量的值中有空格字符,Bash也会将内容视为一个标记。如果对变量进行双引号,那么它将包含您想要循环的标记。

  • 包含多个变量的双引号字符串中的变量替换应该用大括号括起来:

    "${VARIABLE}something/else"
    

最后但并非最不重要的是,特殊语法$"..."会导致双引号部分被翻译。正如bash(1)所述:

  

以美元符号开头的双引号字符串($"字符串")将会   导致根据当前语言环境翻译字符串。如果   当前区域设置为C或POSIX,忽略美元符号。如果   字符串被翻译和替换,替换是双引号。