У меня есть файл с разделителями табуляции, как это:

table_a    "where id IN ($IDS)"
table_b    "where fk_id IN ($IDS)"
table_c    "where fk_id IN ($SOME_OTHER_IDS)"

И я пытаюсь написать такой скрипт:

IDS="1,2,3"
SOME_OTHER_IDS="4,5,6"

while read TABLE WHERECLAUSE
do
    echo "$WHERECLAUSE"
    mysqldump ... --where="$WHERECLAUSE"
done < 'myfile.txt'

Проблема в том, что, конечно, $IDS не раскрывается и не интерпретируется при чтении из команды read .

Кажется, что я могу сделать что-то в цикле, как:

WHERECLAUSE=`eval echo "$WHERECLAUSE"`

Но разве это по сути небезопасно использовать eval таким образом?

Есть ли лучший способ заменить $IDS который избегает небезопасного использования eval ? Предпочтительно я ищу решение, которое поддерживает как OSX, так и Ubuntu.

Спасибо!

1 ответ1

1

eval определенно должен быть вашим последним вариантом, особенно если входной файл - пользовательский.

Для простых случаев (например, когда вам не нужно беспокоиться о escape-символах и кавычках), вы можете сделать следующее:

IDS="1,2,3"
SOME_OTHER_IDS="4,5,6"

while read TABLE WHERECLAUSE
do
    WHERECLAUSE=${WHERECLAUSE//\$IDS/$IDS}
    WHERECLAUSE=${WHERECLAUSE//\$SOME_OTHER_IDS/$SOME_OTHER_IDS}
    echo "$WHERECLAUSE"
    mysqldump ... --where="$WHERECLAUSE"   
done

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .