2013-03-19 4 views
1

Возьмите этот маленький пример:Баш Престола в новой линии

#!/bin/bash -x 
myvar="\"Hello Stackoverflow\"" 
ping $myvar 

Результатом этого является то, что все команды (пинг только для примера здесь) будет автоматически видеть пробелы между «Hello» и «Stackoverflow» как возврат новой линии или карри.

# ./test.sh 
+ myvar='"Hello Stakeoverflow"' 
+ ping '"Hello' 'Stakeoverflow"' 
ping: unknown host "Hello 

Есть ли способ обойти это?

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

ответ

3

Внутренние цитаты не делают вам ничего хорошего - не пытайтесь использовать их. В случае myvar="\"foo\"" внешние кавычки являются синтаксическими, но внутренние кавычки являются данными. Котировки, которые являются данными, не используются оболочкой для целей разделения строк, и они не возвращаются в синтаксис позже (если вы не используете eval, что представляет собой множество новых проблем, многие из которых влияют на безопасность); все, что они делают, это добавить данные, которые ваша фактическая команда не хочет или не нуждается.

синтаксис цитаты вокруг вашего расширения, чтобы предотвратить разделение строк и расширение glob. Сравните эти четыре примера (только первый из которых является правильным):

do_something_with() { 
    printf '<%s> ' "[email protected]" 
    echo 
} 

myvar="Hello Stackoverflow" 
do_something_with "$myvar" # output: <Hello Stackoverflow> 
do_something_with $myvar # output: <Hello> <Stackoverflow> 

myvar2="\"Hello Stackoverflow\"" 
do_something_with $myvar2 # output: <"Hello> <Stackoverflow"> 
do_something_with "$myvar2" # output: <"Hello Stackoverflow"> 

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

my_array=(Hello "Stack Overflow") 
do_something_with "${my_array[@]}" # output: <Hello> <Stack Overflow> 

Смотрите также http://mywiki.wooledge.org/BashFAQ/050

+0

Большое спасибо за нашли время, чтобы очертить все это для меня. Двойное цитирование переменной выполнило задание! – devnull

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