当我有如下代码时,我想写一个函数
echo 1 2 3|pick然后,Pick将获取参数,我将对它们做一些处理。
我该怎么做呢?
发布于 2011-11-07 22:31:52
你在找xargs吗?
发布于 2011-11-20 07:13:19
如果我没记错的话,OP的目的与我相同:您向它提供一个字符串,如果该字符串包含多个{word,line},它将显示一个菜单,您选择一个菜单,然后返回您在stdout上选择的菜单。
如果只有一项,它就会返回它。
这对于--使用我的特殊用例--日志文件查看器脚本很有用:您给它一个文件名的子字符串,它会遍历find /var/log -name \*$arg\* -print查看它能找到什么。如果它得到一个唯一的命中,它会把它交回给你的脚本,脚本对它运行的次数会更少。如果它有不止一次点击,它会显示一个菜单,让你选择一个。
ISTR说KSH有一个内置的,但我对它印象不深;我不记得bash有没有。
我在这里是因为在我自己写它之前,我正在寻找是否有人已经写了它。:-)
更新:不,我自己写的:
下面是一些示例代码:
/usr/local/bin/msg:
PATH=$PATH:/usr/local/bin
[ $UID = 0 ] || exec sudo su root -c "$0 $*"
FILE=/var/log/messages
[ $# -eq 1 ] &&
FILE=`find /var/log/ -name \*$1\* -print |
egrep -v '2011|.[0-9]$' |
pick`
echo "$FILE"
less +F $FILE由于我将名称转换为less +F,因此我希望grep出归档日志文件;这是为了交互式日志查看。
/usr/local/bin/pick:
# Present the user a bash Select menu, and let them pick
# Try to be smart about multi-line responses
# must take input on stdin if it might be multiline
# get multiline input from stdin
while read LINE </dev/stdin
do
CHOICES+=( $LINE )
done
# add on anything specified as arguments
while [ $# -gt 0 ]
do
CHOICES+=( $1 )
shift
done
# if only one thing to pick, just pick it
if [ ${#CHOICES[*]} -eq 1 ]
then
echo $CHOICES
exit
fi
# eval set $CHOICES
select CHOSEN in ${CHOICES[@]}
do
echo $CHOSEN
exit
done </dev/ttyhttps://stackoverflow.com/questions/8037374
复制相似问题