繁体   English   中英

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

[英]escape curly braces in unix shell script

我有一个字符串:

{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正在执行大括号扩展。 这允许您生成一系列类似的字符串:

$ 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

问题是当你在引号外的大括号中有一个列表时,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

等等 - 使用您喜欢的布局,无论您对我的不喜欢什么。

你可以说:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM