Bash:如何从参数中设置一个变量,并使用默认值

问题描述:

很明显,使用shell脚本编程,这种事情可以通过很多方式完成(比绝大多数编程语言),因为所有不同的变量扩展的方法和程序,如test[[[Bash:如何从参数中设置一个变量,并使用默认值

现在我只是在寻找

DIR=$1 or . 

含义,我的DIR变量应包含什么是在第一个参数指定或当前目录。

this和DIR=${1-.}有什么区别?

我发现连字符语法混乱,并寻求更可读的语法。

为什么我不能这样做?

DIR="$1" || '.' 

我猜这意味着“如果$ 1为空,分配仍然有效(DIR变为空),所以无效命令'。'永远不会被执行。“

+0

我发现我的答案是冒号的含义:http://wiki.bash-hackers.org/syntax/pe#use_a_default_value – 2013-04-18 05:07:26

+2

拥抱语言。并非所有的语言都有相同的习语。 'DIR = $ {1: - 。}'是在任何POSIX兼容shell中表达这种逻辑的完美自然方式。 – chepner 2013-04-18 12:26:36

+1

我发现downvote是完全合理的。我不喜欢我写这个问题的方式。我猜,那时我很沮丧。但是自从我发布这个版本以来,我从来没有遇到过任何记忆'$ {VAR:-default}'语法的麻烦。我要编辑我的问题,以减少它。我相信你不是downvoter @chepner,但你是绝对正确的! – 2017-02-02 19:29:16

我在这里看到几个问题。

  1. “我能写的东西,实际上反映了这一逻辑”

    是。有几种方法可以做到这一点。这里有一个:

    if [[ "$1" != "" ]]; then 
        DIR="$1" 
    else 
        DIR=. 
    fi 
    
  2. “是什么这个和DIR=${1-.}之间的区别?”

    语法${1-.}扩展到.如果$1没有设置,但扩展像$1如果$1设置,即使$1是设置为空字符串。

    如果$1未设置或设置为空字符串,语法${1:-.}将扩展为.。如果$1设置为空字符串以外的值,它将像$1一样扩展。

  3. “为什么我不能这样做? DIR="$1" || '.'

    因为这是bash,而不是perl或ruby或其他语言。 (请原谅我的猥亵行为。)

    在bash中,||分隔了整个命令(从技术上说,它将管道分开)。它不分开表达式。

    因此DIR="$1" || '.'的意思是“执行DIR="$1",如果退出代码为非零退出代码,则执行'.'”。

如何:

DIR=. 
if [ $# -gt 0 ]; then 
    DIR=$1 
fi 

$#是给脚本的参数的数量和-gt意味着“大于”,所以你基本上设置DIR为默认值,如果用户指定一个参数,然后你设置DIR

+1

这并不可怕,尽管四行绝对看起来对我来说太冗长了。我宁愿使用连字符变量扩展,因为我已经知道它在这一点上意味着什么。 – 2013-04-18 05:05:40