Je sais celui-ci est passé depuis longtemps « répondu », et avec tout le respect dû à eduffy, je suis venu avec une meilleure façon et je pensais que je partage. Ce qui est "faux" avec la réponse d'eduffy n'est pas que c'est faux, mais qu'il impose ce qui est pour moi une limitation douloureuse: il y a une création implicite d'un sous-shell lorsque la sortie du ls est canalisée et cela signifie que les variables mis à l'intérieur de la boucle sont perdus après la sortie de la boucle. Ainsi, si vous voulez écrire un code plus sophistiqué, vous avez mal aux fesses à traiter.
Ma solution était de prendre la « readline » fonction et écrire un programme sur dans lequel vous pouvez spécifier un numéro de ligne spécifique que vous voudrez peut-être que les résultats de tout appel de fonction donnée. ... A titre d'exemple simple, en commençant par son eduffy:
ls_output=$(ls -1)
# The cut at the end of the following line removes any trailing new line character
declare -i line_count=$(echo "$ls_output" | wc -l | cut -d ' ' -f 1)
declare -i cur_line=1
while [ $cur_line -le $line_count ] ;
do
# NONE of the values in the variables inside this do loop are trapped here.
filename=$(echo "$ls_output" | readline -n $cur_line)
# Now line contains a filename from the preceeding ls command
cur_line=cur_line+1
done
Maintenant, vous avez enveloppé toute l'activité de sous-shell dans peu propre contenu des paquets et peut aller sur votre codage shell sans avoir à se soucier de la portée de votre variable valeurs se coincer dans les sous-couches.
J'ai écrit ma version de readline dans gnuc si quelqu'un veut une copie, c'est un peu gros à poster ici, mais peut-être que nous pouvons trouver un moyen ...
Hope this helps, RT
@ ʞɔıu, si la réponse est fausse, alors vous pouvez non l'accepter afin qu'il n'induire en erreur qui que ce soit. – codeforester
@codeforester - J'ai fait le montage en disant la réponse aspirée, pas ʞɔıu. – eduffy