J'ai écrit un script Shell comme celui-ci:
#! /bin/sh
...
ls | grep "Android"
...
et la sortie est:
Android1
Android2
xx_Android
...
Je veux ajouter un numéro dans chaque fichier, comme ceci:
1 Android1
2 Android2
3 XX_Android
...
please choose your dir number:
puis attendez le numéro de ligne entré par l'utilisateur x, le script lit le numéro de ligne puis traite le répertoire correspondant. Comment pouvons-nous faire cela dans Shell? Merci !
Au lieu d'implémenter l'interaction, vous pouvez utiliser la commande intégrée select
.
select d in $(find . -type d -name '*Android*'); do
if [ -n "$d" ]; then
# put your command here
echo "$d selected"
fi
done
nl imprime les numéros de ligne:
ls | grep Android | nl
Si vous canalisez le résultat dans cat
, vous pouvez utiliser le -n
option pour numéroter chaque ligne comme suit:
ls | grep "Android" | cat -n
Passer -n
à grep
, comme suit:
ls | grep -n "Android"
À partir de la page de manuel grep
:
-n, --line-number Prefix each line of output with the line number within its input file.
Les autres réponses sur cette page ne répondent pas à 100% à la question. Ils ne montrent pas comment laisser l'utilisateur choisir interactivement le fichier dans un autre script.
L'approche suivante vous permettra de le faire, comme vous pouvez le voir dans l'exemple. Notez que le select_from_list
le script a été extrait de ce post stackoverflow
$ ls
Android1 Android4 Android7 mac2 mac5
Android2 Android5 demo.sh mac3 mac6
Android3 Android6 mac1 mac4 mac7
$ ./demo.sh
1) Android1 3) Android3 5) Android5 7) Android7
2) Android2 4) Android4 6) Android6 8) Quit
Please select an item: 3
Contents of file selected by user: 2.3 Android 1.5 Cupcake (API 3)
Ici se trouve le demo.sh
et le script qu'il utilise pour sélectionner un élément dans une liste, select_from_list.sh
#!/usr/bin/env bash
# Ask the user to pick a file, and
# cat the file contents if they select a file.
OUTPUT=$(\ls | grep Android | select_from_list.sh | xargs cat)
STATUS=$?
# Check if user selected something
if [ $STATUS == 0 ]
then
echo "Contents of file selected by user: $OUTPUT"
else
echo "Cancelled!"
fi
#!/usr/bin/env bash
Prompt="Please select an item:"
options=()
if [ -z "$1" ]
then
# Get options from PIPE
input=$(cat /dev/stdin)
while read -r line; do
options+=("$line")
done <<< "$input"
else
# Get options from command line
for var in "$@"
do
options+=("$var")
done
fi
# Close stdin
0<&-
# open /dev/tty as stdin
exec 0</dev/tty
PS3="$Prompt "
select opt in "${options[@]}" "Quit" ; do
if (( REPLY == 1 + ${#options[@]} )) ; then
exit 1
Elif (( REPLY > 0 && REPLY <= ${#options[@]} )) ; then
break
else
echo "Invalid option. Try another one."
fi
done
echo $opt
Cela fonctionne pour moi:
line-number=$(ls | grep -n "Android" | cut -d: -f 1)
J'utilise ceci dans un script pour supprimer des sections de mon sitemap.xml que je ne veux pas que Googlebot explore. Je recherche l'URL (qui est unique) et je trouve le numéro de ligne en utilisant ce qui précède. À l'aide de calculs simples, le script calcule ensuite la plage de nombres requise pour supprimer l'intégralité de l'entrée dans le fichier XML.
Je suis d'accord avec jweyrich concernant la mise à jour de votre question pour obtenir de meilleures réponses.