我想写一个函数,当我有类似下面的内容时
echo 1 2 3|pick
Pick会接受参数,我会用它们做点什么。
我该怎么做?
答案 0 :(得分:2)
您在寻找xargs吗?
答案 1 :(得分:1)
pick() { read -r arg1 arg2 remainder echo first arg is $arg1 echo The remaining args are $remainder }
- 编辑(回复评论中的问题)
循环参数的一种方法:
pick() { read args; set $args; while test $# -ne 0; do echo $1 shift done }
在循环的每次迭代中,$ 1引用一个参数。
答案 2 :(得分:0)
如果我没有弄错的话,OP想要我做同样的事情:你给它一个字符串,如果字符串包含多个{words,lines},它会显示一个菜单,你选择一个,然后它返回你在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,我想要删除存档的日志文件;这是用于交互式日志查看。
的/ usr / local / bin中/挑:
# 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/tty