2013-10-10 180 views
4

大括号我有一个字符串:逃避UNIX shell脚本

{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 

回答

1

你可以说:

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

这在它自己不起作用;使用变量时必须防止扩展。换句话说,问题不在于任务。这是'print'命令。 –

+0

感谢大家的意见。因此,如果我想使用赋值变量,例如,如果我想将最终字符串传递给函数或将使用此变量的其他脚本(可能是python或perl脚本),那么我该怎么做? – axm2064

+0

在引用变量的任何位置使用''$ finalDates''或其变体(例如''{$ finalDates}''),并且不希望大括号扩展发生。 –

2

的问题是,外壳执行括号扩展。这可以让你产生了一系列类似的字符串:

$ 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 
2

的问题是,当你有一个括号列表之外的报价,外壳进行Brace Expansionbash人ual,但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 

等 - 用你喜欢的布局,无论你不喜欢我的。