Загадка разрыва строки при использовании кавычек вокруг переменной - PullRequest
0 голосов
/ 22 сентября 2019

Я написал простой скрипт, цель которого - просто создать связь между двумя разными каталогами cygwin.Это должно быть очень просто, но так как $ LOCALAPPDATA может содержать пробелы, это окажется гораздо сложнее, чем я предполагал.

Вот сценарий:

#!/bin/sh

echo "Unlinking any existing data link..."
unlink /usr/local/astrometry/shared_data 2>/dev/null

echo "Generating link between astrometry shared_data..."

my_dir=`cygpath -u $LOCALAPPDATA/cygwin_ansvr/usr/share/astrometry/data`
echo $my_dir
my_test=`echo $my_dir`
echo $my_test

# Note here, if I use $my_dir rather than $my_test, it introduces a LINE BREAK!
ln -s "$my_test" /usr/local/astrometry/shared_data

exit 0

Итак, если язапустите приведенный выше скрипт, вот вывод:

Unlinking any existing data link...
Generating link between astrometry shared_data...
/cygdrive/c/Users/Dwight Towler/AppData/Local/cygwin_ansvr/usr/share/astrometry/data
/cygdrive/c/Users/Dwight Towler/AppData/Local/cygwin_ansvr/usr/share/astrometry/data

И ссылка формируется так:

lrwxrwxrwx  1 Dwight Towler None  84 Sep 22 02:56 shared_data -> /cygdrive/c/Users/Dwight Towler/AppData/Local/cygwin_ansvr/usr/share/astrometry/data
drwx------+ 1 Dwight Towler None   0 Sep 22 02:56 .

Выше приведена нужная ссылка (без разрыва строки).

Теперь, если я заменим $my_test на $my_dir в вызове ln -s, я получу следующее:

lrwxrwxrwx  1 Dwight Towler None  84 Sep 22 02:55 shared_data -> /cygdrive/c/Users/Dwight
Towler/AppData/Local/cygwin_ansvr/usr/share/astrometry/data
drwx------+ 1 Dwight Towler None   0 Sep 22 02:55 .

Заметили разрыв строки?Я не могу понять, откуда это исходит, тем более что я помещаю кавычки вокруг переменных в вызове ln -s.

Это особенно озадачивает, поскольку выходные данные команды echo, кажется, указывают, что обе переменные имеюттот же контент:

echo $my_dir
/cygdrive/c/Users/Dwight Towler/AppData/Local/cygwin_ansvr/usr/share/astrometry/data
echo $my_test
/cygdrive/c/Users/Dwight Towler/AppData/Local/cygwin_ansvr/usr/share/astrometry/data

Есть идеи о том, что происходит?

1 Ответ

1 голос
/ 22 сентября 2019

Эта разница в значениях между 'my_dir' и 'my_test' является результатом использования подстановки команд (my_test = echo $my_dir) для копирования my_dir в my_test.Эта конструкция приведет к тому, что любые последовательные пробелы (включая новую строку) будут заменены одним пробелом.

Для каждой страницы man эта подстановка команды приведет к тому, что значение my_dir будет разделено на значение IFS.(по умолчанию - пробелы - пробелы, табуляции и новая строка) в слова, а затем отдельные слова печатаются с одним пробелом между ними.Предполагая, что исходная строка содержит новые строки (или несколько пробелов между словами) - все они будут преобразованы в один пробел.

Рассмотрим следующее присваивание, которое приведет к внедрению новой строки (между 'first' и 'second).Использование без кавычек "эхо" заменит новую строку пробелом.

A="first
second"
echo "NO QUOTE"
echo $A
echo "QUOTED"
echo "$A"
echo "----"

Вывод будет

NO QUOTE
first second
QUOTED
first
second
----

Нижняя строка , новая строка представленав исходной строке ('my_dir') и заменяется пробелом в операторе echo из-за подстановки слова оболочки / команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...