zoukankan      html  css  js  c++  java
  • shell学习笔记

    1. shell脚本参数

    • $n 表示传递给脚本的第n个参数,例如$1 表示第1个参数,$2表示第2个参数....
    • $# 命令行参数的个数
    • $0 当前脚本的名称
    • $* 以“参数1 参数2 参数3...”的形式返回所有参数的值
    • $@ 以“参数1”“参数2”“参数3”...的形式返回所有参数的值
    • $_ 保存之前执行的命令的最后一个参数
    • $? 前一个命令或者函数的返回状态码
    • $$ 返回本程序的进程ID(PID)

    注:变量$@可以以“参数1”“参数2”“参数3”..的形式返回所有的参数的值,因此,$@与“$1”"$2""$3"...是等价的;如果用户传递的参数中包含空格或者其他的特殊字符,需要使用$@来获取所有的参数的值,不能使用$*。


    2. 变量和引用

    • 在shell中,变量名的大小写是敏感的,因此,大小写不同的两个变量名并不代表同一个变量。
    • m=${x/acd/1}---将x中的acd变成1并赋值给m。
      # x=acdqw12
      # m=${x/acd/1}
      # echo $m
      #m=1qw12
    • 3种引号的不同:单引号('')括起来的字符都作为普通字符出现--全引用;双引号(“”)括起来的字符除“$” “” “'” “"”这几个字符仍保留其特殊功能外,其余字符仍作为普通字符对待--部分引用;反引号(``)括起来的字串被shell解释为命令,在执行时,shell首先执行该命令,并以它的标准输出结果取代整个反引号部分。
    • 反斜线“”称为转义字符,用于将一些shell中的特殊字符转换为普通字符,例如“$”或者“'”等.
      # echo $SHELL
      # /bin/bash;
      
      # echo $SHELL
      # $SHELL.
    • 按照惯例,shell中的环境变量全部使用大写字母表示。
    • 命令替换:反引号和圆括号是等价的;
      `shell_command`==$(shell_command)
    • 变量赋值语法:variable_name=value;variable_name表示变量名;value表示将要赋值给变量的值;中间的等号“=”称为赋值符号,赋值符号的左右两边不能直接跟空格,否则shell会将其视为命令;正确的赋值语句:
      # v1=Linux
      # v2='RedHet Linux'
      # v3="Redhat Linux $HOSTTYPE"
      # v4=12345.
    • 清除变量:
      unset variable_name

    3. 条件测试

    • 条件测试的语法有两种:test和[;test expression;[ expression ]; expression与左右方括号之间也必须都保留一个空格。
    • 在测试运算符“=”、“!=”、“-z”等符号的左右两边,一定含有一个空格。
    • 整数测试语法:
      test number1 op number2或者[ number1 op number2 ]
      op表示运算符;运算符:-eq (等于);-ne(不等于);-gt(大于);-lt(小于);-ge(大于等于);-le(小于等于);[ 12 -gt 14 ]-->echo $? 1。
    •  文件测试语法:
      test op file或者[ op file ]
      -a file文件是否存在;-b file 文件是否存在且为块文件;-c file 文件是否存在且为字符文件;-d file 文件是否存在且为目录;-e file同-a一样;-s file 文件的长度是否大于0或者文件为非空文件;-f file 文件存在且为常规文件;-w file 文件是否存在且可写;-x file 文件是否存在且可执行;-r file 文件是否存在且可读;-u file 文件是否设置suid位;-l file 文件是否存在且为符号链接。
    • 逻辑操作符:字符串测试、整数测试、以及文件都是提供了一个测试条件,而在shell编程中,经常遇到同时判断多个条件的情况,逻辑操作符可以把多个不同的条件组合起来,从而构成一个复杂的条件表达式;
      ! expression 逻辑非
      expression -a expression2 逻辑与
      expression1 o expression2 逻辑或
    • “:”冒号是一个特殊的命令,指空命令,该命令不做任何事情,但是它的退出状态永远是0,如果我们将改命令作为if语句中的条件,则会永远执行then子句。
    • 条件判断语句:if
      if expression
      then
         statement1
         statement2
         ...
      fi
      或者

      if expression;then
      statement1
      statement2
      fi

      if else

      #!/bin/bash
      echo "please enter a score" #输入提示信息
      read score #读取用户输入数据
      
      #如果用户没有输入数字,提示用户重新输入
      if [ -z "$score" ];then  #-z是否为空串
         echo "You enter nothing.Please enter a score:"
         read score
      else 
      #如果用户输入的数据不对,则重新输入
          if [ "$score" -lt 0 -o "$score" -gt 100 ]; then
            echo "The score should be between 0 and 100.Please enter   again:"
            read score
          else 
      #输出A
              if [ "$score" -ge 90 ]; then
                 echo "The grade is A."
              else
      #输出B
                  if [ "$score" -ge 80 ]; then
                      echo "The grade is B."
                  else
      #输出C
                       if [ "$score" -ge 70 ]; then
                            echo "The grade is C."
                       else
      #输出D
                            if [ "$score" -ge 60 ]; then
                                echo "The grade is D."
                            else
      #输出E
                                 echo "The grade is E."
                             fi
                        fi
                   fi
               fi
           fi
      fi

       if elif

      #!/bin/bash
      echo "please enter a score" #输入提示信息
      read score #读取用户输入数据
      
      #如果用户没有输入数字,提示用户重新输入
      if [ -z "$score" ];then  #-z是否为空串
         echo "You enter nothing.Please enter a score:"
         read score
      else 
      #如果用户输入的数据不对,则重新输入
          if [ "$score" -lt 0 -o "$score" -gt 100 ]; then
            echo "The score should be between 0 and 100.Please enter   again:"
            read score
          else 
      #输出A
              if [ "$score" -ge 90 ]; then
                 echo "The grade is A."
      #输出B
              elif [ "$score" -ge 80 ]; then
                  echo "The grade is B."
      #输出C
              elif [ "$score" -ge 70 ]; then
                  echo "The grade is C."
      #输出D
              elif [ "$score" -ge 60 ]; then
                  echo "The grade is D."
              else
      #输出E
                  echo "The grade is E."
               fi
           fi
      fi

      case

      case variable in
      value1)
          statement1
          statement2
          ...
          statementn;;
      value2)
           statement1
           statement2
           ...
           statementn;;
      ...
      valuen)
           statement1
           statement2
           ...
           statementn;;
      *)
           statement1
           statement2
           ...
           statementn;;
      esac

      在上面的语法中,variable是一个变量,case语句会将该变量的值与value1~valuen中的每个值进行比较,如果与某个value的值相等,则执行该value所对应的一组语句。当遇到“;;”符号的时候,就跳出case语句,执行esac语句后面的语句,如果没有任何一个值与variable的值相匹配,则执行*后面的一组语句。

            注:对于上面的case语句,用户应该注意以下几点:

             i 对于变量名variable,可以使用双引号,也可以不使用;

             ii 每个case子句中的条件测试部分,都以右括号“)”结束;

             iii 每个case子句都以一对分号“;;”作为结束符,在脚本执行的过程中,当遇到一对分号时,会跳过当前case子句后面的所有的case子句,包括*所对应的子句,执行esac子句后面的其他语句。

            iv case语句结构以esac结尾。

    4. 计算运算表达式

    • expr expression 计算某个表达式的值 使用expr时,需要对运算符号进行转移,*  (  )  .
      #!/bin/bash
      result=`expr 2 - 100`
      echo "$result"
      
      result=`expr 2 * 100`
      echo "$result"
      
      
      result=`expr ( 2 - 6 ) * 2`
      echo "$result"
    • 使用$(( )) 来进行算术运算,无需对运算符和括号做转移处理。
      #!/bin/bash
      result=$((3+6))
      echo "$result"
      
      
      result=$((3*6))
      echo "$result"
    • 使用$[...] 与$(())用法相同
    • 使用let命令可以执行一个或者多个算术表达式,其中的变量名无需使用$符号,如果表达式中含有空格或其他特殊字符,则必须将其引用起来。
      #!/bin/bash
      n=10
      let n=n+1
      echo "$n"
      
      let n=n*10
      echo "$n"

    5. 位运算符

    运算符 说明 举例
    << 左移 4<<2,将4左移2位,结果为16
    >> 右移 8>>2,将8右移2位,结果为2
    & 按位与 8&&4,将8和4进行按位与运算,结果为0
    | 按位或 8|4,将8和4进行按位或运算,结果为12
    ~ 按位非 ~8,将8进行按位非运算,结果为-9
    ^ 按位异或 10^6,将10和6进行按二进制位异或运算,结果为12

             左移位是将整个数字的所有二进制位左移相应的数量,每移一位,相当于将当前的数字乘以2;右移与左移相对;&是将两个数的二进制位进行与运算,都为1才为1,有一个为0,则为0;|或运算与&相对,二进制位全为0才为0;非运算是将原来二进制位的1和0调换;异或是全为1或全为0,结果就是1,否则为0。

    6. 自增自减运算符

    运算符 说明
    ++variable 先将变量variabe的值加1,然后再赋给variable
    --variable 先将变量variabe的值减1,然后再赋给variable
    variable++ 先使用variable的值,然后再将该变量的值加1
    variable-- 先使用variable的值,然后再将该变量的值减1

    7. 数字常量的进制

       默认情况下,shell总以十进制来表示数字;在shell中用户可以使用两种语法来表示不同的进制,一:增加前缀,以o开头表示八进制,以ox开头表示十六进制;        二:使用#,例如2#100表示二进制,8#42表示八进制。

    #!/bin/bash
    
    #十进制
    ((x=20))
    echo "$x"
    
    20
    
    #八进制
    ((x=o20))
    echo "$x"
    
    16
    
    #二进制
    ((x=2#100))
    echo "$x"
    
    4
    #八进制
    ((x=8#123))
    echo "$x"
    
    83

    8. for循环结构

       8.1 带列表的for循环语句

    for variable in {list}
    do
       statement1
       statement2
       ...
    done

         variable为循环变量,list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开。do和done之间的所有语句称为循环体。

    for var in 1 2 3 4 5 6 7 8
    do
       echo "the number is $ var"
    done
    
    等价
    
    for var in {1..8}
    do
       echo "the number is $var"
    done

          for语句的默认步长是1,如果想设定步长,基本语法:

    for varibale in {start..end..step}
    do
       statement1
       statement2
       ..
    done

         start表示起始的数值,end表示终止的数值,step表示步长。

    类似C风格的for循环语句:

    for ((i=1;i<5;i++))
    do
        echo "$i"
    done

    9. until 循环语句

      与for相反,条件为0时不执行循环体,条件为1时执行循环体,并且是先判断条件结果再执行循环体:

    until expression
    do  
       statement1
       statement2
       ..
    done

    #!/bin/bash
    i=1
    until [ "$i" -eq 21 ]
    do
    useradd uaer$i
    echo "password" | passwd --stdin user$i > /dev/null
    let "i++"
    done

          useradd是一个shell命令,用来向系统中添加新用户,passwd也是一个shell命令,用来设置用户密码的。

    10. while循环语句

         与until语句相反,条件为0时执行while循环语句,非0,执行done后面的语句:

    while expression
    do
       statement1
       statement2
       ..
    done

          与for循环相比,while循环条件的变化通常在循环体内部,例如某个循环变量的自增或者结束标记的赋值等。而for循环的条件变化通常在for语句中括号的第3个部分,until语句的条件变化也通常放在循环体内部。

    更新中。。。。。

  • 相关阅读:
    streamsets 集成 cratedb 测试
    streamsets k8s 部署试用
    streamsets rest api 转换 graphql
    StreamSets sdc rpc 测试
    StreamSets 相关文章
    StreamSets 多线程 Pipelines
    StreamSets SDC RPC Pipelines说明
    StreamSets 管理 SDC Edge上的pipeline
    StreamSets 部署 Pipelines 到 SDC Edge
    StreamSets 设计Edge pipeline
  • 原文地址:https://www.cnblogs.com/Alysa-lrr/p/6027606.html
Copyright © 2011-2022 走看看