bash挑选参数

时间:2011-11-07 13:53:01

标签: bash

我想写一个函数,当我有类似下面的内容时

echo 1 2 3|pick

Pick会接受参数,我会用它们做点什么。

我该怎么做?

3 个答案:

答案 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