1. if [ 条件 ] ;then
    2. statement1 #条件成立后声明的内容
    3. elif [ 条件2 ];then
    4. statement2
    5. elif [ 条件3 ];then
    6. statement3
    7. ……
    8. else
    9. statementn
    10. fi
    11. [ -f "somefile" ] #判断文件是否存在
    12. [ -d "testResults/" ] #判断目录testResults/是否存在
    13. [ -x "/bin/ls" ] #判断/bin/ls文件是否存在并有可执行权限
    14. [ -n "$var" ] #判断$var变量是否有值
    15. [ "$a" = "$b" ] #判断$a和$b是否相等
    16. [ -a FILE ] 如果 FILE 存在则为真。
    17. [ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
    18. [ -e FILE ] 如果 指定的文件或目录存在时返回为真。
    19. [ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
    20. [ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
    21. [ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
    22. [ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。
    23. [ -z STRING ] 如果STRING的长度为零则为真 ,即判断是否为空,空即是真;
    24. 案例:
    25. [root@localhost ~]# cat if.sh
    26. #!/bin/bash
    27. mysqlpath=/usr/local/mysql
    28. nginx=/usr/local/nginx/bin/nginx
    29. if [ -f $nginx ];then
    30. echo "$nginx"
    31. elif [ -d $mysqlpath ];then
    32. echo "mysql 路径$mysqlpath"
    33. else
    34. echo "莫得"
    35. fi
    36. [root@localhost ~]# sh if.sh
    37. mysql 路径/usr/local/mysql
    38. [root@localhost ~]# sh if.sh 1 1
    39. 相等
    40. [root@localhost ~]# sh if.sh 1 2
    41. 不想等
    42. [root@localhost ~]# cat if.sh
    43. a=$1
    44. b=$2
    45. if [ $a = $b ];then
    46. echo "相等"
    47. else
    48. echo "不想等"
    49. fi
    for bt  in  t1 t2    #by in t1 t2  定义循环体
    do
      command1           #循环的命令1 
      command2                     #循环的命令2
    done
    
    
    for ((i=1;i<9;i++));do 
        echo "$i"
    done
    
    
    for i in {1..10}
    do
        echo $(expr $i \* 3 + 1);
    done
    
    案例:
    [root@localhost ~]# cat if.sh 
    a=$1
    b=$2
    if [ $a = $b ];then
        for i in `expr $a + $b `;do
        echo "$i 次"
        done
    else
        echo "不想等"
    fi
    [root@localhost ~]# sh if.sh 3 3
    6 次
    [root@localhost ~]# sh if.sh 1 1
    2 次
    [root@localhost ~]# sh if.sh 1 2
    不想等
    
    case expression in     #expression 判断条件
        pattern1)                         
            statement1    #如果 condition1 成立,那么就执行 if 后边的 statement1;                
            ;;                        #如果 condition1 不成立,那么继续执行 elif,判断 condition2
        pattern2)
            statement2
            ;;
        pattern3)
            statement3
            ;;
        ……
        *)
            statementn        #如果所有的 if 和 elif 判断都不成立,就进入最后的 else,执行 statementn
    esac
    
    
    案例:
    [root@localhost ~]# cat case.sh 
    echo "1.mysql 2.nginx 3.lnmp"
    read -p "输入 1-3 或者 mysql nginx lanp " M
    case  $M in
        1|mysql)
        echo "mysql"    
        ;;
        nginx|[2n])
        echo "nginx"
        ;;
        3|lnmp)
        echo "lnmp"
        ;;
        *)
    echo "请输入 1-3 或 mysql nginx lanp"
    esac
    [root@localhost ~]# sh case.sh 
    1.mysql 2.nginx 3.lnmp
    输入 1-3 或者 mysql nginx lanp 1
    mysql
    [root@localhost ~]# sh case.sh 
    1.mysql 2.nginx 3.lnmp
    输入 1-3 或者 mysql nginx lanp 2
    nginx
    [root@localhost ~]# sh case.sh 
    1.mysql 2.nginx 3.lnmp
    输入 1-3 或者 mysql nginx lanp 3
    lnmp
    [root@localhost ~]# sh case.sh 
    1.mysql 2.nginx 3.lnmp
    输入 1-3 或者 mysql nginx lanp n
    nginx
    [root@localhost ~]# sh case.sh mysql
    1.mysql 2.nginx 3.lnmp
    输入 1-3 或者 mysql nginx lanp mysql
    mysql
    [root@localhost ~]# sh case.sh 
    1.mysql 2.nginx 3.lnmp
    输入 1-3 或者 mysql nginx lanp la^H^H
    请输入 1-3 或 mysql nginx lanp
    [root@localhost ~]# sh case.sh 
    1.mysql 2.nginx 3.lnmp
    输入 1-3 或者 mysql nginx lanp lnmp
    lnmp
    
    字段介绍
    *    表示任意字符串。
    [abc]    表示 a、b、c 三个字符中的任意一个
    [m-n]    表示从 m 到 n 的任意一个字符
    |    表示多重选择,类似逻辑运算中的或运算
    
    while expression  #循环条件
    do
       statement1   #循环内容
    done
    
    案例:
    [root@localhost ~]# cat  while.sh
    #!/bin/bash
    i=1
    while [ $i -lt 10 ]
    do
        echo "$i"
        i=`expr  $i + 1`
    done
    [root@localhost ~]# sh  while.sh 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    [root@localhost ~]# cat while.sh 
    [root@localhost ~]# cat d.sh 
    #!/bin/bash
    read -p "请输入三角形的高:" h
    i=1
    while [ $i -le $h ]
    do
            j=1 
            while [ $j -le $i ]
            do
                    echo -n "*"
                    let j++ 
            done
            echo
            let i++ 
    done
    
    函数介绍
    Shell 中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别
    
    语法:
    #!/bin/bash
    function name() {
        statements  #命令语句及代码
        [return value]
    }
    
    name   #函数调用
    
               $@表示函数的所有参数,$?表示函数的退出状态(返回值)
    字段介绍:
    function是 Shell 中的关键字,专门用来定义函数;
    name是函数名;
    statements是函数要执行的代码,也就是一组语句;
    return value表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写
    
    
    示例1:
    function install_hint(){
        echo "选择需要安装的程序"
        echo "docker"
        echo "nginx"
        echo "mysql"
        echo "php"
        echo "redis"
        echo "zabbix"
        echo "lnmp"
        info "默认安装lnmp"
    }
    install_hint
    
    示例2:
    
    function install_hint(){
         local a=1   #local定义临时变量 只可在当前函数使用的变量    
         if  [ ! "$a" -eq 0 ];then  #判断$a是否不等于0   #!取反 当结果是正确的时候加!T变F
               echo "123"
         fi  
    }
    install_hint
    
    my_array=(A B "C" D)
    
    echo "第一个元素为: ${my_array[0]}"
    echo "第二个元素为: ${my_array[1]}"
    echo "第三个元素为: ${my_array[2]}"
    echo "第四个元素为: ${my_array[3]}"
    
    a=1
    for ((i=0;i<4;i++));do
      echo "第`expr $i + 1`个值${my_array[$i]}"
      # echo "第$[i+a]个值${my_array[$i]}"
    done
    
    n=$1                                                    #传参变量
    path=/usr/local/nginx           #可直接定义路径
    command=`ls -d`                                 #调用命令
    game=(石头 剪刀 布)                            #可直接定义内容
    num=$[RANDOM%3]                 #产生一个0-2的随机数
    computer=${game[$num]}          #将定义的内容以 0为石头 1为剪刀 2为布 结合
    
    $!  #上一个参数的路径
    $USER #系统当前登录用户
    $?  #命令执行状态  0成功 1-255错误
    $FN
    $NR
    
    介绍下Shell中的${}、##和%%使用范例,本文给出了不同情况下得到的结果。
    假设定义了一个变量为:
    代码如下:
    file=/dir1/dir2/dir3/my.file.txt
    可以用${ }分别替换得到不同的值:
    ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
    ${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
    ${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
    ${file##*.}:删掉最后一个 .  及其左边的字符串:txt
    ${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
    ${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
    ${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
    ${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my
    记忆的方法为:
    # 是 去掉左边(键盘上#在 $ 的左边)
    %是去掉右边(键盘上% 在$ 的右边)
    单一符号是最小匹配;两个符号是最大匹配
    ${file:0:5}:提取最左边的 5 个字节:/dir1
    ${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
    也可以对变量值里的字符串作替换:
    ${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
    ${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
    
    $0    当前脚本的文件名
    $n    传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
    $#    传递给脚本或函数的参数个数。
    $*    传递给脚本或函数的所有参数。
    $@    传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
    $?    上个命令的退出状态,或函数的返回值。
    $$    当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
    
    -d :判断制定的是否为目录
    -z:判断制定的变量是否存在值
    -f:判断制定的是否为文件
    -L:判断制定的是否为符号链接
    -r:判断制定的是否可读
    -s:判断存在的对象长度是否为0
    -w:判断制定的是否可写
    -x:判断存在的对象是否可以执行
    !:测试条件的否定符号
    
    [ $a -eq $b ]    ==   #比较两边数值是否相等
    [ $a -ne $b ]    !=   #比较两边数值是否不相等
    [ $a -gt $b ]    >    #比较左边数值是否大于右边
    [ $a -lt $b ]    <    #比较左边数值是否小于右边
    [ $a -ge $b ]    >=   #比较左边数值是否大于等于右边
    [ $a -le $b ]    <=   #比较左边数值是否小于等于右边
    
    
    
    a=`expr 1 + 4`
    a=`expr 1 \* 4`
    
    
    i=2
    y=3
    a=$[i+y+9]
    
    echo "$((1+3))"
    
    read -p "fsdfd"   a
    
    echo $a