shell基础

shell是用户(user)与linux内核(kernel)沟通的桥梁,是一种解释性编程语言
shell功能:命令行解释器、启动程序、输入输出重定向、管道连接、文件名置换、变量维护、环境控制、shell编程

shell脚本就是将完成一个任务的所有命令按照执行的先后顺序、自上而下写入到一个文本文件中,然后给予执行权限
    vim nginx_install.sh
        nginx_install.sh
            #<1>定义脚本的执行环境
            #!/usr/bin/bash
            #<2>  #代表注释    #!指定执行解释器
            #<3>脚本信息
            #Author: gonglinzhi
            #Create time: 2022/02/11 17:00
            #Release: 1.0
            #Script description: nginx install script 
            
            # nginx install code
            yum -y install wget gcc pcre-devel zlib-devel
            wget http://nginx.org/download/nginx-1.16.0.tar.gz
            tar xf nginx-1.16.0.tar.gz
            cd nginx-1.16.0
            ./configure --prefix=/usr/local/nginx
            make -j 4
            make install
        #<4>脚本组成
        # 解释环境 
            #!/usr/bin/env bash | python | perl
            #!/usr/bin/bash
        # 注释说明
        # 执行代码
    #<5>运行脚本
        #1给执行权限
            chmod 700 nginx_install.sh
            ./nginx_install.sh
        #2解释器直接运行脚本
            bash nginx_install.sh

shell特殊符号
    ~    家目录
    !    执行历史命令
    !!    执行上一条命令
    $    变量取内容符 $var
    + - * / %    加减乘除取余
    &    后台执行
    *     通配符,匹配所有
    ?    通配符,匹配除回车以外的一个字符
    ;    命令间分割符
    |    管道符,前命令输出作为后命令输入 cat filename | grep "abc"
    \    转义字符
    ``    反引号,命令中执行命令 echo "Today is `date +%F`"
    ''    单引号,字符串,单引号不解释变量    echo '$USER' 输出 $USER
    ""    双引号,字符串,双引号解释变量    echo "$USER" 输出 root
    $?    上一条命令是否执行成功    echo $?
                    expr 7 + 3.8 &>/dev/null ; echo $?

vim创建脚本添加固定头部信息
    vim /etc/vimrc
        /etc/vimrc
            #!/usr/bin/bash
            autocmd BufNewFile
                *.sh,*.script exec ":call AddTitle()"
                function AddTitle()
                call setline(0, "#!/usr/bin/bash")
                call append(0, "############################")
                call append(1, "#Author: gonglinzhi")
                call append(2, "#Create time: ".strftime("%Y-%m-%d"))
                call append(3, "#Release: 1.0")
                call append(4, "#Script description:  ")
                call append(5, "############################")
    vim test.sh
        ############################
        #Author: gonglinzhi
        #Create time: 2022/02/11
        #Release: 1.0
        #Script description: 
        ############################

    例:自动化磁盘分区
        vim disk_partition
        disk_partition
            #!/usr/bin/bash
            fdisk /dev/sdb <<EOF
            n
            p
            3
            
            +500M
            w        
            EOF

shell运算
    1). expr 3 \* 2
    2). echo $((3*2))

shell格式化输出
    echo会将输入的字符串标准输出
    echo [命令选项] 字符串
        命令选项    -n    取消自动换行
            -e    对以下字符串做特殊处理
                \a    发出警告声
                \b    删除前一个字符
                \c    最后不加换行符
                \n     换行且光标移至行首    
    例:时间倒计输出
        count_down.sh
            #!/usr/bin/bash
            for time in `seq 9 -1 0`;do
                echo -n -e "\b$time"
                sleep 1
            done

shell颜色代码
    格式:echo -e "\033[字背景颜色; 文字颜色m字符串\033[0m"
    例:echo -e "\033[41; 36m nobody is body \033[0m"

shell基本输入
    read 命令选项    接受键盘的输入,回车代表输入结束
        -p    打印信息
        -t    限定时间
        -s    不回显(密码不显示输入)
        -n    输入字符个数
    account_password.sh
        #!/usr/bin/bash
        clear
        read -p "Login: " acc
        echo -n -e "Password: "
        read -s -t60 -n8 pw        # 不回显,输入限定时间60秒,最多输入8个字符
        echo
        echo "account: $acc           password: $pw"
    login.sh
        #!/usr/bin/bash
        clear
        echo "Centos Linux 7 (Core)"
        echo -e "kernel `uname -r` an `uname` -m\n"
        echo -n -e "$HOSTNAME login: "
        read acc
        read -s -p "password: "
        read pw

shell变量
    name="jack"
    name(逻辑地址) <==>0x5...0x8(物理地址) <==> 存储数据"jack"

    变量分类 
        本地变量:用户私有变量,保存在家目录下的.bash_profile .bashrc文件
        全局变量:所有用户都可使用,保存在/etc/profile /etc/bashrc
        自定义变量:用户自定义,如脚本变量
    定义变量     变量名=值
        name="mary"    #变量名、等号、值之间不能有空格
    读取变量     $变量名
        echo $name
    取消变量    unset 变量名
        unset name
    定义本地变量
        LIKE="swim"
    定义全局变量/etc/profile
        export COUNTRY="China"
    永久变量(定义在~/.bash_profile)

