LINUX.ORG.RU

bash. экранирование. (или как это зовется?)


0

1

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

1:

# в чем отличие этих двух способов? вывод-то одинаковый.
some_var1="1 2 3"
some_var2='1 2 3'

echo $some_var1;echo $some_var2

2:

# почему в данном случае значение some_var1 не раскрывается?
some_var1="1 2 3"
some_var2='1 2 3 $some_var1'

echo $some_var2

3:

# что в данном случае я делаю не так?
# ошибка такая: sed: -e expression #1, char 1: unknown command: `''
file_name=file.txt
some_var="sed -i 's|123|321|g' $file_name"

`$some_var`

спасибо.

★★★

1. в том числе и в том, что там не подставляются переменные
2. см. пункт 1
3. путаешь обратную кавычку и апостроф

melkor217 ★★★★★
()
Ответ на: комментарий от melkor217

1. в том числе и в том, что там не подставляются переменные

не понял. можно немного более развернутый ответ?

2. см. пункт 1

так же.

3. путаешь обратную кавычку и апостроф

это я понял. но где именно? и как правильно нужно записать, чтоб значение some_var выполнилось как единая команда, и при этом, значение file_name раскрылось?

спасибо.

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

Кстати, так и не понял, при чём тут экранирование.

1. Если объяснять на пальцах, то двойные кавычки используются для склеивания слов в строку. А одинарные ещё и запрещают стандартные замены баша, например подстановку переменных.

2. См. 1

3. Неравильная кавычка после -i

melkor217 ★★★★★
()
Ответ на: комментарий от melkor217

А нет, насчёт неправильной кавычки вру. Косяк шрифта. Попробую седу скормить более валидное выражение, там виднее будет.

melkor217 ★★★★★
()
Ответ на: комментарий от melkor217

Кстати, так и не понял, при чём тут экранирование.

путаюсь в терминологии. в сабже предупредил.

1. Если объяснять на пальцах, то двойные кавычки используются для склеивания слов в строку. А одинарные ещё и запрещают стандартные замены баша, например подстановку переменных.

понял.

3. Неравильная кавычка после -i

но сколько я видел примеров, там именно апострофы используются.

и все равно я не понимаю как записать: some_var=«sed -i 's|123|321|g' $file_name» и это: `$some_var` можно микропример, плиз?

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

Да, тут я не туда смотрел просто.

Седу скармилвается строка 's|123|321|g', прямо с кавычками. И ему это не нравится. Одинарные кавычки можно вообще убрать тут.

melkor217 ★★★★★
()
Ответ на: комментарий от melkor217

да. оказывается, в данном случае одинарный кавычки попросту не нужны.

niXman ★★★
() автор топика
Ответ на: комментарий от melkor217

кстати, если в шаблоне sed`а имеется пробел, то он ругается как-то так: sed: -e expression #1, char 3: unterminated `s' command

что предпринять в этом случае?

niXman ★★★
() автор топика
# в чем отличие этих двух способов? вывод-то одинаковый.
some_var1="1 2 3"
some_var2='1 2 3'

ни в чем. а вот если бы внутри кавычек было $var_name то внутри двойных оно заменится на значение, а внутри одинарных - нет.

вообще, экранирование - это когда внутри двойных кавычек ты можешь перед долларом поставить обратный слеш и тогда он (доллар) будет расценен как обычный символ строки, а не начало имени переменной.

`$some_var`

это вобще излишне. в sh чтобы выполнить команду, лежащую в переменной, достаточно просто написать эту переменную:

var="date +%s"
$var

moot ★★★★
()
Ответ на: комментарий от moot

в sh чтобы выполнить команду, лежащую в переменной, достаточно просто написать эту переменную

не знал. это сильно все упрощает. спасибо.

а как быть с -

кстати, если в шаблоне sed`а имеется пробел, то он ругается как-то так: sed: -e expression #1, char 3: unterminated `s' command

что предпринять в этом случае?

?

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

> что предпринять в этом случае?

Перед пробелом напиши \

melkor217 ★★★★★
()
Ответ на: комментарий от alex_custov

всем спасибо. с этим вроде разобрался.

niXman ★★★
() автор топика

> # что в данном случае я делаю не так?

# ошибка такая: sed: -e expression #1, char 1: unknown command: `"


После -i нужно указать суффикс, который будет присвоен бекап-файлу.

Например, так:

sed -i .bak 's/123/321/g' $filename

Иначе не взлетит

Frakhtan-teh ★★
()

Тред не читал, но:

Обратные кавычки подставляют результат, например: echo `id -u` если ты под root'ом вернёт 0 или id текущего пользователя.

Двойные кавычки позволяют вставлять переменные, например: echo «I am $USER» выведет твой логин в системе с соответствующим текстом.

Одинарные кавычки не раскрывают переменные. Предыдущий пример выведет на экран I am $USER

Как-то так.

P.S.: Двойные скобочки позволяют

Othniel
()
Ответ на: комментарий от niXman

У меня синопсис выглядит так:

sed [-Ealn] [-e command] [-f command_file] [-I extension] [-i extension] [file ...]

И конкретно про ключ:

-i extension Edit files in‐place similarly to -I, but treat each file independently from other files. In particular, line numbers in each file start at 1, the “$” address matches the last line of the current file, and address ranges are limited to the current file.(See Sed Addresses.) The net result is as though each file were edited by a separate sed instance.

Соответственно, когда я не указываю параметр, он у меня ругается примерно так, как показано в заглавном посте.

Frakhtan-teh ★★
()
Ответ на: комментарий от niXman

такой еще вопрос... ввожу:

nixman@nixman-pc:~$ var="ls -l *.c \ 
ls -l *.cpp \
ls -l *.hpp"
[[/code]]
после, это:

nixman@nixman-pc:~$ $var
[[/code]]
в ответ получаю это:
[quote]
ls: cannot access ls: No such file or directory
ls: cannot access ls: No such file or directory
...
...
[/qoute]
файлы-то по всем трем шаблонам отображаются. но хотелось быть понять что в данном случае значит "ls: cannot access ls" ?

и еще. при присваивании переменной var нескольких строк команд, обязательно завершать строку обратной косой?



спасибо.
niXman ★★★
() автор топика
Ответ на: комментарий от niXman

что-то с тегами случилось. в топике работали.

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

ты экранируешь символ перевода строки слэшом, в результате фактически выполняется команда:

ls -l *.c ls -l *.cpp ls -l *.hpp
понятно откуда сообщение об ошибке?

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

да, понял. спасибо огромное.

niXman ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.