В test1.sh echo
печатает все переданные ему аргументы-"some text"
— первый аргумент, а "some more text"
— второй аргумент.
В то время как test2.sh пытается объединить строки и присвоить значение переменной, используя неправильный метод объединения.
Чтобы разбить строку на несколько строк, просто оставьте закрывающую кавычку и продолжите на следующей строке, например:
text="some text \
some more text"
Цитирование Язык команд оболочки POSIX ,
A <backslash> that is not quoted shall preserve the literal value of the following character, with the exception of a <newline>. If a <newline> follows the <backslash>, the shell shall interpret this as line continuation. The <backslash> and <newline> shall be removed before splitting the input into tokens. Since the escaped <newline> is removed entirely from the input and is not replaced by any white space, it cannot serve as a token separator.
Это означает, что в вашем первом примере оболочка фактически выполняет
echo "some text" "some more text"
представляет собой простую команду echo
, за которой следуют два аргумента, объединенные с помощью символа пробела при выводе на стандартный вывод.
Во втором примере оболочка фактически выполняет
text="some text" "some more text"
echo $text
где первая строка интерпретируется как простая командаsome more text
(одна лексема, включая символы пробела ), которым предшествует присвоение переменной text="some text"
; затем выполняется echo $text
.
Чтобы получить тот же результат, что и первый, второй фрагмент можно изменить на
text="some text "\
"some more text"
echo "$text"
Обратите также внимание на двойные кавычки в echo "$text"
, необходимые для предотвращения применения оболочкой разделения слов и создания имени файла к расширению $text
(. Это не имеет значения для ваших примеров строк, но было бы, если бы они содержали пробелы. последовательности символов, отличные от одиночного пробела и/или подстановочных символов ).