37

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

现在我只是在寻找

DIR=$1 or .

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

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

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

为什么我不能这样做?

DIR="$1" || '.'

我猜这意味着“如果 $1 为空,则分配仍然有效(DIR 变为空),因此无效命令'。' 永远不会被处决。”

4

3 回答 3

68

我在这里看到几个问题。

  1. “我能写出真正反映这种逻辑的东西吗?”</p>

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

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

    语法${1-.}扩展为.if $1is unset,但扩展为$1if $1is set — 即使$1设置为空字符串。

    语法${1:-.}扩展为.如果$1未设置或设置为空字符串。它$1仅在$1设置为空字符串以外的其他内容时才会扩展。

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

    因为这是 bash,而不是 perl 或 ruby​​ 或其他一些语言。(原谅我的冷嘲热讽。)

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

    所以DIR="$1" || '.'意味着“执行DIR="$1",如果以非零退出代码退出,则执行'.'”。

于 2013-04-18T05:11:36.847 回答
4

这个怎么样:

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

$#是给脚本的参数数量,-gt意思是“大于”,所以你基本上设置DIR为默认值,如果用户指定了一个参数,那么你设置DIR为那个。

于 2013-04-18T05:00:02.647 回答
1

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

default_value() {
    # Return the first non-empty argument
    while [[ "$1" == "" ]] && [[ "$#" -gt "0" ]]; do
        shift
    done
    echo $1
}
x=$(default_value "$1" 0)
于 2019-07-19T16:57:14.270 回答