shell基础笔记

shell基础:mysql

sh命令:
    参数:
     -c string     将string看成命令来执行。注意区别:string是用单引号扩起来的还上用双引号扩起来的!
     -x    xxx.sh    开启调试模式,shell在执行脚本的过程当中把它实际执行的命令都显示出来,而且在命令的行首显示一个"+"号(shell内置变量PS4='+ '),同set -x。
         补充:能够经过修改$PS4的值,从而使每一条实际执行的命令前面显示其行号以及所属的函数名。eg:先执行export PS4='+{$LINENO:${FUNCNAME[0]}} ', 而后再使用“-x”选项来执行脚本。
     -n 不执行脚本,而是去读一遍脚本中的命令,目的是为了检查脚本中的语法错误。linux


# !/usr/bin/env bash
说明:脚本解释器在linux中可能被安装在不一样的目录,而env能够在系统的PATH目录中查找,故脚本用env启动。sql


命令 -/+参数
    -参数    设置某个参数
    +参数    取消某个参数的设置。    shell


set命令:
    参数:
        无参 列出全部的环境变量。
        -e     当命令的返回值不等于0(即执行该命令报错)时,当即退出shell。
        +e     表示取消-e参数,即当命令的返回值不等于0时,不会当即退出shell,而是会继续执行shell脚本。
        -x     开启调试模式。数据库


declare命令:
    说明:用于声明shell变量
    参数:
        -r     将变量声明为只读变量。eg:declare -r name=jack
        -x  将变量设置为环境变量,该变量可供shell之外的程序来使用。数组


echo命令:
    参数:
        -e     将特殊字符进行转义。 
            \a 发出警告声
            \c 最后不加换行符号
            \f 换行但光标仍旧停留在原来的位置
            \n 换行且光标移至行首
            \r 光标移至行首,但不换行
            \t 插入tabbash


let命令:
    说明:let命令是bash中用于计算的工具,用于执行一个或多个表达式,变量计算中不须要加上$来表示变量。若是表达式中包含了空格或其余特殊字符,则必须引发来。
    举例:
        let i=i+1
        let i++函数

    
mail命令:
    方式一:
        在shell窗口中编辑内容,编辑完成后按ctrl+d退出编辑环境,邮件便可发送。
        mail -s "邮件主题" jxn@speed.com工具

    方式二:
        mail -s "邮件主题" jxn@speed.com < content.txtthis

    方式三:
        cat "mail content" | mail -s "邮件主题" jxn@speed.com 

    补充:
        ctrl+c     终止当前任务命令或程序。
        ctrl+d     退出当前用户环境,至关于exit。


命令行参数
    $0     脚本的名字
    $1, $2, ..., $9  脚本第1个到第9个命令行参数
    $#     命令行参数的个数
    $*     以“参数1 参数2 参数3..”    的形式返回全部命令行参数的值
    $@     以“参数1”“参数2”“参数3”..    的形式返回全部命令行参数的值
    $?     最后一条命令的退出状态码(执行成功返回0,执行失败返回1)
    $$     正在执行的进程的ID(PID)


    getopts命令:

        概念:获取命令行的参数。
        格式:getopts argString varName
        说明:
            1)参数后面加冒号表示该参数能够接受赋值。
            2)若argString以冒号开头,则表示忽略错误。eg:
                若argString为 a: 那么,a必须赋值,不然会报错。
                若argString为 :a: 那么,a即便不赋值,也不会报错。
        使用:
            while getopts :i:na: opt
            do
                    case ${opt} in
                            i) echo 'this is param i value '$OPTARG
                            ;;
                            n) echo 'has param n'
                            ;;
                            a) echo 'this is param a value '$OPTARG
                            ;; 
                    esac
            done

            # 验证:sh my.sh -i 99 -n -a asdf

变量:
    引用变量:
        ${variable}
        $variable

    清除变量:
        unset variable

    变量替换
        $variable                保存在variable中的值
        ${variable}            保存在variable中的值
        ${variable:-string}     若是variable的值非空,则值为variable,不然值为string
        ${variable:+string}     若是variable的值非空,则值为string,不然值为空
        ${variable:=string}     若是variable的值非空,则值为variable,不然值为string且variable的值设置为string
        ${variable:?string}     若是variable的值非空,则值为variable,不然显示string并退出

    引号的说明【重要】:
        单引号括起来的的字符都做为普通字符对待。
        双引号括起来的字符,除$、\、'(单引号)、"(双引号)以外,其他字符做为普通字符对待。
        反引号括起来的字串被shell解释成命令,在执行时,shell首先执行该命令,并以它的标准输出结果取代整个反引号部分。

    将命令的执行结果赋值给变量:
        # 将某个shell命令的执行结果赋给某个变量。注:赋值号“=”的左右两边不能直接跟空格,不然shell会将其视为命令。
        variableName=`command`
        variableName=$(command)

    定义系统提示符的变量

        eg:PS1='[\u@\t \w]\$ '

        \u:显示当前用户名
        \h:显示简写主机名。如默认主机名“localhost”
        \$:提示符。若是是root用户会显示提示符为“#”,若是是普通用户会显示提示符为“$”
        \w:显示当前所在目录的完整名称
        \W:显示当前所在目录的最后一个目录
        \t:显示24小时制时间,格式为“HH:MM:SS”
        \T:显示12小时制时间,格式为“HH:MM:SS”
        \d:显示日期,格式为“星期 月 日”
        \A:显示24小时制时间,格式为“HH:MM”
        \#:执行的第几个命令

