Как добавить номер строки для вывода, запросить строку, а затем действовать на основе ввода?


Я написал shell-скрипт такой:

#! /bin/sh
...
ls | grep "android"
...

и выход:

android1 
android2
xx_android
...

Я хочу добавить в каждый файл, как это:

    1 android1 
    2 android2
    3 XX_android
    ...
    please choose your dir number:

а затем дождитесь ввода пользователем номера строки x, скрипт считывает номер строки обратно, а затем обрабатывает соответствующий dir. Как мы можем сделать это в раковину ? Спасибо !

6 55

6 ответов:

вместо реализации взаимодействия, можно использовать встроенную команду select.

select d in $(find . -type d -name '*android*'); do
    if [ -n "$d" ]; then
        # put your command here
        echo "$d selected"
    fi
done

nl печатает номера строк:

ls | grep android | nl

Если вы передаете результат в cat можно использовать -n возможность пронумеровать каждую строку следующим образом:

ls | grep "android" | cat -n

передать -n до grep следующим образом:

ls | grep -n "android"

С grep man-page:

 -n, --line-number
        Prefix each line of output with the line number within its input file.

это работает для меня:

line-number=$(ls | grep -n "android" | cut -d: -f 1)

Я использую это в скрипте для удаления разделов моей карты сайта.xml, который я не хочу, чтобы Googlebot сканировал. Я ищу URL (который является уникальным), а затем найти номер строки, используя выше. Используя простую математику, скрипт затем вычисляет диапазон чисел, необходимых для удаления всей записи в XML-файле.

Я согласен с jweyrich относительно обновления вашего вопроса, чтобы получить лучшие ответы.

другие ответы на этой странице на самом деле не ответить на вопрос 100%. Они не показывают, как позволить пользователю интерактивно выбрать файл из другого скрипта.

следующий подход позволит вам сделать это, как видно из примера. Обратите внимание, что select_from_list скрипт был остановлен из этого сообщения 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)

здесь demo.sh и скрипт он использует для выбора элемента из списка, 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 "" ]
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