У меня есть многострочная переменная, и я хочу только первую строку в этой переменной. Следующий скрипт демонстрирует проблему:
#!/bin/bash
STRINGTEST="Onlygetthefirstline
butnotthesecond
orthethird"
echo " Take the first line and send to standard output:"
echo ${STRINGTEST%%$'\n'*}
# Output is as follows:
# Onlygetthefirstline
echo " Set the value of the variable to the first line of the variable:"
STRINGTEST=${STRINGTEST%%$'\n'*}
echo " Send the modified variable to standard output:"
echo $STRINGTEST
# Output is as follows:
# Onlygetthefirstline butnotthesecond orthethird
Вопрос: Почему ${STRINGTEST%%$'\n'*}
возвращается первая строка, когда ставится после echo
команды, но заменяет символы новой строки пробелами, если ставится после присваивания?
$'...'
вместо bash.Ответы:
Может быть, есть другой способ архивировать то, что вы хотите сделать, но это работает
источник
$STRINGTEST
не содержат пробелов или подстановочных знаков. Также обратите внимание, что пустые строки (как в первой строке этой переменной) игнорируются.STRINGTEST=(${STRINGTEST[@]})
имеет мало смысла и эквивалентнаSTRINGTEST=($STRINGTEST)
такSTRINGTEST
ранее была определена как скаляр (не массив ) переменной.может быть не самый эффективный, но один лайнер ...
источник
firstLine=`echo "${test_var}" | sed -n 1p
также работает , если у вас есть причины для использования СЭД вместо (например, это означает , что вы можете одновременно выполнить замену линии:echo "${test_var}" | sed -nE '1 s/# *(.*)/\1/p'
.Этот код работает для меня со всеми версиями bash, которые я пробовал между 2.05b и 4.3. Скорее всего, вы пытались запустить этот скрипт с другой оболочкой, которая не поддерживает
$'...'
форму цитирования.Этот
$'...'
синтаксис не является стандартнымsh
синтаксисом (пока) и поддерживается только (по состоянию на 2015-05-22 и AFAIK) путемksh93
(где она возникла),zsh
,bash
, последние версииmksh
иsh
или в последних версиях FreeBSD .Моя ставка будет то , что вы пытались запустить этот скрипт с
sh
вместоbash
и вашsh
основан на версииash
,pdksh
,yash
илиksh88
которые не поддерживают его еще.Если вы хотите сделать этот код POSIX 2008 совместимым, вам нужно написать его:
Затем вы можете интерпретировать его с помощью любой POSIX-совместимой оболочки, например,
bash
любой более быстрой или более быстройsh
.(и помните, что оставление переменной без кавычек в контексте списка имеет особое значение для оболочек типа Борна).
источник
Это работает для меня:
И это также работает для пустых строк:
источник
read
один раз перейти к простой переменной (вместоreadarray
индексации с плюсом).Со встроенным Bash
read
и здесь-строкой:Использование расширения параметров POSIX:
источник