zoukankan      html  css  js  c++  java
  • shell 入门基础

    一、 Shell变量

      1. 变量可分为两类: 环境变量(全局变量) 和 局部变量 。

        环境变量 : 所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、shell脚本和各类应用 。 

             环境变量可以在命令行中设置,但用户退出时这些变量值也会丢失,因此最好在用户家目录下的.bash_profile文件中或全局配置

              /etc/bashrc、/etc/profile文件或者/etc/profile.d/ 中定义 。 将环境变量放入profile文件中 , 每次用户登录时这些变量值都将被初始化

             所有环境变量均为大写。

             环境变量应用于用户进程前,必须用export命令或source或"."命令导出。

             通过百度 查看一些linux常用的系统环境变量。

             常用的环境变量 : 

               (1) 修改 history命令显示的历史命令记录数:  HISTFILESIZE=5  

                                    HISTSIZE=5

               (2) 查看系统文件的类型:  $HOSTTYPE

               (3) 查看系统主机名:  $HOSTNAME

        局部变量 : 

             定义变量 : (1) 变量名=value

                    (2) 变量名='value' , 使用单引号中的内容是什么就是什么,里面如果有变量是不会进行解析的。

                    (3) 变量名="value" , 使用双引号引的内容中,如果有变量会将变量解析成内容进行显示

             考题 : a = 192.168.1.2

                  b = '192.168.1.2'

                  c = "192.168.1.2"

                  a = 192.168.1.2 - $a

                  b = '192.168.1.2 - $a'

                  c = "192.168.1.2 - $a"

                  echo "a = $a"

                  echo "b = $b"

                  echo "c = ${c}"

                  注:  $a 与 ${c} 是一样的效果

               答案 : a = 192.168.1.2 - 192.168.1.2

                 b = 192.168.1.2 - $a

                 c = 192.168.1.2 - 192.168.1.2 - 192.168.1.2

             将变量作为内容的两种方式:

                (1) cmd = `date + %F`

                (2) cmd = $(date + %F)

               什么时候使用${var}这种带大括号的场景 ?

                如: tar -xzvf fcz_$pwd_log.tar.gz  ,系统不知道是pwd做为变量 还是 pwd_log做为变量

                  此时如果使用大括号 tar -xzvf fcz_${pwd}_log.tar.gz 明确告诉系统pwd是变量,而pwd_log不是变量 。

        shell 特殊变量 : 

          (1) 位置变量

            $0 获取当前执行的shell脚本的文件名 

            fcz.sh中的内容 : echo $0

            sh  fcz.sh  =>  fcz.sh

            sh  /root/fcz.sh  =>  /root/fcz.sh     // 这种运行方式,会将路径一起打印出来

            fcz.sh中的内容 : dirname $0  =>  /root

            fcz.sh中的内容 : basename $0  =>  fcz.sh

              $n  获取第n个参数,当n>=10时,要在数字上添加{}  ,即${10}

            $*  获取当前shell的所有参数,将所有的命令行参数视为单个字符串

            $#  获取当前shell命令行中参数的总个数

            $@  获取这个程序的所有参数 "$1" "$2" "$3" "$4" "..." , 这是将参数传递给其他程序的最佳方式,因为它会保留所有内嵌在每个参数里的任何空白。

          (2) 进程状态变量

            $$  获取当前shell的进程号 ( PID )

            $!  执行上一个指令的PID 

            $?  获取执行上一个指令的返回值 ( 0为成功,非零为失败)

              $?的使用场景 : 1. 编程时判断语句是否执行成功

                      2. 控制台执行语句时,判断上一条语句是否执行成功 .   echo  $?

              $?返回值参考:

                0 : 表示运行成功

                2 : 权限拒绝

                1 ~ 125 : 表示运行失败,脚本命令、系统命令错误或参数传递错误

                126 : 找到该命令了,但是无法执行

                127 : 未找到要运行的命令

                >128 : 命令被系统强制结束

                提示 : 在脚本调用,一般用 exit 0 , 函数 return 0

        bash 内部变量:

          由shell本身提供,常用的内部命令有: echo , eval , exec , export , readonly , read , shift , wait , exit 和 (.) 等

          

      二、 变量的子串操作

        1. ${#string} : 返回$string的长度

        2. ${string:position} : 在$string中,从位置$position之后开始提取子串

        3. ${string:position:length} : 在$string中,从位置$position之后开始提取长度为$length的子串

        4. ${string#substring} : 从变量$string开头开始删除最短匹配$substring子串

        5. ${string##substring} : 从变量$string开头开始删除最长匹配$substring子串

        6. ${string%substring} : 从变量$string结尾开始删除最短匹配$substring子串

        7. ${string%%substring} : 从变量$string结尾开始删除最长匹配$substring子串

        8. ${string/substring/replace} : 使用$replace 来代替第一个匹配的$substring

        9. ${string/#substring/replace} : 如果$string前缀匹配$substring , 就用$replace来代替匹配$substring

        10. ${string/%substring/replace} : 如果$string后缀匹配$substring , 就用$replace来代替匹配$substring

        11. ${string:-str2} : 如果变量string有定义,就返回string的值,如果string没有定义,就返回str2的值。

           eg :   result = ${fcz:-FENGCONGZHI} 

              echo $result

              输出:FENGCONGZHI

              echo $fcz

              输出:空

        12. ${string:=str2} : 如果变量string有定义,就返回string的值,如果string没有定义,就把str2的值赋值给string,并把str2的值返回。

           eg :   result = ${fcz:-FENGCONGZHI} 

              echo $result

              输出:FENGCONGZHI

              echo $fcz

              输出:FENGCONGZHI    // 这个地方与上一个输出不同

        13. ${string:?"not defined"} : 如果变量string未定义,就抛出异常 -bash: string: command not defined

        14. ${string:+str2} : 如果变量string定义了就返回str2的值

        15. ${string-str2} : 类似于 ${string:-str2}

    二、变量的数值计算

      1. 变量的数值计算常见的有如下几个命令:

        (()) 、 let 、 expr 、 bc 、 $[]

        (1)   (())用法 : 很常用,且效率高

            场景 : 执行简单的整数运算.

            eg : ((a = 1+2**3 -4%3))

               echo $a

             输出 : 8

             echo  $((a+=1))

             输出 : 9

        (2)  let赋值表达式 : ( 效率没有"(())" 高 )

            eg : let a = a+10

               echo $a

             输出 : 19

        (3) expr 用法: 略

            eg : 通过expr判断变量是否为整数

             expr  a + 0   =>   expr : 语法错误

                              expr  $?   =>   2     // 不等于0表示上面的语句执行失败

               expr   1 + 0   =>    1

                  expr  $?   =>   0    // 0表示上面的语句执行成功 

        (4) bc 用法: 支持小数的功能

            i=2

            echo $i+1  =>  2+1

            echo $i+1|bc   =>   3

        (5) typeset 用法 :   

            typeset  -i  A=1  B=3

            A=A+B

            echo  $A  =>  4

        (6) $[] 用法 :

            echo $[ 2+3 ]   =>  5

    三、shell 变量的输入

      Shell 变量除了可以 直接赋值 或 脚本传参 外,还可以使用read命令从标准输入获得.

      语法格式:

        read  [参数]  [变量名]

      常用参数:

        -p   prompt  : 设置提示信息

        -t    timeout  : 设置输入等待的时间,单位默认为秒。

      eg  :     read  -p  "pls  input  a number:" name1  name2

          pls  input  a  number:fcz zxy

          echo $name1  $name2    =>  fcz  zxy

    四、语法

      1. 条件测试语法

        格式1: test  <测试表达式>

        格式2: [ <测试表达式> ]

        格式3: [[ <测试表达式> ]] 

        说明: 格式1和格式2 是等价的 , 格式3为扩展的test命令. 

            在[[ ]] 中可以使用通配符进行模式匹配。 && 、 || 、 > 、 < 等操作可以应用于[[ ]]中,但不能应用于[]中。

        eg : 

          (1) 测试文件是否存在 

            test  -f  file  &&  echo  true ||  echo  false

            [ -f  file ]  &&  echo  true  ||  echo  false

            [ -d file ]  &&  echo  true ||  echo  false  // 测试file是不是目录

            [ -x file ]  &&  echo  true  || echo  false   // 测试file是不是可执行的文件

          (2) test命令非 (!) 的写法

            test  !  -f  file  &&  echo  true  ||  echo  false

        常用文件测试操作符号:

        -f   :  若文件存在且为普通文件则真

        -d  :  若文件存在且为目录文件则真

        -s  :  若文件存在且不为空(文件大小非0)则真

        -e  :  若文件存在则真,要区别 -f

        -r  :  若文件存在且可读则真

         -w  : 若文件存在且可写则真

        -x  :  若文件存在且可执行则真

        -L  :  若文件存在且为链接文件则真

        f1 -nt  f2  :  若文件f1比文件f2新则真

        f1 -ot  f2  :  若文件f1比文件f2旧则真

      2. 字符串测试语法 :

        常用字符串测试操作符

        -z  "字符串"  :  若串长度为0则真 ,

        -n  "字符串"  :  若串长度不为0则真, 

        "串1" = "串2"  :  若串1等于串2则真, 

        "串1" != "串2"  :  若串1不等于串2则真.

        注: 以上比较时字符串一定要用引号引起来.

      3. 数值比较语法 :

        在[ ]中比较符 :            -eq 、 -ne  、  -gt  、 -ge  、  -lt  、 -le  、 -a    、  -o

        在(( )) 和 [[ ]]中比较符 == 、!=    、  >    、 >=  、 <    、 <=  、 &&  、  ||

      4. if 语法

        单分支:

          if 条件

            then

              指令

          fi

        双分支:

          if 条件

            then 

              指令

          else

              指令

          fi

        多分支:

          if 条件

            then

              指令

          elif 条件

            then

              指令

          else

              指令

          fi  

      5. case 结构条件句语法:

        case  "字符串变量"  in

          值 1)  指令 1... ;;

          值 2)  指令 2... ;;

          *)  指令...

        esac

        eg : 根据用户的输入判断是哪个数字

          read  -p  "please  input  a number:"  ans

          case  "$ans"  in

          1)

            echo   "the  num  you  input  is  1"

          ;;

          2)

            echo  "the  num  you   input  is  2"

          ;;

          [3-9])

            echo  "the  num  you   input  is  $ans"

          ;;

          *)

            echo  "the  num  you input  must  be  less  9"

          esac

  • 相关阅读:
    如何给caffe添加新的layer ?
    caffe: test code Check failed: K_ == new_K (768 vs. 1024) Input size incompatible with inner product parameters.
    caffe: test code for PETA dataset
    matlab:对一个向量进行排序,返回每一个数据的rank 序号 。。。
    ant.design初探
    如何在react&webpack中引入图片?
    react&webpack使用css、less && 安装原则 --- 从根本上解决问题。
    如何制作高水平简历?&& 制作简历时需要注意的问题
    npm全局安装和局部文件安装区别
    职业人的基本素养
  • 原文地址:https://www.cnblogs.com/ytfcz/p/5136701.html
Copyright © 2011-2022 走看看