在unix shell脚本中转​​义花括号

axm*_*064 7 unix shell ksh character reserved

我有一个字符串:

{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
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 5

问题是,当您在引号外的大括号中有一个列表时,shell 会执行大括号扩展bash手动,但ksh会类似)。由于“外部引号”位很重要,它还告诉您如何避免打印时出现 \xe2\x80\x94 将字符串括在引号中的问题:

\n\n
#!/usr/bin/ksh \nvalid_data_range="{2013/05/01},{2013/05/02},{2013/05/03}"\nfinalDates="{$valid_data_range}"\nprint "$finalDates"\n
Run Code Online (Sandbox Code Playgroud)\n\n

(该print命令特定于ksh,并且不存在于 中bash。分配行中的更改更多是装饰性的,而不是功能性的。)

\n\n

此外,大括号扩展不会发生在bash;中。仅当直接写入大括号时才会出现这种情况。这个双语脚本(kshbash):

\n\n
valid_data_range="{2013/05/01},{2013/05/02},{2013/05/03}"\nfinalDates="{$valid_data_range}"\nprintf "%s\\n" "$finalDates"\nprintf "%s\\n" $finalDates\n
Run Code Online (Sandbox Code Playgroud)\n\n

产生:

\n\n
    \n
  1. ksh

    \n\n
    {{2013/05/01},{2013/05/02},{2013/05/03}}\n{2013/05/01}\n{2013/05/02}\n{2013/05/03}\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. bash(还zsh

    \n\n
    {{2013/05/01},{2013/05/02},{2013/05/03}}\n{{2013/05/01},{2013/05/02},{2013/05/03}}\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
\n\n

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

\n\n
other_command "$finalDates"\nif [ "$finalDates" = "$otherString" ]\nthen : whatever\nelse : something\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n

等等 \xe2\x80\x94 使用你喜欢的布局来处理你不喜欢我的布局。

\n


dev*_*ull 4

你可以说:

finalDates=$'{'"$valid_data_range"$'}'
Run Code Online (Sandbox Code Playgroud)