Bash c风格if语句和样式技巧

Lim*_*ime 7 bash if-statement

根据我的理解,你可以在bash中使用C-style for和while循环.

LIMIT=10

for ((a=1; a <= LIMIT ; a++))  # Double parentheses, and "LIMIT" with no "$".
do
  echo -n "$a "
done                           # A construct borrowed from 'ksh93'.
Run Code Online (Sandbox Code Playgroud)

甚至是三元运营商.

(( var0 = var1<98?9:21 ))
Run Code Online (Sandbox Code Playgroud)

你会怎么做这个if声明?

另外他们为什么不在C中实现大括号呢?什么是使用这些关键字,如逻辑done,do,if,和fi?我将编写一些脚本,但bash看起来非常不同.

有没有任何bash样式技术或bash替代品/插件?我想遵循标准,但来自C,Java和PHP背景bash看起来很奇怪.可维护性和标准很重要.

Paŭ*_*ann 12

bash(以及可能是其他sh家族的贝壳)的一些语法特性与if有关:

  • 基本的if语句具有语法if condition-command ; then list ; fi(可以添加elif和else其他分支).

    • 的condition-command可以是打坏支撑件(甚至另一个如果,我认为)任何命令,则执行,然后返回值被评估.(实际上,它也可以是一个命令列表,但这可能会使读者感到困惑.最后一个命令的返回值会计入条件.)
    • Bash(和一般的Unix shell)以一种不寻常的方式解释程序的结果代码(对于C程序员):0的结果被解释为true(或"无错误"),并且任何其他结果被解释为false(或"发生了一些错误").(在C和其他一些语言中,它是相反的:0是false,其他一切都是true.)
    • 如果condition-command的结果为0(true),list则执行(并且返回值if是列表的结果).如果它不是-0(假),则不执行列表(但是如果有,则为分支elif或else分支).(如果没有执行任何列表,则if的返回值为0.)
  • 一些有用的命令作为条件(这些也作为条件while loops):

    • [ ... ]实际上是另一种写入方式test ...- 这只是一个可能返回0(真)或1(假)的命令,具体取决于您给出的参数.(这是shell的构建.)
    • [[ ... ]]是一个条件表达式命令.它支持一些相同的论点的[支持,多一些像括号<,>和(... )为条件筑巢,并处理扩展内部有点不同,因为它是一个特殊的语法结构,而不是命令的buildin.整个事情是一个返回0(真)或1(假)的命令.
    • (( ... ))是一个算术表达式(或其中几个)作为命令的包装器.当(last)表达式的结果为非0时,结果为0(true),当(last)表达式的结果为0时,结果为1(false)let ....(您可以改为写入.)

      在算术表达式中,shell变量可以不使用$,并且所有内容都被解释为整数(固定宽度,但我没有找到哪个).您可以使用以下运算符:

      • 一元:++,--,+,-,!,~(如在C)
      • 二进制算术:**(求幂), ,*,/,,%+-
      • 位移:<<,>>
      • 比较:<=,>=,<,>,==,!=(我认为这回是1(真)或0(假))
      • 按位:&,^,|
      • 逻辑:&&,||当然还有三元运算符:... ? ... : ...
      • 分配:=,*=,/=,%=,+=,-=,<<=,>>=,&=,^=,|=
      • 逗号:( ,只需连接两个表达式,返回最后一个的值)

      我认为一般来说这很像C整数表达式.(这些大致按优先顺序排列,但有时每组内部都存在分歧.请查看info '(bash)Shell Arithmetic'详细信息.)

    • true 是一个什么也不做的buildin总是返回0.
    • false 是一个什么都不做的buildin总是返回1.
    • 您也可以将外部C(或其他任何)程序称为命令,它们的返回值以相同的方式解释.
  • 列表:

    • ( ... )是一个命令列表,在子shell中执行.此子shell中的变量赋值不会传播回来.
    • { ...; } 是一个命令列表,它不会创建子shell.
    • ; 是列表中命令的简单分隔符,但也可以用换行符替换.
    • && 是仅在第一个返回0时执行第二个命令的命令的分隔符.
    • || 是仅当第一个返回not-0时执行第二个命令的命令的分隔符.
    • & 是命令的分隔符,并行执行两个命令(后台的第一个命令).

所以,你可以if用一些大括号和括号编写你的命令,但是你仍然需要你的then和fi:

if (( i > 0 ))
then {
   echo "i > 0"
}
else {
   echo "i <= 0"
}
fi
Run Code Online (Sandbox Code Playgroud)

这里的括号只是多余的,因为之间的命令then,else并且fi是(每)一个列表反正.(另请注意需要新线或;在此处关闭括号之前和之后.)

但正如其他人所说,如果你想使用类似C的语法,最好使用另一种语言.