如何为输出添加行号,提示行,然后根据input行动?

我写了这样一个shell脚本:

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

输出是:

 android1 android2 xx_android ... 

我想在每个文件中添加一个数字,如下所示:

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

然后等待用户input行号x,脚本读取行号,然后处理相应的目录。 我们怎么能在shell中做到这一点? 谢谢 !

而不是实现交互,你可以使用内置的命令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 

如果你把结果input到cat ,你可以使用-n选项为每一行编号,如下所示:

 ls | grep "android" | cat -n 

传递-ngrep ,如下所示:

 ls | grep -n "android" 

grep手册页:

  -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) 

我在脚本中使用它来删除我不希望Googlebot抓取的sitemap.xml部分。 我searchURL(这是唯一的),然后使用上面find行号。 然后使用简单的math计算脚本来计算删除XML文件中的整个条目所需的数字范围。

我同意jweyrich有关更新您的问题,以获得更好的答案。

在这个页面上的其他答案实际上不回答这个问题100%。 他们不显示如何让用户交互地从另一个脚本中select文件。

以下的方法可以让你做到这一点,在这个例子中可以看到。 请注意, select_from_list脚本是从这个stackoverflowpost

 $ 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.shselect一个项目的脚本

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