如何为输出添加行号,提示行,然后根据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
传递-n
到grep
,如下所示:
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.sh
select一个项目的脚本
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