2011-02-03 106 views
8
$myscript.sh -host blah -user blah -pass blah 

我想將參數傳遞給它。分析shell腳本參數

我已經習慣了做$1$2$3 ....但我要開始給它們命名

+2

考慮不選擇選項,而是通過環境傳遞值:例如「host = hostname user = me myscript.sh」 – 2011-02-03 17:25:11

+0

http://stackoverflow.com/questions/192249/how-do-i-parse-command -bash-arguments-in-bash,它比較純粹的bash switch,getopts(POSIX shell內置)和getopt(非推薦,除非它是util-linux版本,並且你使用它非POSIX功能,以避免與空參數問題,等等。) – 2015-09-05 04:35:15

回答

13

有很多的方式SH解析參數。 Getopt很好。下面是手工解析事物的簡單腳本:

#!/bin/sh 

while echo $1 | grep -q ^-; do 
    eval $(echo $1 | sed 's/^-//')=$2 
    shift 
    shift 
done 

echo host = $host 
echo user = $user 
echo pass = $pass 
echo args = [email protected] 

樣品運行的樣子:

$ ./a.sh -host foo -user me -pass secret some args 
host = foo 
user = me 
pass = secret 
args = some args 

請注意,這不是因爲腳本的eval的一個,甚至遠程強大的和大規模開放安全 孔由用戶構造的字符串。這僅僅是 ,意在作爲一種可能的做事方式的例子。更簡單的方法是要求用戶在環境中傳遞數據。在Bourne shell(即任何不在CSH家族):

$ host=blah user=blah pass=blah myscript.sh 

工作得很好,並且變量$host$user$pass將在腳本可用。

#!/bin/sh 
echo host = ${host:?host empty or unset} 
echo user = ${user?user not set} 
... 
9
+0

@Zac很好的接收,謝謝。 – 2011-02-03 03:58:56

+1

請注意,`getopts`是一個Bash內建函數,而`getopt`是一個外部實用程序。前者只適用於較短的選項(例如`-e`),而後者也適用於較長的選項(例如`-foo`)。請注意,有一些[問題](http://mywiki.wooledge.org/BashFAQ/035),必須解決後者(後續版本的`getopt`問題較少)。 – 2014-03-14 00:50:59

6

這裏有一個簡單的方法來處理長期和短期的選項:在這種格式

while [[ $1 == -* ]]; do 
    case "$1" in 
     -h|--help|-\?) show_help; exit 0;; 
     -v|--verbose) verbose=1; shift;; 
     -f) if (($# > 1)); then 
      output_file=$2; shift 2 
      else 
      echo "-f requires an argument" 1>&2 
      exit 1 
      fi ;; 
     --) shift; break;; 
     -*) echo "invalid option: $1" 1>&2; show_help; exit 1;; 
    esac 
done 

How can I handle command-line arguments (options) to my script easily?

0

我採用上面威廉Pursell例子(與丹尼斯·威廉姆森的建議)的參數: script -param1 = value1 -param2 = value2 ...

這裏是帶有單行參數解析器的代碼(將其保存在文件'腳本'中) :

#!/bin/bash 

while echo $1 | grep ^- > /dev/null; do declare $(echo $1 | sed 's/-//g' | sed 's/=.*//g' | tr -d '\012')=$(echo $1 | sed 's/.*=//g' | tr -d '\012'); shift; done 

echo host = $host 
echo user = $user 
echo pass = $pass 

你把它叫做這樣的:

script -host=aaa -user=bbb -pass=ccc

和結果是

host = aaa 
user = bbb 
pass = ccc 

難道有人知道更短的代碼來解析參數比這上面?