zoukankan      html  css  js  c++  java
  • shell脚本使用

    shell特殊变量,分别是:$#、$*、$@、$?、$$

    $0:当前脚本的文件名。
    $n(n≥1):传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。
    $#:传递给脚本或函数的参数个数。
    $*:传递给脚本或函数的所有参数。
    $@:传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同,"$*"会将所有的参数从整体上看做一份数据;"$*"会将所有的参数从整体上看做一份数据。
    $?:上个命令的退出状态,或函数的返回值。
    $$:当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

    shell脚本获取命令行参数:getopts方式

    while getopts ":a:b:c:" opt
    do
        case $opt in
            a)
            echo "参数a的值$OPTARG"
            ;;
            b)
            echo "参数b的值$OPTARG"
            ;;
            c)
            echo "参数c的值$OPTARG"
            ;;
            ?)
            echo "未知参数"
            exit 1;;
        esac
    done

    结果如下:

    $ ./test.sh -a 1 -b 2 -c 3
    
    #在shell中的输出
    参数a的值1
    参数b的值2
    参数c的值3

    字符串:可以由单引号' '包围,也可以由双引号" "包围,也可以不用引号

    1) 由单引号' '包围的字符串:

    • 任何字符都会原样输出,在其中使用变量是无效的。
    • 字符串中不能出现单引号,即使对单引号进行转义也不行。

    2) 由双引号" "包围的字符串:

    • 如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
    • 字符串中可以出现双引号,只要它被转义了就行。

    3) 不被引号包围的字符串

    • 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
    • 字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
    获取字符串长度
    string_name=abcd
    echo ${#string_name}
    字符串截取
    从指定位置开始截取
    这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。
    1) 从字符串左边开始计数
      ${string: start :length} #string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)。
    2) 从右边开始计数
      ${string: 0-start :length} #同第 1) 种格式相比,第 2) 种格式仅仅多了0-,这是固定的写法,专门用来表示从字符串右边开始计数。
    从指定字符(子字符串)开始截取 这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。 1) 使用 # 号截取右边字符   ${string#*chars} #string 表示要截取的字符,chars 是指定的字符(或者子字符串),*是通配符的一种,表示任意长度的字符串。*chars连起来使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。   ${string##*chars} #直到最后一个指定字符(子字符串)再匹配结束 2) 使用 % 截取左边字符   ${string%chars*} #使用%号可以截取指定字符(或者子字符串)左边的所有字符
    字符串替换
    string=abc12342341
    echo ${string/23/bb}   #abc1bb42341  替换一次    
    echo ${string//23/bb}  #abc1bb4bb41  双斜杠替换所有匹配    
    echo ${string/#abc/bb} #bb12342341   #以什么开头来匹配,根php中的^有点像    
    echo ${string/%41/bb}  #abc123423bb  %以什么结尾来匹配,根php中的$有点像 
    

    数组

    #数组定义
    arr=(1 2 3)
    arr2=() #空数组
    #字符串转数组
    str=1,2,3,4
    arr3=(${str//,/ })
    #获取数组长度
    echo ${#arr[*]}  或 echo  ${#arr[@]}
    #查看数组所有数据
    echo ${arr[*]}  或 echo ${arr[@]}
    #数组动态追加元素
    arr[${#arr[*]}]=追加的元素
    #数组拼接:先利用@*,将数组扩展成列表,然后再合并到一起。
    array_new=(${array1[@]}  ${array2[@]})
    #删除数组
    unset array_name
    #删除数组指定下标数据
    unset array_name[index]

    关系运算符

    关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

    下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

    运算符说明举例
    -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
    -ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
    -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
    -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
    -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
    -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

    函数定义、调用和返回值

    function sum(){
     val1=$1  #函数第一个参数
     val2=$2  #函数第二个参数
     val3=$(($1+$2))
     echo $val3
    }
     
    #Call function with 2 parameters and it return 1 parameter.
    ret_val=$(sum 10 20)
    echo $ret_val

    查询数据库数据并处理结果集

    HOSTNAME="172.16.xx.xx"    #数据库信息
    PORT="3306"
    USERNAME="root"
    PASSWORD="root"
    
    DBNAME="log"         #数据库名称
    TABLENAME="student"
    
    
    COMMAND1="mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD} ${DBNAME}
    方法一:
    while read -a row
    do
        echo "..${row[0]}..${row[1]}.."
    done< <(echo "select  id ,name  from  student;" | ${COMMAND1})
    
    方法二:
    while read a b
    do
        echo "..${a}..${b}.."
    done< <(echo "select  id ,name  from  student;" | ${COMMAND1})
    
     
    
    注释:注意"done< <("的写法,第一个"<"要和"done"之间没空格,两个"<"之间有一个空格,"<""("之间没空格。

    比较运算符

    -eq           //等于
    -ne           //不等于
    -gt            //大于 (greater )
    -lt            //小于  (less)
    -ge            //大于等于
    -le            //小于等于

    for循环

    for item in (1 2 3)
    do 
      echo $item
    done

    if条件判断

    test命令,对特定条件进行测试,并使用$?对返回值进行判断

    test 条件表达式

    &

    [ 条件表达式 ] //更为常用

    注意: 中括号“[”和“]”与条件表达式之间均需要使用空格隔开,否则会出现错误!!

  • 相关阅读:
    dig批量获取域名对应IP
    文件和目录
    Linux程序设计的CD唱片应用程序
    LinuxRedhat7.0虚拟机配置双网卡
    Redhat7.0计划任务服务程序(at,crontab)
    RedHat7 修改主机名称 配置网卡信息 配置Yum软件仓库
    关于RedHat5.0不能提示找不到/media/cdrom/repodate/repomd.xml
    Redhat5静态IP分配,提示Error, some other host already uses address解决办法
    三种时间戳的解释
    RHEL 7 -解决“没有启用回购”消息
  • 原文地址:https://www.cnblogs.com/jvStarBlog/p/14786274.html
Copyright © 2011-2022 走看看