Bash命令行参数,替换变量的默认值

38

我有一个脚本,它有几个输入文件,通常这些默认存储在标准位置并由脚本调用。

然而,有时需要使用更改的输入来运行它。

在当前的脚本中,我有三个变量 $A $B 和 $C。现在我想用非默认的 $B 来运行它,明天我可能想用非默认的 $A 和 $B 来运行它。

我看了一下如何解析命令行参数:

如何在Bash中解析命令行参数?

如何处理有时通过命令行参数设置一些变量的情况?

我没有足够的声誉点来回答自己的问题。但是,我有一个解决方案:

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

#!/bin/bash
a=input1
b=input2
c=input3
while getopts  "a:b:c:" flag
do
    case $flag in
        a) a=$OPTARG;;
        b) b=$OPTARG;;
        c) c=$OPTARG;;
    esac
done

4
你可以使用 getopts 来实现这个目的。有很多教程可供参考,比如 http://aplawrence.com/Unix/getopts.html 可以作为一个起点。 - fedorqui
谢谢,我在我链接的问题中看到了这个。 我想知道是否有一些标准的方法来使命令参数覆盖变量。例如,在Python中定义函数时,可以设置默认值。 我可以看到使用if检查可以用命令行参数替换默认值,但不确定是否有标准的方法来做到这一点? - Lanrest
2个回答

88

你可以按以下方式操作。请参阅Bash手册页面上的Shell参数展开

#! /bin/bash

value=${1:-the default value}
echo value=$value
在命令行上:
$ ./myscript.sh
value=the default value
$ ./myscript.sh foobar
value=foobar

8

除了使用命令行参数覆盖默认值之外,您还可以在脚本外部设置变量。例如,下面的脚本可以通过foo=54 /tmp/foobarbar=/var/tmp /tmp/foobar来调用:

#! /bin/bash
: ${foo:=42}
: ${bar:=/tmp}
echo "foo=$foo bar=$bar"

1
我考虑过这个问题,但我正在编辑的脚本是为那些比我还不熟悉的人设计的。我想尽可能简单化,而且我认为命令行参数是他们更熟悉的东西。 - Lanrest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接