如何将相同的命名参数放入数组中

时间:2017-04-14 19:01:41

标签: arrays bash shell

我是Shell脚本的新手。我需要替换文件中的少量字符串值。必须从命令行读取它们,shell脚本如下所示。

test.sh --old-value yahoo.com --new-value ibibo.io  --old-value xxxxxx --new-value yyy --exclude aa bb cc

现在,我希望将--old-values读取到一个数组中,将--new - 值转换为其他数组,并将--exclude转换为另一个数组。

我正在尝试以下方法。

  while [[ $# -gt 1 ]]
  do
    key="$1"

    case $key in



       --old-value)
       OLDVALUE="$2"
       shift # past argument
       ;;

       --new-value)
       NEWVALUE="$2"
       shift # past argument
       ;;

        --exclude)
        EXCLUDEFILETYPES=("$@")
       shift
        ;;

       *)
      # unknown option
    ;;
 esac
 shift # past argument or value
done   

但是这会将旧值读入OLDVALUE。我必须将两个--old-values读入数组。

有人可以帮忙知道如何实现这个用例吗?

2 个答案:

答案 0 :(得分:1)

#!/bin/bash

# declare arrays
old=(); new=(); exclude=()

while [[ $# -gt 1 ]]; do
  key="$1"
  value="$2"
  [[ $key == --old-value ]] && old+=("$value")
  [[ $key == --new-value ]] && new+=("$value")
  [[ $key == --exclude   ]] && shift && exclude+=("$@")
  shift 2
done

# show content of arrays
declare -p old new exclude

我认为--exclude aa bb cc是最后一个参数。

示例:./test.sh --old-value yahoo.com --new-value ibibo.io --old-value xxxxxx --new-value yyy --exclude aa bb cc

输出:

declare -a old='([0]="yahoo.com" [1]="xxxxxx")'
declare -a new='([0]="ibibo.io" [1]="yyy")'
declare -a exclude='([0]="aa" [1]="bb" [2]="cc")'

答案 1 :(得分:0)

另一种变体:

old: yahoo.com
old: xxxxxx
new: ibibo.io
new: yyy
exc: aa
exc: bb
exc: cc

输出

--old-value yahoo.com --new-value --old-value xxxxxx --new-value yyy --exclude aa bb cc

当然,这仍有问题。例如,如果脚本被称为

old: yahoo.com
new: --old-value
exc: 

注意缺少的新值参数。在这种情况下,结果当然是错误的......

Windows.scss: 

.metroItemType1{
width:50%;
height:50px;
margin:3px;
}

.metroItemType2 {
width: 25%;
height: 50px;
margin: 3px;
}

.metroItemType3 {
width: auto;
height: 34px;
margin: 3px;
}

处理此类错误案例需要更复杂的状态处理。