bash, variables modifiées au sein d'une boucle
2014-09-16
Il y a quelques temps déjà, je m’étais cassé la tête sur des variables que je modifiais dans une boucle et dont les modifications avaient disparues une fois sorti de celle-ci.
Cela s’expliquait par le fait que les variables étaient dans un sous-processus et non dans le process courrant.
La bonne syntaxe pour modifier des variables au sein d’une boucle while est la suivante :
function parse() {
local command="$1"
tempf=$(mktemp)
$command --help 2>&1 | sed -e 's/^[[:space:]]\{16,\}.*//' -e 's/^[[:space:]]*//' | grep -E '^-' | sed -e 's/[[:space:]]\{2,\}.*//' > $tempf
local longopts=""
local shortopts=""
while read line || [[ $line ]];
do
required=""
if grep -Fq '[=' <<< "$line"; then
required="::"
elif grep -Fq '=' <<< "$line"; then
required=":"
fi
while read option || [[ $option ]];
do
option=${option%%=*}
option=${option%[}
if [ ${option:0:2} == '--' ]; then
if [ -n "$longopts" ]; then
longopts="${longopts},"
fi
longopts="${longopts}${option:2}${required}"
else
shortopts="${shortopts}${option:1}${required}"
fi
done < <(echo $line | tr ',' '\n' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]\+.*//')
done < $tempf
rm -f $tempf
echo "-o '$shortopts' -l '$longopts'"
}
Il faut passer par done < … et non … | while