2016-04-29 8 views
1

Я пытаюсь узнать подстановку параметров Баш и имеют очень простой вопрос:Bash подстановки параметров

Почему эта работа:

#!/bin/sh 
v1="-E" 
v2="s/./x/g" 
sed "$v1" "$v2" <<<"abc" # result = "xxx" 

, но это не работает:

#!/bin/sh 
v1="-E" 
v2="s/./x/g" 
sed "$v1 $v2" <<<"abc" # result = "sed: illegal option..." 

Я использую Mac OS X bash.

+0

Вы должны ввести regex, как этот 'sed '$ v1' $ v2 '" <<< "abc" ' – taras

+0

Я пробовал это, и он дает то же сообщение об ошибке. – scolfax

+1

@scolfax Вы должны узнать о словарях: http://mywiki.wooledge.org/WordSplitting – andlrc

ответ

0

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

v1=123 
v2=456 

, как у вас на втором примере СЭД будет видеть это: «123456», хотя то, что вы хотите СЭД, чтобы увидеть это две переменные, один, чтобы иметь 123 и второй у кого есть 456. Вот почему вы должны иметь их в отдельных цитатах! Надеюсь, я объяснил это достаточно хорошо, чтобы вы поняли !!

PS

То, что вы на самом деле на втором примере, вы могли бы использовать его в какой-то момент, если вы хотите concutenate две переменные, и добавить их в другой в виде строки :)

UPDATE

Так давайте есть пример здесь .....

v1=123 
v2=456 
CASE1="$v1" "$v2" 
CASE2="$v1 $v2" 
echo CASE1 
echo CASE2 

Для CASE1 выход будет 123456, так как для CASE2 выход будет 123 456 ..... Теперь вы получаете разницу? Единственный способ сделать это в обоих направлениях и распечатывать то же самое было бы это .....

v1=123 
v2=456 
CASE1="$v1" "$v2" 
CASE2="$v1$v2" 

, имеющий БЕЗ Случай 2. пространства между переменными ...

+0

Не думаю, что я все еще понимаю. Во втором примере существует пробел между $ v1 и $ v2. Разве это не приведет к появлению строки «-E s /./ x/g» после подстановки и, таким образом, будет эквивалентно первому примеру? – scolfax

+0

@scolfax Позвольте мне дать вам простой пример ..... это то же самое, если я даю вам один удар по лицу или если я дам вам два?: p просто шучу btw, я просто сделал забавный момент :) – hedgehog

+0

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

1

Проблема в ваш второй пример, что двойные кавычки защищают заключенный пробельные слова расщеплению в Bash:

Вместо двух аргументов -E и s/./x/g, только один единственный аргумент -E s/./x/g (содержащий пробел) будет передан в соответствующий exec() системного вызова и, наконец, sed в этом случае.

+0

Это объясняет! Большое спасибо. – scolfax

+0

Добро пожаловать. –

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

  • Нет связанных вопросов^_^