2011-11-07 40 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