shell数组
    基本数组
        定义数组:数组名称=(元素1 元素2 元素3)
            array=("mary" "jack" "pony" "tom")
        读取数组:${数组名称[索引]}
            echo ${array[0]}
        数组赋值:数组名称[索引]=值
            array[4]="kner"
            array=(`cat /etc/passwd`)
        查看数组:declare -a
        访问数组:echo ${array[0]}    访问数组中第一个元素
            echo ${array[@]}    访问数组中所有元素,等同于echo ${array[*]}
            echo ${#array[@]}    统计数组元素个数
            echo ${!array[@]}    获取数组元素的索引
            echo ${array[@]:2}    从索引2开始访问元素
            echo ${array[@]:1:2}     从索引1开始访问两个元素
        遍历数组:echo ${array[0]}
            echo ${array[1]}
            echo ${array[2]}
            echo ${array[3]}
    关联数组
        1.声明关联数组
            declare -A ass_array
        2.关联数组赋值
            ass_array[name]="liangkuo"
            ass_array[age]=18
            declare -A acc_array=([name]="fengdu" [age]=20 [country]="China")
        3.访问数组
            echo ${ass_array[name]}
            echo ${acc_array[name]}


shell数学比较运算(对浮点数运算友好)
    -eq    等于
    -gt    大于
    -lt    小于
    -ge     大于等于
    -le     小于等于
    -ne    不等于
    test 10  -eq 5;echo $?
    test 10  -gt 5;echo $?
    test 10  -lt 5;echo $?
    test 10  -ge 5;echo $?
    test 10  -le 5;echo $?
    test 10  -ne 5;echo $?
    calculate.sh
        num1=`echo "1.5*10"|bc|cut -d "." -f1`
        num2=$((2*10))
        test $num1 -gt $num2;echo $?

shell文件比较与检查
    -d    检查文件是否存在且为目录
    -e    检查文件是否存在
    -f    检查文件是否存在且为文件
    -r    检查文件是否存在且可读
    -s    检查文件是否存在且不为空
    -w    检查文件是否存在且可写
    -x    检查文件是否存在且可执行
    -O    检查文件是否存在且被当前用户拥有    
    -G    检查文件是否存在且默认组为当前用户组
    file1 -nt file2    比较file1是否比file2新
    file1 -ot file2    比较file1是否比file2旧
    test -d /tmp/abc;echo $?
-    test myfile.txt -nt youfile.txt;echo $?
    
shell字符串比较运算
    ==    等于
    !=    不等于
    -n     检查字符串是否不为空
    -z    检查字符串是否为空
    test $USER=="root";echo $?
    test -n $abc;echo $?

shell逻辑运算    
    &&    逻辑与运算
    ||    逻辑或运算
    !    逻辑非运算
    if [ 2 -eq 2 ] && [ 2 -eq 3 ];then echo "True";else echo "False"; fi

shell赋值运算
    =    赋值

shell条件语句
    if语句
        if [condition]
            then
                commands
        fi
            #!/usr/bin/bash
            if [ $USER != "root"]
                then
                    echo "ERROR: need to be root so that"
                    exit 1
            if
    if-else语句
        if [condition]
            then
                commands
        else
            commands
        fi
            #!/usr/bin/bash
            if [ $USER == "root"]
                then
                    echo "he is root"
            else
                echo "he is guest"
            if
    if-elif-else语句
        if [condition]
            then
                commands
        elif [condition]
            then
                commands
        ......
        else
            commands
        fi
            #!/usr/bin/bash
            if [ $1 -eq $2 ]
                then
                    echo "$1=$2"
            elif [ $1 -gt $2 ]
                then
                    echo "$1>$2"
            else
                echo "$1<$2"
            fi
    
(( conditions )) 双圆括号:条件中可植入数学表达式
    #!/usr/bin/bash 
    if (( 100%3+1>10 ));then
        echo "True"
    else
        echo "False"
    fi
[[ conditions ]] 双方括号:条件中可使用通配符
    #!/usr/bin/bash 
    for i in r1 rr2 cc rr3
        do
            if [[ $i == r* ]];then
                echo $i
            fi
    done
    

shell流程控制-for循环语句
    for var in value1 value2 value3 ...
        do
            commands
    done
        #!/usr/bin/bash 
        for i in `seq 1 9`        // seq 9 -2 1 ==>  9 7 5 3 1
            do
                echo $i
        done

    for (( 变量;条件;自增减运算 ))
        do
            commands
    done
        #!/usr/bin/bash 
        for (( i=0,j=10;i<10;i++,j-- ))
            do
                echo $i,$j
        done

 

上一篇:MySQL使用bash脚本造数据


下一篇:(第二课)