5

a= b || c正如标题所描述的,在 shell 脚本中进行或赋值(例如)的正确方法是什么,特别是 csh 与 bash?我无法对此进行测试,所以上面的示例可能有效。

我认为这在脚本语言中很常见,但对于那些不太了解的人,变量a将保留bif truthy 的值,否则保留c. 在示例中bc是表达式。

如果提供,用例通常设置为a某种值,否则使用默认值(例如a= $1 || "Foo")。


我不确定投票接近的原因是什么,因为这个问题不是

  • 广阔
  • 模糊的
  • 不完整

如果您需要进一步解释并需要一些修改,请发表评论。

4

3 回答 3

8

对于你想要的 bash

a=${b:-$c}

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

${parameter:-word}

如果参数未设置或为空,则替换单词的扩展。否则,参数的值被替换。

于 2013-06-02T02:16:29.397 回答
4

我相信格伦杰克曼已经明白了,但我想详细说明一下,不适合发表评论。

Shell 脚本不以表达式为导向。它们以命令和文字为导向。Shell 变量默认是字符串(在原始的 Bourne shell 中,无法创建任何其他类型的变量)。作业的 RHS 不是您认为的“表达式”,即使您希望它们是,您的band也不是“表达式”。c

基本的赋值语法是

var=string

右手边只是一个字符串。Shell 提供了几种可用于构建字符串的扩展,这使得可以执行以下操作

var1=string
var2=$var1
var3="This is a ${var1}"
var4=$(ls | wc -l)
var5=$(($var4 + 1))

分配给每个变量的值是 RHS 上的字符串,其中$执行了一些扩展(用 标记)。

最后一个例子 with$((...))是唯一真正包含可以称为“表达式”的东西的例子。双括号扩展适用于算术表达式,因此如果您的bandc是数字,这将是使用的东西。

b因此,您应该停止考虑使用两个子表达式和作为输入来评估表达式的期望结果c,因为这些概念在 shell 语言中并没有以这种方式概括。

如果b是一个变量,并且您想使用未设置变量时使用的默认值来扩展它,则使用${b-c}. 如果您还希望在设置变量但为空时使用默认值,则使用${b:-c}. 这些示例中的thec是一个字符串,并且与 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,你不能说“表达式”,因为在 shell 中没有这样的东西。

于 2013-06-02T03:05:38.890 回答
0

我猜你的意思是这个(在bash中):

a=1
b=2
echo $(( $a | $b ))

结果为3:1 | 2

运算符是|, ^, &, >><<

于 2013-06-02T00:52:03.387 回答