Bash:如何从参数中设置一个变量,并使用默认值
很明显,使用shell脚本编程,这种事情可以通过很多方式完成(比绝大多数编程语言),因为所有不同的变量扩展的方法和程序,如test
和[
和[[
等Bash:如何从参数中设置一个变量,并使用默认值
现在我只是在寻找
DIR=$1 or .
含义,我的DIR变量应包含什么是在第一个参数指定或当前目录。
this和DIR=${1-.}
有什么区别?
我发现连字符语法混乱,并寻求更可读的语法。
为什么我不能这样做?
DIR="$1" || '.'
我猜这意味着“如果$ 1为空,分配仍然有效(DIR变为空),所以无效命令'。'永远不会被执行。“
我在这里看到几个问题。
-
“我能写的东西,实际上反映了这一逻辑”
是。有几种方法可以做到这一点。这里有一个:
if [[ "$1" != "" ]]; then DIR="$1" else DIR=. fi
-
“是什么这个和
DIR=${1-.}
之间的区别?”语法
${1-.}
扩展到.
如果$1
没有设置,但扩展像$1
如果$1
设置,即使$1
是设置为空字符串。如果
$1
未设置或设置为空字符串,语法${1:-.}
将扩展为.
。如果$1
设置为空字符串以外的值,它将像$1
一样扩展。 -
“为什么我不能这样做?
DIR="$1" || '.'
“因为这是bash,而不是perl或ruby或其他语言。 (请原谅我的猥亵行为。)
在bash中,
||
分隔了整个命令(从技术上说,它将管道分开)。它不分开表达式。因此
DIR="$1" || '.'
的意思是“执行DIR="$1"
,如果退出代码为非零退出代码,则执行'.'
”。
如何:
DIR=.
if [ $# -gt 0 ]; then
DIR=$1
fi
$#
是给脚本的参数的数量和-gt
意味着“大于”,所以你基本上设置DIR
为默认值,如果用户指定一个参数,然后你设置DIR
。
这并不可怕,尽管四行绝对看起来对我来说太冗长了。我宁愿使用连字符变量扩展,因为我已经知道它在这一点上意味着什么。 – 2013-04-18 05:05:40
我发现我的答案是冒号的含义:http://wiki.bash-hackers.org/syntax/pe#use_a_default_value – 2013-04-18 05:07:26
拥抱语言。并非所有的语言都有相同的习语。 'DIR = $ {1: - 。}'是在任何POSIX兼容shell中表达这种逻辑的完美自然方式。 – chepner 2013-04-18 12:26:36
我发现downvote是完全合理的。我不喜欢我写这个问题的方式。我猜,那时我很沮丧。但是自从我发布这个版本以来,我从来没有遇到过任何记忆'$ {VAR:-default}'语法的麻烦。我要编辑我的问题,以减少它。我相信你不是downvoter @chepner,但你是绝对正确的! – 2017-02-02 19:29:16