Автоматическое преобразование новых строк в присвоении переменной оболочки

На всякий случай помогает кому-то при использовании сценария удара затем, пример, данный Всевозможным, не работал бы. В ударе статус выхода успешной команды 0

Таким образом, следующее работало бы:

patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status 
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
    #apply the patch
    patch -p0 -N < patchfile
fi
5
13.04.2017, 15:36
5 ответов

echo помещает пробел между каждыми двумя аргументами. Оболочка считает новую строку в $ num просто разделителем слов (как и пробел).

lines="a
b
c"
set -x
echo $lines   # several arguments to echo
echo "$lines" # one argument to echo

См. этот ответ (сам ОП) для более подробного объяснения.

3
27.01.2020, 20:33

Используйте tr , чтобы удалить продолжение строки и новые строки:

$ num=$(echo 6^6^3 | bc)
$ echo "$num"
12041208676482351082020900568572834033367326934574532243581212211450\
20555710636789704085475234591191603986789604949502079328192358826561\
895781636115334656050057189523456
$ num=$(echo "$num" | tr -d '\n\\')
$ echo "$num"
12041208676482351082020900568572834033367326934574532243581212211450205557106367897040854752345911916039867896049495020793281923588265618957816361153346560500571895 23456
2
27.01.2020, 20:33

Согласно комментарию Стефана Чазеласа , проблема не в том, что пробел интерпретируется как новая строка. Он объяснил это в другом месте в связи с (концептуальным) оператором «split + glob», и хотя я не полностью следую его семантике, вот что происходит:

  • Переменная без кавычек разделяется на пробеле оболочкой, и они передаются в качестве аргументов в echo . Разделение удаляет пробелы.Это может немного сбивать с толку, так как «обратная косая черта-новая строка» кажется escape-последовательностью, но это НЕ эквивалентно x = \\\ n , это эквивалентно x = $ '\\ \ 012 ', \ 012 является восьмеричным для фактического перевода строки - в отличие от escape-последовательности \\ n , которая приводит к строке, содержащей литерал "\ n "(обратная косая черта-n), которая не будет разделена.

  • echo затем выводит свои аргументы, разделенные пробелом.

Повторим:

str1=hello\\nworld
str2=$'hello\012world'

Оболочка не будет разделять первую оболочку без кавычек, поскольку она фактически не содержит пробелов - она ​​содержит escape-последовательность \ n , тогда как во втором случае она будет быть разделенным без кавычек на фактическом символе новой строки (который является пробелом).

0
27.01.2020, 20:33

Понятия не имею, почему он там, но вот как отключить его с помощью реализации GNU bc :

echo '6^6^3' | BC_LINE_LENGTH=0 bc

BC_LINE_LENGTH

Это должно быть целое число, определяющее количество символов в выходной строке для числа. Сюда входят символы обратной косой черты и новой строки для длинных чисел. В качестве расширения нулевое значение отключает многострочную функцию. Любое другое значение этой переменной, меньшее 3, устанавливает длину строки равной 70.

Обновление:

Я был сбит с толку этим вопросом, я думал, что это связано с происхождением многострочной функции, это действительно кажется как странный. В любом случае, реальный ответ заключается в том, что если вы не заключите переменную в кавычки, оболочка выполнит разделение на слова , прежде чем это будет передано в echo . Разделение слов - это процесс, при котором расширение разбивается на «слова» в зависимости от содержимого IFS , эти «слова» затем становятся разными аргументами. В примере с вопросом это создает два аргумента для echo, которые echo затем разделяются пробелом (я знал это до того, как Стефан прокомментировал, честно ...).

Чтобы этого не произошло, просто заключайте переменную в двойные кавычки:

num=$(echo '6^6^3' | bc)
echo "$num"

Иногда это действительно полезно как способ удалить символы IFS из переменной (хотя printf% s более безопасен для произвольных строк). Например (в bash ):

$ var=$'spaces:    newlines:\n\n\ntabs:\t\t\t end'

$ echo "$var"
spaces:    newlines:


tabs:            end
$ newvar="$(printf '%s ' $var)"
$ echo "$newvar"
spaces: newlines: tabs: end
7
27.01.2020, 20:33

На странице руководства bc в разделе выражений объясняется ограничение.

Поскольку числа имеют произвольную точность, некоторые числа не могут быть печатаемыми в одной выходной строке. Эти длинные числа будут разделены по строкам, используя "\" в качестве последнего символа в строке. Максимальное количество символов, печатаемых в строке, составляет 70.

2
27.01.2020, 20:33

Теги

Похожие вопросы