подстановка переменных удаление кавычек

Кажется, у меня есть некоторые трудности с получением того, что я хочу, на работу. По сути, у меня есть ряд переменных, которым присваиваются строки с некоторыми кавычками и символами \. Я хочу удалить кавычки, чтобы встроить их в документ json, поскольку json ненавидит кавычки с использованием методов дампа python.

Я подумал, что это будет легко. Просто определите, как легко удалить символы, а затем напишите простой цикл for для подстановки переменных, ну, это не сработало.

Вот что я хочу сделать.

Существует переменная с именем «MESSAGE23», она содержит следующий «com.centrify.tokend.cac», я хочу убрать кавычки, что для меня легко, простой echo $opt | sed "s/\"//g". Когда я делаю это из командной строки:

$> MESSAGE23="com."apple".cacng.tokend is present"
$> MESSAGE23=`echo $MESSAGE23 | sed "s/\"//g"`
$> com.apple.cacng.tokend is present

Это работает. Я получаю правильно отформатированную строку.

Когда я затем пытаюсь бросить это в цикл, весь ад вырывается на свободу.

for i to {1..25}; do
   MESSAGE$i=`echo $MESSAGE$i | sed "s/\"//g"`
done

Это не работает (либо выбрасывает кучу индексов, либо ничего), и я почти уверен, что просто недостаточно знаю о arg или eval или других переменных подстановки bash.

Но в основном я хочу сделать это для другого набора переменных с теми же проблемами, где я удаляю кавычки и, кстати, "\".

Любая помощь будет принята с благодарностью.


person HM Stanley    schedule 28.03.2013    source источник


Ответы (2)


Вы не можете этого сделать. Вы могли бы заставить это работать, используя eval, но это вводит другой уровень цитирования, о котором вам нужно беспокоиться. Есть ли причина, по которой вы не можете использовать массив?

MESSAGE=("this is MESSAGE[0]" "this is MESSAGE[1]")
MESSAGE[2]="I can add more, too!"
for (( i=0; i<${#MESSAGE[@]}; ++i )); do
   echo "${MESSAGE[i]}"
done

В противном случае вам нужно что-то вроде этого:

 eval 'echo "$MESSAGE'"$i"'"'

и от этого становится только хуже.

person Mark Reed    schedule 28.03.2013
comment
фу .. нет, не против использования массива? У меня есть переменные MESSAGE1-25. Должен ли я поместить каждую из них в массив, а затем извлечь каждую и заменить ее? Я думаю, я не уверен, где я должен поместить этот массив? - person HM Stanley; 28.03.2013
comment
я понял. СООБЩЕНИЕ - это массив и значения вставки в этот массив - person HM Stanley; 28.03.2013
comment
Верно. Вместо MESSAGE1=blah1, MESSAGE2=blah2 и т. д. вы можете использовать MESSAGE[0]=blah1, MESSAGE[1]=blah2 и т. д. Или инициализировать все это скобками, как я, или прочитать его из файла с помощью read -a — это просто зависит от того, как эти переменные устанавливаются в вашем заявление. - person Mark Reed; 28.03.2013

Во-первых, пара предварительных проблем: MESSAGE23="com."apple".cacng.tokend is present" не будет вставлять двойные кавычки в значение переменной, вместо этого используйте MESSAGE23="com.\"apple\".cacng.tokend is present" или MESSAGE23='com."apple".cacng.tokend is present'. Во-вторых, вы почти всегда должны заключать в двойные кавычки расширения переменных (например, echo "$MESSAGE23"), чтобы предотвратить странности синтаксического анализа.

Теперь настоящие проблемы: оболочка не позволяет подставлять переменные в левой части присваивания (т. е. MESSAGE$i=something не будет работать). К счастью, это разрешено в операторе declare, так что вы можете использовать его вместо этого. Кроме того, когда он видит $MESSAGE$i, он заменяет его значением $MESSAGE, за которым следует значение $i; для этого вам нужно использовать косвенное расширение (`${!metavariable}').

for i in {1..25}; do
    varname="MESSAGE$i"
    declare $varname="$(echo "${!varname}" | tr -d '"')"
done

(Обратите внимание, что я также использовал tr вместо sed, но это только мои личные предпочтения.)

(Кроме того, обратите внимание, что предложение @Mark Reed о массиве действительно лучший способ сделать такого рода вещи.)

person Gordon Davisson    schedule 28.03.2013
comment
Спасибо, ребята .. Многому здесь научился у вас обоих, буду экспериментировать как с опцией массива, так и с использованием объявления. Спасибо - person HM Stanley; 29.03.2013