Непечатаемые символы в Bash (Никак не могу понять одну вещь)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
KonishchevDmitry
Сообщения: 92
ОС: Ubuntu
Контактная информация:

Непечатаемые символы в Bash

Сообщение KonishchevDmitry »

Доброго всем времени суток.

Есть такой скрипт:

Код: Выделить всё

 #!/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

Re: Непечатаемые символы в Bash

Сообщение Red User »

KonishchevDmitry писал(а):
01.03.2008 16:05
var1 - это один символ \n
var2 - это тоже должен быть один символ \n. По крайней мере echo выдает только его.

В var2 не будет '\n'. Посмотри, например, на результат выполнения такого скрипта:

Код: Выделить всё

#!/bin/bash

var="`ls`"
echo $var
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
Аватара пользователя
KonishchevDmitry
Сообщения: 92
ОС: Ubuntu
Контактная информация:

Re: Непечатаемые символы в Bash

Сообщение KonishchevDmitry »

Но почему? Кавычки ведь должны "заставить" Bash записать в переменную точно то значение, которая выводит программа.

P. S.: И как же тогда записать в переменную символ перевода строки (кроме способа, который я использовал для var1)?
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: Непечатаемые символы в Bash

Сообщение Red User »

KonishchevDmitry писал(а):
01.03.2008 17:06
Но почему?

Переводы строк убираются, когда результат выполнения команды подставляется вместо `команда`

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

Re: Непечатаемые символы в Bash

Сообщение Luinnar »

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`". ;)
Спасибо сказали:
Аватара пользователя
KonishchevDmitry
Сообщения: 92
ОС: Ubuntu
Контактная информация:

Re: Непечатаемые символы в Bash

Сообщение KonishchevDmitry »

Red User, Luinnar, Спасибо за помощь, теперь все стало на свои места.
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: Непечатаемые символы в Bash

Сообщение Red User »

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

Re: Непечатаемые символы в Bash

Сообщение Luinnar »

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

Re: Непечатаемые символы в Bash

Сообщение Luinnar »

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
Спасибо сказали:
Ответить