Ответ 1
Вместо реализации взаимодействия вы можете использовать встроенную команду select
.
select d in $(find . -type d -name '*android*'); do
if [ -n "$d" ]; then
# put your command here
echo "$d selected"
fi
done
Я написал оболочку script следующим образом:
#! /bin/sh
...
ls | grep "android"
...
а выход:
android1
android2
xx_android
...
Я хочу добавить число в каждый файл, например:
1 android1
2 android2
3 XX_android
...
please choose your dir number:
а затем дождитесь ввода строки ввода пользователя x, script считывает номер строки, затем обрабатывает соответствующий каталог. Как мы можем это сделать в оболочке? Спасибо!
Вместо реализации взаимодействия вы можете использовать встроенную команду 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-страницы:
-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)
Я использую это в script для удаления разделов моего файла sitemap.xml, который я не хочу сканировать Googlebot. Я ищу URL (который является уникальным), а затем найдите номер строки, используя приведенное выше. Используя простую математику, script затем вычисляет диапазон чисел, необходимых для удаления всей записи в файле XML.
Я согласен с jweyrich относительно обновления вашего вопроса, чтобы получить лучшие ответы.
Другие ответы на этой странице на самом деле не отвечают на вопрос 100%. Они не показывают, как разрешить пользователю интерактивно выбирать файл из другого script.
Следующий подход позволит вам сделать это, как видно из примера. Обратите внимание, что select_from_list
script был вытащен из этого сообщения 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
и script он использует для выбора элемента из списка, 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 "[email protected]"
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