很明显,使用shell脚本这种事情可以通过多种方式(比大多数编程语言更多)完成,因为所有不同的变量扩展方法和程序,如test
和{{ 1}}和[
等等。
现在我只是在寻找
[[
意思是,我的DIR变量应该包含第一个arg或当前目录中指定的内容。
这与DIR=$1 or .
之间有什么区别?
我发现连字符语法令人困惑,并寻求更易读的语法。
为什么我不能这样做?
DIR=${1-.}
我猜这意味着“如果$ 1为空,分配仍然有效(DIR变空),所以无效命令'。'永远不会被执行。“
答案 0 :(得分:52)
我在这里看到几个问题。
“我能写出真正反映这种逻辑的东西”
是。有几种方法可以做到。这是一个:
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"
表示“执行'.'
,如果退出时使用非零退出代码,请执行{{1}}”。
答案 1 :(得分:4)
这个怎么样:
DIR=.
if [ $# -gt 0 ]; then
DIR=$1
fi
$#
是给予脚本的参数数量,-gt
表示“大于”,因此您基本上将DIR
设置为默认值,如果用户指定了一个参数,然后你将DIR
设置为那个。
答案 2 :(得分:0)
我使用一个简单的辅助函数使这些分配看起来更简洁。下面的函数可以接受任意数量的参数,但返回的第一个参数不是空字符串。
FETCH_POKEMONS