如何在不编写所有其他输入变量的情况下将变量传递给bash脚本

时间:2016-12-05 18:24:59

标签: bash

我正在编写一个bash脚本,它接受多个输入变量(最多7个),但只有前4个是必需的。 其余3个是可选的,并且已经在脚本中设置,除非在从终端提示符调用脚本时指定。

当我想只更改一个可选变量时,我的问题出现了。例如,如果我想更改第7个变量,我还必须记下第5和第6个变量值,否则脚本会认为这是第5个参数,当然不是第7个参数。我怎么能这样做?

以下是我的脚本现在的部分示例:

#!/bin/bash

tstart=$1
tstop=$2
coord1=$3
coord4=$4
optional1=${5:-100}
optional2=${6:-50000}
optional3=${7:-4}

...

调用脚本时,如果我想更改变量optional3,我还要编写optional1和optional2的vaules。有没有类似的方式:

$ myscript.sh var1 var2 var3 var7=vaule_7

(类似于你在python中对函数中的默认变量值所做的)

非常感谢!!!

佩尔。

2 个答案:

答案 0 :(得分:1)

排序。首先,更改脚本,使其使用环境变量代替可选参数的位置参数。

#!/bin/bash

tstart=$1
tstop=$2
coord1=$3
coord4=$4
: ${optional1:=100}
: ${optional2:=50000}
: ${optional3:=4}

要使用三者中任何一个的值调用脚本,之前使用作业进行调用:

$ optional3=value_7 myscript.sh var1 var2 var3 var4

您可以设置一个shell选项,其中任何参数看起来像一个赋值将被视为与命令前环境修饰符相同。

$ set -k
$ myscript.sh var1 var2 var3 var4 optional3=value_7

答案 1 :(得分:0)

如果您希望脚本中的参数位置不重要,您可能需要考虑这种方法,您可以将它们命名,然后解析列表以将参数分配给正确的变量。

例如你可以这样:

while [ $# -gt 0 ]; do
    case $1 in
        -strt)  tstart=$2 ; shift  ;;
        -stp) tstop=$2 ; shift  ;;
        -crd1) coord1=$2 ; shift ;;
        -crd4) coord4=$2 ; shift ;;
        -opt1) optional1=$2 ; shift ;; 
        -opt2) optional2=$2 ; shift ;;
        -opt3) optional3=$2 ; shift ;; 
        (*) echo "$0: error - unrecognized option $1" 1>&2;;
    esac
   shift
done

'我要做的是读取位置1中的参数以了解它对应的情况和赋值给变量的值2,然后将所有参数从1移到左边,你在案例均值之外有另一个移位位置3中的参数现在位于位置1,参数4现在位于位置2,依此类推,直到您用完要分配的参数。

然后,您可以使用如下所示的内容调用脚本:

myscript.sh -strt var1 -stp var2 -crd1 var3 -crd4 val4 -opt3 val7

你有4个强制参数加上你的第3个可选参数,你可以按任意顺序输入