2011-11-07 72 views
0

我想写时,我有类似如下的庆典采摘论据

echo 1 2 3|pick 

匹克然后将采取自变量的函数,我会做一些与他们。

我该怎么做?

+0

应该'pick'试图获得的参数'echo'持有? (即使'echo'被其他命令所取代?) – aioobe

+0

是的,我认为只应该采取参数回声 –

回答

1
 
pick() { 
    read -r arg1 arg2 remainder 
    echo first arg is $arg1 
    echo The remaining args are $remainder 
} 

--edit(响应在评论质疑)

一种方式来遍历参数:

 
pick() { 
    read args; 
    set $args; 
    while test $# -ne 0; do 
    echo $1 
    shift 
    done 
} 

在循环的每个迭代,$ 1指的是一个参数。

+0

如何读取所有参数,因为cuz我可以有10个参数或更多? –

+0

如果你有10个或更多的参数 - 你做错了什么。 –

0

如果我没有弄错,OP希望我做同样的事情:你给它一个字符串,如果字符串包含多个{words,lines},它会给你一个菜单,然后你选择一个,然后它返回你在stdout上选择的那个。

如果只有一个项目,它只是返回它。

这对于 - 使用我的特殊用例 - 日志文件查看器脚本很有用:您给它一个文件名的子字符串,并通过find /var/log -name \*$arg\* -print来查看它可以找到的内容。如果它获得了独一无二的命中,它会将它传回到您的脚本,该脚本的运行较少。如果它不止一次点击,它会显示一个菜单,并让你选择一个。

ISTR KSH对此有一个内建的,但我并没有对它印象深刻;我不记得bash是否有一个。

我在这里是因为我在寻找是否有人在我自己写之前写过它。 :-)

UPDATE:Nope;我自己写的:

下面是一些示例代码:

在/ usr/local/bin目录/味精:

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 

由于我管道名称不太+ FI想用grep出来存档日志文件;这是用于交互式日志查看。

在/ 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 
+1

是的,显然它是'选择': http://www.linuxquestions.org/questions/programming-9/bash-script-using-select-to-show-multi-word-options-like-option-1 -o-317671/ – Baylink

+0

下面是一些示例代码: – Baylink