J'ai une variable multiligne et je veux seulement la première ligne de cette variable. Le script suivant illustre le problème:
#!/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
Question: Pourquoi ${STRINGTEST%%$'\n'*}
retourne la première ligne lorsqu'elle est placée après une echo
commande, mais remplace-t-elle les retours à la ligne par des espaces lorsqu'elle est placée après l'affectation?
$'...'
au lieu de bash.Réponses:
Il y a peut-être une autre façon d'archiver ce que vous voulez faire, mais cela fonctionne
la source
$STRINGTEST
ne contiennent ni blancs ni caractères génériques. Notez également que les lignes vides (comme dans la première ligne de cette variable) sont ignorées.STRINGTEST=(${STRINGTEST[@]})
n'a pas de sens et équivaut à,STRINGTEST=($STRINGTEST)
car elleSTRINGTEST
était précédemment définie comme une variable scalaire (et non un tableau ).peut-être pas le plus efficace mais un paquebot ...
la source
firstLine=`echo "${test_var}" | sed -n 1p
fonctionne aussi si vous avez une raison d'utiliser sed au lieu (par exemple, cela signifie que vous pouvez simultanément effectuer un remplacement à la ligne:echo "${test_var}" | sed -nE '1 s/# *(.*)/\1/p'
.Ce code fonctionne pour moi avec toutes les versions de bash que j'ai essayées entre 2.05b et 4.3. Vous avez probablement tenté d'exécuter ce script avec un autre shell qui ne prend pas en charge la
$'...'
forme de citation.Cette
$'...'
syntaxe est pas standardsh
syntaxe (encore) et seulement pris en charge ( à partir de 22/05/2015 et AFAIK) parksh93
(où il est originaire),zsh
,bash
, les versions récentes demksh
et lessh
ou les versions récentes de FreeBSD .Mon pari serait que vous avez essayé d'exécuter ce script avec au
sh
lieu debash
et votresh
est basé sur les versions deash
,pdksh
,yash
ouksh88
qui ne supportent pas encore.Si vous souhaitez rendre ce code POSIX 2008 compatible, vous devez l'écrire:
Ensuite, vous pouvez le faire interpréter par n'importe quel shell compatible POSIX comme
bash
ou n'importe quel shell plus léger / plus rapide comme le vôtresh
.(et rappelez-vous que laisser une variable sans guillemets dans le contexte d'une liste a une signification très spéciale dans les shells de type Bourne).
la source
Cela fonctionne pour moi:
Et cela fonctionne également pour les lignes vides:
la source
read
une fois dans une simple variable (au lieu de l'readarray
indexation plus).Avec Bash intégré
read
et ici-chaîne:Utilisation de l'extension des paramètres POSIX:
la source