2012-07-25 75 views
0

我正在处理一个shell脚本,它必须从传递的参数中提取字符串。如果我传递的参数,如shell脚本从参数中提取字符串

 test.sh arg1=someArgument Arg2=AnoTherArgument 

假设用户可以传递参数,在任何情况下,名称和值,

我要提取的参数和操作,有些东西一样

 for arg in "[email protected]" 
     do 
      if [ lower("${arg}") == "arg1" ] then 
       # extract arg1's value and do something 
      elif [ lower("${arg}") == "arg2" ] then 
       # extract arg2's value and do something 
      fi 
     done 

请帮助我如何在传递相同的情况下提取参数值?

+1

这是不使用''==内有效POSIX通过环境传递的东西'''';改为使用一个等号“=”。另外,您定位的是哪个外壳和版本? bash 4内置了用于将变量转换为大写和小写的参数扩展运算符,而无需使用诸如tr之类的外部工具。 – 2012-07-25 12:41:04

+0

你不应该改变你的问题,因为标题不一致,如果它解决了你的问题,接受答案 – 2012-07-25 12:43:49

回答

0

使用双括号来匹配glob模式;分号 “然后”

if [[ "$arg" = a=* ]];then echo ${arg#a=};fi 

if [ "${arg%%=*}" = a ];then echo ${arg#a=};fi 

了解更多信息

man bash 
/Parameter Expansion 
+0

我已编辑帖子。请看一看。传递的参数名称可以是任何类型。如果是这样,我可以使用tr [:upper:] [:lower:]将参数转换为小写,但是我怎样才能提取用户传递的相同大小的参数值。 – Mojoy 2012-07-25 12:27:32

2

为了清楚起见,我更喜欢这样的情况下语句之前需要:

while [ $# -gt 0 ] 
do 
    case $1 in 
    a=*) echo ${1#a=};; 
    b=*) echo ${1#b=};; 
    # etc 
    esac 
    shift 
done 
+0

我已编辑帖子。请看一看。传递的参数名称可以是任何类型。如果是这样,我可以使用tr [:upper:] [:lower:]将参数转换为小写,但是如何以用户传递的相同大小提取参数的值?请帮帮我。 – Mojoy 2012-07-25 12:26:41

+0

'[Aa] [Rr] [Gg] 1)echo $ {1#[Aa] [Rr] [Gg] 1} ;;' – tripleee 2012-07-25 14:13:08

+0

完全相同:只将每个参数的第一部分转换为tr [:可能是这样的(假设每个参数只有一个等号):'case $(echo $ {1%= *} | tr [:upper:] [:lower:])in; arg1)echo $ {1#* =} ;; ; esac'(抱歉显示不良) – Bentoy13 2012-07-25 15:57:20

0

为什么还要努力解析参数?

foo

#!/bin/sh 
echo Value of arg1: ${arg1-default value} 

然后:

$ arg1=blah ./foo 
Value of arg1: blah 

$ ./foo 
Value of arg1: default value