web-dev-qa-db-fra.com

Comment ajouter un numéro de ligne pour la sortie, Demander une ligne, puis agir en fonction de l'entrée?

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 !

59
Yifan Zhang

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
11
kev

nl imprime les numéros de ligne:

ls | grep Android | nl
196
Traz

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
41
Karl Barker

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.
15
jweyrich

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

demo.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

select_from_list.sh

#!/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
0
Brad Parks

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.

0
Scooby-2