shell学习(一)

shell是什么

shell是一个命令解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。

shell变成快速入门

  1. 脚本以#!/bin/bash开头。
  2. 脚本需要有可执行权限。
  3. 编写一个hello world示例程序,命令行输入vim myShell.sh
    #!/bin/bash
    echo "hello world!"
    
  1. :wq保存退出。chmod +x myShell.sh赋予可执行权限,调用执行 ./myShell.sh(相对路径和绝对路径都可以执行)
  2. 方式二:如果不赋予可执行权限,调用shell脚本用sh ./myShell.sh来执行,不推荐这种方式。

shell变量

1. shell变量的定义,Linux shell变量分为两种,系统变量和自定义变量。

变量规则:
    变量名称可以由字母,数字,下划线组成,但是数字不能开头;
    等号两侧不能有空格,否则会报错;
    变量名称一般习惯为大写。
将命令的返回值赋值给变量:
    使用反引号``将命令括起来
        A=`1s-1a`反引号,运行里面的命令,并把结果返回给变量A;
        RESULT=`ls -l /home`
        echo $RESULT
    使用$()来执行也可以,推荐使用。
        A=$(1s-1a)等价于反引号
        MY_DATE=$(date)
        echo "date=$MY_DATE"
系统变量:$HOME $PWD $SHELL $USER等等,使用方法:echo $HOME
    echo "PATH = $PATH"
    echo "USER= $USER"
显示当前shell中所有变量:set
    set | more
基本语法:
    (1)定义变量: 变量 = 值
        A=100
        echo "A=$A"
        输出结果 A=100
    (2)撤销变量:unset 变量
        unset A
        echo "A=$A"
        输出结果  A=   unset之后A的值没有了。
    (3)声明静态变量:readonly 变量,注意,不能unset
        readonly B=2
        echo "B=$B"
        unset B
        echo "B=$B"
        输出结果 第一行正常输出B=2,第二行报错,cannot unset :readonly variable 
         

2. shell环境变量

   基本语法:
        (1)export 变量名=变量值(功能描述:将shell变量输出为环境变量)
        (2)source 配置文件,(功能描述:让修改后的配置信息立即生效)
        (3)echo $变量名(功能描述:查询环境变量的值)
        使用示例:vim /etc/profile
            JAVA_HOME=/usr/local/java
            export JAVA_HOME
            wq退出,然后source /etc/profile
            echo $JAVA_HOME打印Java安装路径。
        在另一个shell中使用我们自定义的环境变量:
        vim myShell.sh
        echo "javahome=$JAVA_HOME"
    多行注释:
        :<<!
        RESULT=`ls -l /home`
        echo $RESULT
        MY_DATE=$(date)
        echo "date=$MY_DATE"
        !

3. 位置参数变量

    基本语法:
        (1)$n  功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号抱起来${10}
        (2)$*  功能描述:这个变量代表命令行中所有的参数,$*把所有参数看作一个整体
        (3)$@  功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
        (4)$#  功能描述:这个变量代表命令行中所有参数的个数
    位置参数变量应用实例:编写一个position.sh脚本,在脚本中获取到命令行的各个参数信息
        vim position.sh
        #!/bin/bash
        #获取到各个参数
        echo "$0 $1 $2"
        echo "$*"
        echo "$@"
        echo "参数个数=$#"
        执行 ./position.sh 30 60
        输出 
            ./position.sh 30 60
            30 60
            30 60
            参数个数=2

4. 预定义变量

    基本介绍:
        就是shell设计者事先定义好的变量,可以直接在shell脚本中使用
    基本语法:
        (1)$$  功能描述:当前进程号的PID
       (2)$!  功能描述:后台运行的最后一个进程的进程号PID
       (3)$?  功能描述:最后一个执行的命令的返回状态。如果这一个变量的值为0,证明上一个命令正确执行;如果这个变量值非0(具体哪个数由命令自己来决定),则证明上一个命令执行不正确了。
    应用示例:
        vim perVar.sh
        #!/bin/bash
        echo "当前进程号=$$"
        #后台方式运行myShell.sh
        ./myShell.sh &
        echo "最后的进程号=$!"
        echo "执行的值=$?"
        :wq退出
        chmod 744
        执行预定义变量脚本  ./perVar.sh

