На всякий случай помогает кому-то при использовании сценария удара затем, пример, данный Всевозможным, не работал бы. В ударе статус выхода успешной команды 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
echo
помещает пробел между каждыми двумя аргументами. Оболочка считает новую строку в $ num
просто разделителем слов (как и пробел).
lines="a
b
c"
set -x
echo $lines # several arguments to echo
echo "$lines" # one argument to echo
См. этот ответ (сам ОП) для более подробного объяснения.
Используйте tr
, чтобы удалить продолжение строки и новые строки:
$ num=$(echo 6^6^3 | bc)
$ echo "$num"
12041208676482351082020900568572834033367326934574532243581212211450\
20555710636789704085475234591191603986789604949502079328192358826561\
895781636115334656050057189523456
$ num=$(echo "$num" | tr -d '\n\\')
$ echo "$num"
12041208676482351082020900568572834033367326934574532243581212211450205557106367897040854752345911916039867896049495020793281923588265618957816361153346560500571895 23456
Согласно комментарию Стефана Чазеласа , проблема не в том, что пробел интерпретируется как новая строка. Он объяснил это в другом месте в связи с (концептуальным) оператором «split + glob», и хотя я не полностью следую его семантике, вот что происходит:
Переменная без кавычек разделяется на пробеле оболочкой, и они передаются в качестве аргументов в echo
. Разделение удаляет пробелы.Это может немного сбивать с толку, так как «обратная косая черта-новая строка» кажется escape-последовательностью, но это НЕ эквивалентно x = \\\ n
, это эквивалентно x = $ '\\ \ 012 '
, \ 012
является восьмеричным для фактического перевода строки - в отличие от escape-последовательности \\ n
, которая приводит к строке, содержащей литерал "\ n "(обратная косая черта-n), которая не будет разделена.
echo
затем выводит свои аргументы, разделенные пробелом.
Повторим:
str1=hello\\nworld
str2=$'hello\012world'
Оболочка не будет разделять первую оболочку без кавычек, поскольку она фактически не содержит пробелов - она содержит escape-последовательность \ n
, тогда как во втором случае она будет быть разделенным без кавычек на фактическом символе новой строки (который является пробелом).
Понятия не имею, почему он там, но вот как отключить его с помощью реализации 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
На странице руководства bc в разделе выражений объясняется ограничение.
Поскольку числа имеют произвольную точность, некоторые числа не могут быть печатаемыми в одной выходной строке. Эти длинные числа будут разделены по строкам, используя "\" в качестве последнего символа в строке. Максимальное количество символов, печатаемых в строке, составляет 70.