高级bash脚本编写指南 Zsh 开发指南(一):变量和语句

11/27 23:17:40 来源网站:辅助卡盟网

所以这一篇讲最基本的变量和语句。

zsh 有 5 种变量:整数、浮点数(bash 不支持)、字符串、数组、哈希表(或者叫关联数组或者字典,本系列文章统一使用“哈希表”这一名词),另外还有一些其他语言少有的东西,比如 alias(但主要是交互时使用,编程时基本用不到)。此篇只涉及整数、浮点数、字符串,并且不涉及数值计算和字符串处理等内容。

变量定义

Zsh 的变量多数情况不需要提前声明或者指定类型,可以直接赋值和使用(但哈希表是一个例外)。

  1. # 等号两端不能有空格

    % num1=123

    % num2=123.456

    % str1=abcde

    # 如果字符串中包含空格等特殊字符,需要加引号

    % str2='abc def'

    # 也可以用双引号,但和单引号有区别,比如双引号里可以使用变量,而单引号不可以

    % str3="abc def $num1"

    # 在字符串中可以使用转义字符,单双引号均可

    % str4="abc\tdef\ng"

    # 输出变量,也可以使用 print

    % echo $str1

    abcde

    # 简单的数值计算

    % num3=$(($num1 + $num2))

    # (( 中的变量名可以不用 $

    % num3=$((num1 + num2))

    # 简单的字符串操作

    % str=abcdef

    # 2 4 都是字符在数组的位置,从 1 开始数,逗号两边不能有空格

    % echo $str[2,4]

    bcd

    # -1 是最后一个字符

    % echo $str[4,-1]

    def

    变量比较

    1. # 比较数值

      % num=123

      # (( )) 用于数值比较等操作,如果为真返回 0,否则返回 1

      # && 后边的语句在前边的语句为真时才执行

      # 双等号可以替换成单等号,可以根据自己的习惯选用,其他多数地方也是如此

      # 本系列文章统一使用双等号,因为使用双等号的常用编程语言更多些

      % ((num == 123)) && echo good

      good

      # (( 里边可以使用与(&&)或(||)非(!)操作符,同 c 系列语言

      % ((num == 1 || num == 2)) && echo good

      # 比较字符串

      % str=abc

      # 比较字符串要用 [[,内侧要有空格,字符串最好用引号包含,避免产生语法错误

      # 不需要 x"$str" == x"abc" 之类的用法

      % [[ "$str" == "abc" ]] && echo good

      good

      # 可以和空字符串 "" 比较,未定义的字符串和空字符串比较结果为真

      # [[ 里也可以用 && || !,但不能随意加小括号,[[ 的用法比 (( 要严格很多

      % [[ "$str" == "" || "str" == "123" ]] && echo good

      语句

      稍微了解下简单变量的使用后,快速进入语句部分。

      zsh 支持多种风格的语法,包括经典的 posix shell (bash 的语法和它类似,但有一些扩展,可以归为一类)的,以及 csh 风格的等等。但 posix shell 的语法并不好用,我们没必要一定使用这个。我只选用一种我认为最方便简洁的语法,没有fi、then、do、done、esac、in等的关键字(虽然其中某些关键字其他编程语言也有,但基本用法都各异高级bash脚本编写指南,而且容易混淆),也不需要多余的分号。如果不确定语法是否符合预期,可以定义一个函数然后使用which查看,内容会被转化成原始(posix shell 风格)的样子。熟悉 bash 并且喜欢使用 bash 语法的读者可以跳过这部分内容,语法的不同并不影响后续内容的阅读,继续使用 bash 风格语法写 zsh 也是没有问题的。

      条件语句

      1. # 格式

        if [[ ]] {

        } elif {

        } else {

        }

        大括号也可以另起一行,本系列文章统一使用这种风格,缩进为 4 个空格。注意elif不可写作else if。

        [[ ]]用于比较字符串、判断文件等,功能比较复杂多样,这里先使用最基础的用法。注意尽量不要用[[ ]]比较数值,因为不留神的话,数值会被转化成字符串来比较,没有任何错误提示,但结果可能不符合预期,导致不必要的麻烦。

        1. # 样例

          if [[ "$str" == "name" || "$str" == "value" ]] {

             echo "$str"

          }

          (( ))用于比较数值,里边可以调用各种数值相关的函数,格式类似 c 语言,变量前的$可省略。

          1. # 格式

            if (( )) {

            }

            1. # 样例

              if ((num > 3 && num + 3 < 10)) {

    暂无相关资讯
高级bash脚本编写指南 Zsh 开发指南(一):变量和语句