我有一个字符串:
{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
答案 0 :(得分:2)
问题是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
答案 1 :(得分:2)
问题是当你在引号外的大括号中有一个列表时,shell会执行Brace Expansion(bash
手册,但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
中不会出现大括号扩展;它只发生在直接书写大括号时。这个双语脚本(ksh
和bash
):
valid_data_range="{2013/05/01},{2013/05/02},{2013/05/03}"
finalDates="{$valid_data_range}"
printf "%s\n" "$finalDates"
printf "%s\n" $finalDates
产生
ksh
{{2013/05/01},{2013/05/02},{2013/05/03}}
{2013/05/01}
{2013/05/02}
{2013/05/03}
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 :(得分:1)
你可以说:
finalDates=$'{'"$valid_data_range"$'}'