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

时间:2013-04-18 04:56:21

标签: bash shell unix

很明显,使用shell脚本这种事情可以通过多种方式(比大多数编程语言更多)完成,因为所有不同的变量扩展方法和程序,如test和{{ 1}}和[等等。

现在我只是在寻找

[[

意思是,我的DIR变量应该包含第一个arg或当前目录中指定的内容。

这与DIR=$1 or . 之间有什么区别?

我发现连字符语法令人困惑,并寻求更易读的语法。

为什么我不能这样做?

DIR=${1-.}

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

3 个答案:

答案 0 :(得分:52)

我在这里看到几个问题。

  1. “我能写出真正反映这种逻辑的东西”

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

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

    如果${1-.}未设置,语法.会扩展为$1,但如果$1设置为$1,则会扩展为$1 - 即使${1:-.}设置为空字符串。

    如果.未设置或设置为空字符串,则语法$1会扩展为$1。仅当$1设置为空字符串以外的其他内容时,它才会像DIR="$1" || '.'一样展开。

  3. “为什么我不能这样做? ||

    因为这是bash,而不是perl或ruby或其他语言。 (原谅我的嗤之以鼻。)

    在bash中,DIR="$1" || '.'分隔整个命令(从技术上讲,它将管道分开)。它没有分开表达式。

    因此DIR="$1"表示“执行'.',如果退出时使用非零退出代码,请执行{{1}}”。

答案 1 :(得分:4)

这个怎么样:

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

$#是给予脚本的参数数量,-gt表示“大于”,因此您基本上将DIR设置为默认值,如果用户指定了一个参数,然后你将DIR设置为那个。

答案 2 :(得分:0)

我使用一个简单的辅助函数使这些分配看起来更简洁。下面的函数可以接受任意数量的参数,但返回的第一个参数不是空字符串。

FETCH_POKEMONS