На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
KonishchevDmitry
Сообщения: 92
ОС: Ubuntu
Контактная информация:
Сообщение
KonishchevDmitry » 01.03.2008 16:05
Доброго всем времени суток.
Есть такой скрипт:
Код: Выделить всё
#!/bin/bash
var1='
'
var2="`echo`"
if [[ "$var1" != "$var2" ]]
then
echo "Not equal."
else
echo "Equal."
fi
При запуске выдает "Not equal.".
Почему?
var1 - это один символ \n
var2 - это тоже должен быть один символ \n. По крайней мере echo выдает только его.
Red User
Сообщения: 229
ОС: Debian
Сообщение
Red User » 01.03.2008 16:22
KonishchevDmitry писал(а): ↑ 01.03.2008 16:05
var1 - это один символ \n
var2 - это тоже должен быть один символ \n. По крайней мере echo выдает только его.
В var2 не будет '\n'. Посмотри, например, на результат выполнения такого скрипта:
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
KonishchevDmitry
Сообщения: 92
ОС: Ubuntu
Контактная информация:
Сообщение
KonishchevDmitry » 01.03.2008 17:06
Но почему? Кавычки ведь должны "заставить" Bash записать в переменную точно то значение, которая выводит программа.
P. S.: И как же тогда записать в переменную символ перевода строки (кроме способа, который я использовал для var1)?
Red User
Сообщения: 229
ОС: Debian
Сообщение
Red User » 02.03.2008 04:29
Переводы строк убираются, когда результат выполнения команды подставляется вместо `команда`
P.S. Сорри, я был не прав. При замене `команда` на результат выполнения команды переводы сторк не убираются (кроме замыкающих). Но полсе этого выполняется разделение на слова (word splitting), при котором в качестве разделителей используются символы из переменной окружения IFS (по умолчанию <space><tab><newline>). Как раз при word splitting`е и исчезают переводы строк. Поэтому echo `echo $'aaa\nbbb'` выведет
Word splitting не выполняется внутри двойных кавычек. Поэтому echo "`echo $'aaa\nbbb'`" даст
Пара примеров:
Код: Выделить всё
$ cat > script
var="`echo $'aaa\nbbb'`"
echo $var
$ source ./script
aaa bbb
Код: Выделить всё
$ cat > script
var="`echo $'aaa\nbbb'`"
echo "$var"
$ source ./script
aaa
bbb
В 1-м случае происходит разделение на слова в строке echo $var
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu
Сообщение
Luinnar » 07.03.2008 18:28
KonishchevDmitry писал(а): ↑ 01.03.2008 16:05
Почему?
var1 - это один символ \n
var2 - это тоже должен быть один символ \n. По крайней мере echo выдает только его.
Ответ содержится в данном скрипте:
Код: Выделить всё
#!/bin/bash
var1='
'
var2=`echo`
echo -n '$var1: '; echo $var1 | od -c | sed 1q
echo -n '"$var1": '; echo "$var1" | od -c | sed 1q
echo -n '$var2: '; echo $var2 | od -c | sed 1q
echo -n '"$var2": '; echo "$var2" | od -c | sed 1q
PS: `echo` - это тоже самое что "`echo`".
Red User
Сообщения: 229
ОС: Debian
Сообщение
Red User » 09.03.2008 03:28
Luinnar писал(а): ↑ 07.03.2008 18:28
PS: `echo` - это тоже самое что "`echo`".
Вообще-то, не совсем:
Код: Выделить всё
$ echo `echo $'aaa\nbbb'`
aaa bbb
$ echo "`echo $'aaa\nbbb'`"
aaa
bbb
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu
Сообщение
Luinnar » 11.03.2008 11:41
Red User писал(а): ↑ 09.03.2008 03:28
Вообще-то, не совсем
Ну это уже проделки программы echo
Вот здесь будет видно:
Код: Выделить всё
a=`echo $'aaa\nbbb'`
b="`echo $'aaa\nbbb'`"
echo "$a"
echo "$b"
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu
Сообщение
Luinnar » 11.03.2008 14:06
Red User ,
А ты был прав с самого начала
Настоящая проблема здесь:
Замыкающий перевод строки теряется при присваивании результата выполнения програмы:
xxx=`echo` присваивает пустую строку, тогда как в выводе всё же есть один перевод строки:
Код: Выделить всё
bash-3.00$ echo | od -c
0000000 \n
0000001
bash-3.00$ xxx="`echo`"
bash-3.00$ echo -n "$xxx" | od -c
0000000