2013-10-10 5 views
4

У меня есть строка:избежать фигурные скобки в UNIX сценарий оболочки

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

Я хочу добавить а {в начале и} в конце. Вывод должен быть:

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

Однако, в моем сценарии оболочки, когда я сцепить фигурные скобки в начале и в конце строки, вывод заключается в следующем:

{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 Expansion (bash человек 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; это происходит только тогда, когда фигурные скобки записываются напрямую.Этот двуязычный скрипт (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 

производит:

  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 

Etc - используя свой предпочтительный макет для любой вам не нравится моя.

Смежные вопросы