shell 代码在调用代码时更改变量

shell 代码在调用代码时更改变量

我写了很少的 shell 代码,但我需要在调用代码时更改变量如何做到这一点

例子

./shell.sh --varaible="New Value"

应该输出

New Value,Some Value

外壳程序

variable="Old Value"
variable2="Some Value"

echo "$variable,$variable2"

答案1

如果脚本显式设置变量的值,则无法从命令行更改脚本中变量的值。

但是,您可以以考虑命令行参数的方式设置变量的值。


命令行中给出的参数将可供 shell 脚本使用位置参数 $1$2$3ETC。

要将变量设置为第一个位置参数,您可以使用

variable="$1"

所以,你的脚本可能看起来像

#!/bin/sh

variable="$1"
variable2="Some Value"

echo "$variable,$variable2" # or printf '%s,%s\n' "$variable" "$variable2"

...并且会被称为

$ ./script.sh "New Value"

输出将是

New Value,Some Value

提供一个默认变量的值,你可以这样做

variable="${1:-Old Value}"

在上面的脚本中使用它,输出将显示Old Value,Some Value是否未使用任何命令行参数调用脚本。


以下简短的脚本对三个命令行标志 、-a-b进行正确的命令行解析-c。标志-a-b接受参数,而不-c接受参数。它使用三个变量 、var_avar_bvar_c它们的默认值可以通过使用命令行标志来覆盖。

最后,脚本显示这些变量的值,并且还显示命令行上可能给出的其他内容。

#!/bin/sh

var_a=12
var_b="yellow"
var_c=0

while getopts 'a:b:c' opt; do
    case "$opt" in
        a) var_a=$OPTARG ;;
        b) var_b=$OPTARG ;;
        c) var_c=1 ;;
        *) echo 'command line parsing error' >&2
           exit 1
    esac
done

shift $(( OPTIND - 1 ))

printf 'var_a = %s\nvar_b = %s\nvar_c = %s\n' \
    "$var_a" "$var_b" "$var_c"

if [ "$#" -gt 0 ]; then
    echo 'Other operands:'
    printf '%s\n' "$@"
fi

运行几次:

$ ./script.sh
var_a = 12
var_b = yellow
var_c = 0

$ ./script.sh -b "green tea" "hello world"
var_a = 12
var_b = green tea
var_c = 0
Other operands:
hello world

$ ./script.sh -c my other car is a cdr
var_a = 12
var_b = yellow
var_c = 1
Other operands:
my
other
car
is
a
cdr

$ ./script.sh -a -d
var_a = -d
var_b = yellow
var_c = 0

$ ./script.sh -a
./script.sh[15]: -`a' requires argument
command line parsing error

$ ./script.sh -a "boo!" "help!" -c
var_a = boo!
var_b = yellow
var_c = 0
Other operands:
help!
-c

相关内容