1

Я создаю и устанавливаю переменную в моем сценарии оболочки, используя следующее выражение.

eval "test2"="'Test Name's Test'"

Но это приводит к следующей ошибке

-sh: eval: line 1: syntax error: Unterminated quoted string

Как я могу это исправить.

3 ответа3

3

Чтобы получить представление о том, что на самом деле будет запускаться при eval некоторой строки, попробуйте сначала echo ее. eval -ing это похоже на копирование вывода echo в оболочку и выполнение этого:

echo "test2"="'Test Name's Test'"
test2='Test Name's Test'

Там есть три одинарные кавычки, которые никогда не запустятся. А так как вы не можете включить одиночные кавычки в Bash одиночных кавычек (она даже не поддерживает обратную косую черту вытекающей, в отличии от многих других языков), вы должны будете использовать двойные кавычки , если вы хотите eval что - то вроде этого:

echo "test2"="\"Test Name's Test\""
test2="Test Name's Test"

Но , как @daniel указал, eval ненужно. И вы ни в коем случае не должны использовать eval. Единственный случай, когда я видел полезный eval это вывод getopt.

0

Сообщение об ошибке здесь совершенно ясно. Неопределенная цитата , вероятно, относится к трем одинарным кавычкам с правой стороны.

0

Во-первых: почему eval? Вы можете просто сказать test="..." .

Во- вторых: Вы не можете поставить апостроф ' строку с разделителями в одинарные кавычки. Вы даже не можете избежать этого с обратной косой чертой. Таким образом, чтобы поместить одинарную кавычку в такую строку, вы должны завершить строку одинарными кавычками и вставить одинарную кавычку (которая должна быть экранирована):

test2='Test Name'"'"'s Test'; echo $test2
test3='Test Name'\''s Test'; echo $test3

Проблема с eval является то , что он добавляет еще один раунд расширения, так что вы должны избежать внутреннего "

eval test2="'Test Name'\"'\"'s Test'"; echo $test2
eval test3="'Test Name'\''s Test'"; echo $test3

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