正如标题所描述的那样,在shell脚本中执行or-assignment(例如a= b || c
)的正确方法是什么,特别是csh vs bash?我无法测试这个,所以也许上面的例子可行。
我认为这在脚本语言中很常见,但对于那些不太了解的人来说,变量a
如果真的那么会保留b
的值,否则{{1}的值}}。在示例中,c
和b
是表达式。
如果提供,则用例通常设置为c
某种值,否则使用默认值(例如a
)。
我不确定近距离投票的原因是什么,因为这个问题 不 :
如果您需要进一步解释并需要一些修改,请发表评论。
答案 0 :(得分:6)
对于你想要的bash
a=${b:-$c}
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
${parameter:-word}
如果参数未设置或为null,则替换单词的扩展。否则,参数的值将被替换。
答案 1 :(得分:3)
我相信格伦·杰克曼得到了它,但我想详细说明一点,而不是评论。
Shell脚本不是围绕表达式定向的。他们围绕命令和单词进行定向。 Shell变量默认是字符串(在原始的Bourne shell中,没有办法创建任何其他类型的变量)。作业的RHS不是"表达"你正在考虑它的方式,以及你的b
和c
不是"表达式"要么,即使你希望他们是。
基本的赋值语法是
var=string
右手边只是一根绳子。 shell提供了几种可用于构建字符串的扩展,这使得可以执行诸如
之类的操作var1=string
var2=$var1
var3="This is a ${var1}"
var4=$(ls | wc -l)
var5=$(($var4 + 1))
分配给每个变量的值是RHS上的字符串,其中包含一些扩展(由$
标记)。
最后一个带$((...))
的例子,是唯一一个真正包含可被称为"表达式"的例子。双括号扩展适用于算术表达式,因此如果b
和c
是数字,则可以使用此功能。
因此,您应该停止考虑使用两个子表达式b
和c
作为输入进行评估的表达式所需的结果,因为这些概念并不是这样概括的在shell语言中。
如果b
是变量,并且您希望使用默认值展开它,以便在取消设置变量时使用,则使用${b-c}
。如果您还希望在设置变量时使用默认值但为空,则使用${b:-c}
。这些示例中的c
是一个字符串,与shell中的所有其他字符串一样,它可以使用扩展来构建:
i=3
var=""
echo ${var:-$(cat somefile)} # since var is empty, substitute file contents
echo ${var:-$(($i * $i))} # since var is empty, do some math instead
现在,如果您的b
不是$var
之类的变量,那么您可能会发现以上都不适用!因为${...:-...}
语法用于变量扩展。你真的必须指定b
是什么,你不能说"表达"因为在外壳中没有这样的东西。
答案 2 :(得分:0)
我猜你的意思是(在bash中):
a=1
b=2
echo $(( $a | $b ))
结果为3:1 | 2
运算符为|, ^, &, >>
和<<