Eu tenho uma variável multilinha e quero apenas a primeira linha nessa variável. O script a seguir demonstra o problema:
#!/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
Pergunta: Por que ${STRINGTEST%%$'\n'*}
retornar a primeira linha quando colocada após um echo
comando, mas substituir novas linhas por espaços quando colocadas após a atribuição?
$'...'
vez de bash.Respostas:
Talvez exista outra maneira de arquivar o que você deseja fazer, mas isso funciona
fonte
$STRINGTEST
não contenham espaços em branco ou curingas. Observe também que as linhas vazias (como na primeira linha nessa variável) são ignoradas.STRINGTEST=(${STRINGTEST[@]})
faz pouco sentido e é equivalente aoSTRINGTEST=($STRINGTEST)
queSTRINGTEST
foi definido anteriormente como uma variável escalar (não matriz ).pode não ser mais eficiente, mas um forro ...
fonte
firstLine=`echo "${test_var}" | sed -n 1p
também funciona se você tem uma razão para usar sed vez (por exemplo, isso significa que você pode, simultaneamente, realizar um substituto para a linha:echo "${test_var}" | sed -nE '1 s/# *(.*)/\1/p'
.Esse código funciona para mim com todas as versões do bash que tentei entre 2.05b e 4.3. Provavelmente você tentou executar esse script com um shell diferente que não suporta a
$'...'
forma de citação.Essa
$'...'
sintaxe não é padrãosh
sintaxe (ainda) e apenas apoiado (a partir de 2015/05/22 e AFAIK) peloksh93
(onde se originou),zsh
,bash
, versões recentes domksh
esh
ou recentes versões do FreeBSD .Minha aposta seria que você tentou executar esse script com
sh
em vez debash
e suash
é baseado em versões deash
,pdksh
,yash
ouksh88
que não apoiá-lo ainda.Se você quiser tornar esse código POSIX 2008 compatível, precisará escrevê-lo:
Em seguida, você pode interpretá-lo por qualquer shell compatível com POSIX, como
bash
qualquer um mais enxuto / rápido como o seush
.(e lembre-se de que deixar uma variável sem aspas no contexto da lista tem um significado muito especial nos shells tipo Bourne).
fonte
Isso funciona para mim:
E também funciona para linhas em branco:
fonte
read
uma vez uma variável simples (em vez dereadarray
mais a indexação).Com o Bash interno
read
e a string aqui:Usando a expansão de parâmetros POSIX:
fonte