5. 运算符

    基本语法:
       (1) "$((运算式))"或者"$[运算式]"
       (2)expr m + n expr m - n expr \*乘以,/除以,%取余,注意expr和运算符以及变量之间都要有空格
        
    应用示例:
        #!/bin/bash
        #第一种方式$(())
        RESULT1=$(((2+3)*4))
        echo "result=$RESULT1"
        #第二种方式[],推荐使用
        RESULT2=$[(2+3)*4]
        echo "result2=$RESULT2"
        #第三种方式,exrp
        TEMP=`expr 2 + 3`
        RESULT3=`expr $TEMP \* 4`
        echo "result3=$RESULT3"
        #求出两个参数的和
        SUM=$[$1+$2]
        echo "sum=$SUM"        

6. shell判断语句

    基本语法:
        [condition]注意 condition 前后要有空格
        #非空返回true,可使用$?验证(0为true,>1为false)
    应用示例:
        [alibaba]                             返回true
        []                                    返回false
        [condition]&&echo OK || echo notok    条件满足,执行后面的语句
    条件判断:
        (1)两个整数的比较: =字符串比较   -lt小于 -le小于等于  -eq等于  -gt大于  -ge大于等于  -ne不等于
        (2)按照文件权限判断: -r有读的权限    -w有写的权限    -x有执行的权限
        (3)按照文件类型进行判断: -f文件存在并且是一个常规的文件  -e文件存在   -d文件存在并且是一个目录
    应用示例:
        案例一: "ok"是否等于""ok"
        判断语句:if [ "ok" = "ok" ]
                 then
                    echo "equal"
                 fi   //结果相等
        案例二:23是否大于等于22
        判断语句:if [ 23 -gt 22 ]
                 then
                    echo "大于"
                 fi   //结果大于
        案例三:/root/install.log目录中的文件是否存在
        判断语句:if [ -e /root/aaa.log  ]
                 then
                    echo "存在"
                 fi   //结果存在

7. 流程控制

    if控制:输入大于60,输出及格,小于60输出不及格。
            if [ $1 -ge 60  ]
            then
                echo "及格"
            elif [ $1 -lt 60 ]
            then
                echo "不及格"
            fi  
    case控制:当命令行参数是1时,输出周一,2输出周二, 其他输出other
            case $1 in
            "1")
            echo "周一"
            ;;
            "2")
            echo "周二"
            ;;
            "*")
            echo "other"
            ;;
            esac
    for循环:
        语法一:for 变量 in 值1 值2 值3···
                do
                程序
                done
                示例:打印命令行输入的参数(这里可以看出$*和$@的区别)
                #使用$*
                for i in "$*"
                do
                    echo "the param is $i"
                done 输出的参数是一个整体 the param is10 20 30,当成一个参数来输出。
                #使用$@
                for j in "$@"
                do
                    echo "the param is $j"
                done  输出的参数分别打印the param is10 the param is20 the param is30,当成多个参数来处理。
        语法二:for((初始值;循环控制条件;变量变化))
                do
                程序
                done
                示例:从1+到100的值输出显示
                #定义一个变量
                SUM=0
                for((i=1;i<=100;i++))
                do
                    SUM=$[$SUM+$i]
                done
                echo "sum=$SUM"
    while循环:命令行输入一个n,统计从1+..+n的值是多少
                SUM=0
                i=0
                while [$i - le $1]
                do
                    SUM=$[$SUM+$i]
                done
                echon "sum=$SUM"
        

posted on 2022-08-22 08:57  张少凯  阅读(48)  评论(0编辑  收藏  举报

导航