linux变量默认值,使用bash中的单个命令为shell变量分配默认值
发布日期:2021-08-20 01:25:46 浏览次数:9 分类:技术文章

本文共 3535 字,大约阅读时间需要 11 分钟。

我对bash(3.00)shell脚本中的变量进行了大量测试,如果没有设置该变量,那么它将指定一个默认值,例如:

if [ -z"${VARIABLE}" ]; then

FOO='default'

else

FOO=${VARIABLE}

fi

我似乎记得在一行中这样做有一些语法,类似于三元运算符,例如:

FOO=${ ${VARIABLE} : 'default' }

(尽管我知道那不管用…)

我是疯了,还是存在这样的东西?

bash shell引用的shell参数扩展部分是一个很好的起点:tiswww.case.edu/php/chet/bash/bashref.html shell扩展。

用于shell参数扩展的gnu.org文档(提示:还有很多其他很酷的东西可以做!)

实际上,非常接近你发布的内容:

FOO=${VARIABLE:-default}  # If variable not set or null, use default.

或者,也可以将default分配给VARIABLE:

FOO=${VARIABLE:=default}  # If variable not set or null, set it to default.

如果我想在文档中找到这个,那么谷歌会做什么呢?使用诸如$:-这样的特殊字符进行谷歌搜索并不容易。

作为对solarmist的回应:"bash variable assignment default"让我进入这个页面,并用"variable ass"搜索bash的手册页面,在~5'下一个'之后让我进入正确的部分。

请注意,它不是bash特定的,将与整个shell系列一起工作。它对通用脚本是安全的。

有人知道这是为什么吗?:-,:=语法相当神秘…

@solarmist的关键词是"bash参数扩展",如果您想了解更多关于它及其伙伴的信息。

-和:=之间的区别是什么?

@Jocelyndelaland我确认:我尝试在一个共同的配置文件中,它是由我在Git版本的家中使用的bash和zsh提供的,它在这两者上都很好地工作。

@andrew the:=在许多其他的shell替换语句中非常清晰和直观。

我用了这些术语best way to set var defaults in shell script。把我弄到这儿来了。

subjectAltname=$1:-$subject_alt_name:-$defaultSubjectAltna‌&8203;我…是3个选项的语法…这里的第一个默认值是传递给脚本的第一个参数,否则使用env变量,否则使用脚本变量。

下面是关于unix.stackexchange.com/a/122848/2407主题的更深入的解释。

@乔舒奥尔森·埃多克斯(Joshualson EDOCX1)(1)

这一页有一个很好的备忘单解释了所有这些:stackoverflow.com/a/1675353536/5359531

如果我想使用shell命令而不是变量呢?例如:foo=$cat some_file—-null

这在Bourne Shell的/bin/sh中有效,还是只在bash(和ksh,zsh中有效?

@乔舒奥尔森谷歌"bash env or default"把我带到这里:—)

对于命令行参数:

VARIABLE=${1:-DEFAULTVALUE}

它将传递给脚本的第一个参数的值赋给VARIABLE,如果没有传递该参数,则赋给DEFAULTVALUE的值。

如果变量相同,则

:"${VARIABLE:=DEFAULT_VALUE}"

如果未定义,将默认值赋给变量。双引号可防止全局搜索和分词。

另请参见bash手册第3.5.3节"shell参数扩展"。

我发现自己一次又一次地提到这个!!!!

这一诡计对我来说并不明显,它使用了内置的:无效果(no-effect)来吃美元的膨胀,但留下了变量集。到目前为止,我一直在这样做:variable="$variable:-default"并且对于使用变量两次感到很笨拙。

事实证明,这并不总是适用于bash-builtin变量。这很奇怪。目前我所知道的是HISTTIMEFORMAT。

如何设置多个默认值?我试过":$variable:=默认值:$variable2:=默认值",但这似乎不起作用…

@汉斯:冒号是命令(什么都不做),因此只需要一次。如: ${FOO:=DEFAULT1} ${BAR:=DEFAULT2}。

即使您可以像默认值一样使用另一个变量的值

有文件的

#!/bin/bash

variable1=$1

variable2=${2:-$variable1}

echo $variable1

echo $variable2

运行./defvalue.sh first-value second-value输出

first-value

second-value

运行./defvalue.sh first-value输出

first-value

first-value

感谢您展示一个1美元2美元的示例…

见3.5.3节(外壳参数扩展)

所以在你的情况下

${VARIABLE:-default}

回答你的问题和所有变量替换

echo"$\{var}"

echo"Substitute the value of var."

echo"$\{var:-word}"

echo"If var is null or unset, word is substituted for var. The value of var does not change."

echo"2- $\{var:=word}"

echo"If var is null or unset, var is set to the value of word."

echo"$\{var:?message}"

echo"If var is null or unset, message is printed to standard error. This checks that variables are set correctly."

echo"$\{var:+word}"

echo"If var is set, word is substituted for var. The value of var does not change."

还有一种方法可以更简洁地表达你的"if"结构:

FOO='default'

[ -n"${VARIABLE}" ] && FOO=${VARIABLE}

这有利于与早期外壳的X兼容性

这有利于与OSXbash兼容。

fwiw,您可以提供这样的错误消息:

USERNAME=${1:?"Specify a username"}

这将显示类似这样的消息,并退出代码1:

./myscript.sh

./myscript.sh: line 2: 1: Specify a username

更完整的例子:

#!/bin/bash

ACTION=${1:?"Specify 'action' as argv[1]"}

DIRNAME=${2:-$PWD}

OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}}

echo"$ACTION"

echo"$DIRNAME"

echo"$OUTPUT_DIR"

输出:

$ ./script.sh foo

foo

/path/to/pwd

/tmp

$ export HOMEDIR=/home/myuser

$ ./script.sh foo

foo

/path/to/pwd

/home/myuser

$ACTION取第一个参数的值,如果为空则退出

$DIRNAME是第二个参数,默认为当前目录

$OUTPUT_DIR是第三个参数,或$HOMEDIR(如有定义),否则,/tmp。这在OSX上有效,但我不确定它是便携式的。

下面是一个例子

#!/bin/bash

default='default_value'

value=${1:-$default}

echo"value: [$value]"

将此保存为script.sh并使其可执行。不带参数运行

./script.sh

> value: [default_value]

用参数运行它

./script.sh my_value

> value: [my_value]

转载地址:https://blog.csdn.net/weixin_32141627/article/details/116911694 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:linux猜拳游戏代码,在Linux下通过gtk做一个简单的小游戏(猜拳)
下一篇:linux统计数据为未知的行数,Linux统计行数命令wc(转)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月10日 09时31分09秒