2011-02-03 102 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 

难道有人知道更短的代码来解析参数比这上面?