使用字符 *、单引号和 $ 定义字符串

使用字符 *、单引号和 $ 定义字符串

我创建了来自另一个“主”脚本的 bash 脚本,以设置主脚本所需的变量。这些变量需要能够包含任何字符并且不让 shell 解释它们。例如:

  • 单引号:'
  • 美元符号:$
  • 星号:*
  • 井号:#等

所以,我的想法是使用单引号并转义任何封闭的单引号和#字符。但是,unexpected EOF while looking for matching下面的两个文件出现错误。

问题:

  1. 定义可以包含任何需要最少调整的字符集的字符串的最佳方法是什么?

    有数千个这样的foo.sh文件,并且当从另一个源提取字符串时,我希望最大限度地减少需要转义的特殊字符的数量。

  2. 我还需要逃脱哪些其他角色。

以下脚本所需的输出是

\MyMacro{*,Baker's Dozen,$x^$,#}

平台:

  • 苹果系统 10.9.5

子外壳:foo.sh

set -f
string_list='*,Baker\'s Dozen,$x^$,\#'
set +f

主外壳:main.sh

source foo.sh
printf "%s{%s}" "\MyMacro" "${string_list}"

答案1

您不必#在引号内转义,并且在单引号内包含文字单引号很奇怪:

string_list='*,Baker'\''s Dozen,$x^$,#'

但用双引号更容易。所以像这样:

string_list="*,Baker's Dozen,\$x^\$,#"

将工作。

您只需要"\""双引号,而不是''\'''单引号,并且还需要转义$以防止变量扩展。

如果您想最大程度地减少转义,请将任何'内部单引号更改为'"'"'

string_list='*,Baker'"'"'s Dozen,$x^$,#'

答案2

您可以通过使用类似以下内容来避免任何转义,但会增加一点开销:

string_list=$(cat <<\!eof!
*,Baker's Dozen,$x^$,#
!eof!
)

你可以在其中 cat stdin 这是一个here-is文档,不会对其进行任何处理。字符串中甚至可以有反斜杠、单引号和双引号、空格和多行。为了提高效率,你可以使用这个:

read string_list <<\!eof!
*,Baker's Dozen,$x^$,#
!eof!

但您将丢失所有初始空格和反斜杠。

相关内容