从命令行覆盖bash脚本中的变量

Der*_*rek 30 bash shell scripting

如何从命令行覆盖bash脚本中的变量?我知道如何传递变量,但我只想要类似的东西./myscript.sh -Dvar=val

Sie*_*geX 55

您需要为要覆盖的变量使用参数扩展:

$ cat override.sh
#!/bin/bash

: ${var1:=foo} # var1 will take on the value "foo" if not overridden
var2=${var2:-foo} # same thing but more typing

echo "var1 is $var1 | var2 is $var2"
Run Code Online (Sandbox Code Playgroud)

没有覆盖值

$ ./override.sh
var1 is foo | var2 is foo
Run Code Online (Sandbox Code Playgroud)

使用覆盖值

$ var1=bar var2=baz ./override.sh
var1 is bar | var2 is baz
Run Code Online (Sandbox Code Playgroud)


Dav*_* W. 13

Bash不像Make或Ant.一旦在命令行上设置了宏/属性,这两个程序将不允许您重置它们的值.相反,在BASH中,您必须以允许您从命令行设置这些值而不是在脚本中覆盖它们的方式编写脚本.

您可能希望查看一个内置bash 的getopts命令.这为您提供了一种简单,灵活的方法来解析命令行参数并从命令行设置值.例如,我有四个变量OPT_A,OPT_B,OPT_C,和OPT_D.如果我没有传递参数,它们将获得默认值.但是,我可以在命令行上覆盖该默认值:

 USAGE="$0 [-a <a> -b <b> -c <c> -d <d>]"

 OPT_A="Default Value of A"
 OPT_B="Default Value of B"
 OPT_C="Default Value of C"
 OPT_D="Default Value of D"

 while getopts ':a:b:c:d:' opt
 do
     case $opt in
         a) OPT_A=$OPTARG;;
         b) OPT_B=$OPTARG;;
         c) OPT_C=$OPTARG;;
         d) OPT_D=$OPTARG;;
        \?) echo "ERROR: Invalid option: $USAGE"
            exit 1;;
     esac
done
Run Code Online (Sandbox Code Playgroud)

您还可以导出环境变量以允许BASH脚本访问它们.这样,您可以设置变量并使用该值.

在BASH中,${parameter:=word}构造说如果$parameter设置了,则使用值$parameter.但是,如果$parameter为null或未设置,请word改为使用.

现在,想象一下,如果你这样做:

$ export COMMANDLINE_FOO="FUBAR"
Run Code Online (Sandbox Code Playgroud)

现在为shell脚本设置和读取变量$ COMMANDLINE_FOO

然后,在shell脚本中,您可以执行以下操作:

FOO=BARFU

[...]    #Somewhere later on in the program...

echo "I'm using '${COMMANDLINE_FOO:=$FOO}' as the value"
Run Code Online (Sandbox Code Playgroud)

现在将打印出来

I'm using 'FUBAR' as the value
Run Code Online (Sandbox Code Playgroud)

代替

I'm using 'BARFU' as the value
Run Code Online (Sandbox Code Playgroud)


Mic*_*man 10

您应该使用以下语法指定变量:

MYVAR=74 ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

在脚本中,在设置之前检查它是否已经设置:

if [ ! -z $MYVAR ]; then
    #do something
fi
Run Code Online (Sandbox Code Playgroud)