【问题标题】:escape curly braces in unix shell script在 unix shell 脚本中转义大括号
【发布时间】:2013-10-17 23:25:12
【问题描述】:

我有一个字符串:

{2013/05/01},{2013/05/02},{2013/05/03}

我想在开头附加一个 { 并在最后附加一个 }。输出应该是:

{{2013/05/01},{2013/05/02},{2013/05/03}}

但是,在我的 shell 脚本中,当我将花括号连接到字符串的开头和结尾时,输出如下:

{2013/05/01} {2013/05/02} {2013/05/03}

为什么会这样?我怎样才能达到我的结果?我确信有一个简单的解决方案,但我是一个 unix 新手,因此希望能得到一些帮助。

测试脚本:

#!/usr/bin/ksh 
valid_data_range="{2013/05/01},{2013/05/02},{2013/05/03}"
finalDates="{"$valid_data_range"}"
print $finalDates

【问题讨论】:

    标签: shell unix character ksh reserved


    【解决方案1】:

    问题是,当您在引号外的大括号中有一个列表时,shell 会执行Brace Expansionbash 手册,但ksh 会类似)。由于“外部引号”位很重要,它还告诉您如何避免该问题 - 打印时将字符串括在引号中:

    #!/usr/bin/ksh 
    valid_data_range="{2013/05/01},{2013/05/02},{2013/05/03}"
    finalDates="{$valid_data_range}"
    print "$finalDates"
    

    print 命令特定于ksh,在bash 中不存在。分配行中的更改与其说是功能不如说是装饰性的。)

    另外,bash 中不会出现大括号扩展;它仅在直接编写大括号时发生。此双语脚本(kshbash):

    valid_data_range="{2013/05/01},{2013/05/02},{2013/05/03}"
    finalDates="{$valid_data_range}"
    printf "%s\n" "$finalDates"
    printf "%s\n" $finalDates
    

    产生:

    1. ksh

      {{2013/05/01},{2013/05/02},{2013/05/03}}
      {2013/05/01}
      {2013/05/02}
      {2013/05/03}
      
    2. bash(也叫zsh

      {{2013/05/01},{2013/05/02},{2013/05/03}}
      {{2013/05/01},{2013/05/02},{2013/05/03}}
      

    因此,当您需要使用变量$finalDates 时,请确保它在双引号内:

    other_command "$finalDates"
    if [ "$finalDates" = "$otherString" ]
    then : whatever
    else : something
    fi
    

    等等——使用你喜欢的布局来处理你不喜欢我的任何东西。

    【讨论】:

      【解决方案2】:

      你可以说:

      finalDates=$'{'"$valid_data_range"$'}'
      

      【讨论】:

      • 这本身不起作用;使用变量时必须防止扩展。换句话说,问题不在于分配;它是print 命令。
      • 感谢大家的意见。因此,如果我想使用分配的变量,例如,如果我想将最终字符串传递给一个函数或另一个将使用该变量的脚本(可能是 python 或 perl 脚本),我该怎么做?跨度>
      • 在您引用变量并且不希望发生大括号扩展的任何地方使用"$finalDates" 或它的变体(例如"${finalDates}")。
      【解决方案3】:

      问题是外壳正在执行大括号扩展。这允许您生成一系列相似的字符串:

      $ echo {a,b,c}
      a b c
      

      这不是很令人印象深刻,但考虑一下

      $ echo a{b,c,d}e
      abc ace ade
      

      为了抑制大括号展开,可以使用set命令暂时关闭

      $ set +B
      $ echo a{b,c,d}e
      a{b,c,d}e
      $ set -B
      $ echo a{b,c,d}e
      abe ace ade
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多