字符串函数:
    ${#str}                获取字符串的长度
    ${str:num1:num2}    表示从字符串的第num1个字符开始,截取num2个字符。
    ${str/str1/str2}     将第一个str1替换为str2
    ${str//str1/str2}    将全部的str1替换为str2

    ${str#*pattern}     删掉第一个pattern及其左边的字符串
    ${str##*pattern}     删掉最后一个pattern及其左边的字符串
    ${str%pattern*}     删掉最后一个pattern及其右边的字符串
    ${str%%pattern*}     删掉第一个pattern及其右边的字符串
    说明:#是去掉左边,%是去掉右边(tip:键盘上#在%的左边)、单一符号是最小匹配,两个符号是最大匹配。

数组:
    定义:shell中的数组用括号来表示,元素之间用空格分隔。

    初始化:
        方式一:myArray=(element1 element2 element3)
        方式二:
            myArray[0]=element1;
            myArray[1]=element2;
            myArray[2]=element3;

    获取数组的元素:
        ${myArray[index]}                获取下标为index的数组
        ${myArray} 或 ${myArray[0]}        获取数组的第一个元素
        ${myArray[*]} 或 ${myArray[@]}     获取数组的全部元素
        ${#myArray[*]}                    获取数组的长度

条件判断:
    概念:表达式用中括号[]或双中括号[[]]括住,条件表达式与左右方括号之间必须都保留一个空格。
    说明:单中括号中的变量必需要加双引号,双中括号中的变量不用加双引号。
    举例:[ -z "$pid" ]     VS     [[ -z $pid ]]
    参数:
    逻辑运算符:
        &&    expr1 && expr2     逻辑与(短路与)
        ||    expr1 || expr2     逻辑或(短路或)
        !                    逻辑非
    数值判断:
        -eq  num1 -eq num2     是否相等
        -ne   num1 -ne num2     是否不相等
        -gt  num1 -gt num2     是否大于
        -ge  num1 -ge num2     是否大于等于
        -lt  num1 -lt num2     是否小于
         -le  num1 -le num2     是否小于等于
    字符串判断:
        =    str1 = str2  字符串是否相等
        !=   str1 != str2     字符串是否不等
        -n   -n str1         字符串是否非空
        -z   -z str2         字符串是不是空串(长度是否等于0 z:zero)
    文件判断:
        -e   -e filenaem  文件是否存在
        -r   -r filename  文件是否存在且可读
        -w   -w filename  文件是否存在且可写
        -s   -s filename  文件是否存在且长度非0
        -f   -f filename  文件是否存在且是普通文件
        -d   -d filename  文件是否存在且是一个目录
        -L       -L finename  文件是否存在且是一个连接


循环:
    格式:
        while [ condition ]
        do
            # do something
        done

    无限循环:
        while :
        do
            # do something
        done

    读文件:
        # 方式一:read经过输入重定向,把file的第一行全部的内容赋值给变量line,循环体内的命令通常包含对变量line的处理;而后循环处理file的第二行、第三行。。。一直到file的最后一行
        while read line
        do
            # do something
        done < file
        
        # 方式二:command命令的输出做为read循环的输入,这种结构经常使用于处理超过一行的输出。
        command | while read line
        do
            # do something
        done

        


举例1:
    #!/usr/bin/env bash

    # 从数据库中导出的数据,每行数据以制表符分隔
    path=/home/jxn/updateData.tsv 

    # 计数
    count=0;

    echo "--------- start"

    # 按行读取文件的内容
    while read line
    do
        # 将每行的内容转换为数组
        dataArray=(${line});
        firstFieldValue=${dataArray[0]};
        secondFieldValue=${dataArray[1]};

        updatesql="update mytable set firstField=\"${firstFieldValue}\" where secondField=\"${secondFieldValue}\"";
        
        # 执行sql
        echo sql=${updatesql};
        result=`/home/jxn/tools/mysql -h myhost -P 3306 -uroot -p'root!@#' dbName -e "${updatesql}"`;

        # 计数         let count=count+1;         echo "---------result=[${result}] count=[${count}] "     done < ${path}     echo "--------- end"

相关文章
相关标签/搜索