bashc-style if语句和样式化技术

bashc-style if语句和样式化技术,bash,if-statement,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'. LIMIT=10 对于bash中的((a=1;a),if语句没有类似b

据我所知,您可以在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'.
LIMIT=10

对于bash中的((a=1;a),if语句没有类似bash中某些语法的
()
eg这样的括号

if [[ ... ]];then
  ..
fi 

if [ ... ];then
 ...
fi

if $(grep .. file) ;then  #note the () is part of $().
  ...
fi

我并不反对Bash,但在我看来,您最好使用一种编程语言,它可以为您的脚本编写/编程工作提供所需的一切,如Python、Ruby或Perl。Bash有一些限制,如执行浮点数学等。此外,如果您的任务够复杂,过度使用*nix工具可能会导致使脚本“臃肿”,从而影响性能。如果要“干净”语法和可维护性,Ruby/Python都可能适合您。在我看来,是否使用括号只是语言设计的考虑因素,如果我有选择的话,我个人不希望使用括号。

如果您因为某种原因不特别喜欢bash,我会鼓励您使用更现代的结构化脚本语言,如Ruby、Python,或PHP,只需使用适当的脚本头就可以使它们像bash脚本一样可执行。我个人非常喜欢控制台上的bash one liners,但当它用作脚本语言时,我发现它是完全迟钝的

大多数现代脚本语言都可以让您轻松访问命令行参数的数组,如
ARGV
,并支持熟悉的循环和控制结构

例如,您可以编写一个Ruby脚本,并在它前面加上
!/usr/bin/Ruby
,如下所示:

#!/usr/bin/ruby
for a in 1..10
  puts ( a >= 5 ) ? "a >= 5" : "a < 5"
end
!/usr/bin/ruby
1..10中的一个
放置(a>=5)?“a>=5”:“a<5”
结束

bash(可能还有
sh
系列的其他shell)的一些语法特性与if有关:

  • 基本if语句的语法为
    if条件命令;then list;fi
    (对于其他分支,可以添加
    elif
    else

    • condition命令
      可以是bash支持的任何命令(我认为是另一个if),然后执行并计算返回值。(实际上,它也可以是一个命令列表,但这可能会让读者感到困惑。最后一个命令的返回值计算条件。)
    • Bash(通常是unixshell)以一种有点不寻常的方式(对于C程序员)解释程序的结果代码:0的结果被解释为true(或“无错误”),而任何其他结果被解释为false(或“发生了某些错误”)。(在C和其他一些语言中,情况正好相反:0是
      false
      ,其他所有内容都是
      true
    • 如果条件命令的结果为0(true),则执行
      列表
      (如果
      的返回值是列表的结果),如果不是-0(false),则不执行列表(但执行
      elif
      else
      分支,如果有)。(如果未执行任何列表,则If的返回值为0。)
  • 一些有用的命令作为条件(这些命令在循环时也作为条件工作):

    • […]
      实际上是编写
      测试…
      的另一种方法-这只是一个命令,根据您给出的参数,它可能返回0(true)或1(false)。(这是shell的内置部分。)
    • […]
      是一个条件表达式命令。它支持一些与
      [
      支持的参数相同的参数,还有一些参数,如括号、
      ..
      用于条件嵌套,并且处理内部的扩展有点不同,因为它是一个特殊的语法构造,而不是buildin命令。整个过程是一个返回0(true)或1(false)的命令
    • ((…)
      是算术表达式(或其中几个)作为命令的包装。当(最后一个)表达式的结果为非0时,结果为0(true);当(最后一个)表达式的结果为0时,结果为1(false)。(您可以改为编写
      let…

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

      • 一元:
        ++
        --
        ++
        -
        ~
        (类似于C)
      • 二进制算术:
        **
        (指数),
        *
        /
        %
        +
        -
      • 位移位:
      • 比较:
        =
        =
        !=
        (我认为它们要么返回1(true),要么返回0(false))
      • 按位:
        &
        ^
        |
      • 逻辑:
        &&
        |
        ,当然还有三元运算符:
        …?…
      • 作业:
        =
        *=
        /=
        %=
        +=
        -=
        &
        ^=
      • 逗号:
        (仅连接两个表达式,返回最后一个表达式的值)
      一般来说,我认为这与C整数表达式非常相似。(这些表达式大致按优先级顺序排列,但有时每个组内部都有划分。有关详细信息,请查看
      info'(bash)Shell算术'

    • true
      是一个不执行任何操作且始终返回0的构建
    • false
      是一个不执行任何操作并始终返回1的构建
    • 您也可以将外部C(或任何其他)程序作为命令调用,其返回值的解释方式相同
  • 清单:

    • (…)
      是在子shell中执行的命令列表。此子shell中的变量赋值不会传播回来
    • {…;}
      是一个命令列表,它不包含
      #!/usr/bin/ruby
      for a in 1..10
        puts ( a >= 5 ) ? "a >= 5" : "a < 5"
      end
      
      if (( i > 0 ))
      then {
         echo "i > 0"
      }
      else {
         echo "i <= 0"
      }
      fi
      
      #!/usr/bin/tcc -run
      #include <stdio.h>
      
      int main()
      {
          printf("Hello World\n");
          return 0;
      }
      
      # I don't like this one so much
      false && echo "false never returns zero" || echo "false returns always 1"
      
      # here the draw-back are back slashes
      test 0 -eq 0 \
        && echo "Surprise, zero is equal to zero" \
        || echo "Apocalypse is near if zero is not zero"