• Linux运维之shell脚本基础知识


    1、bash中的算术运算

    • let运算符
    [root@:vg_adn_tidbCkhsTest~/tidb-bench/sysbench]#let i=1+2
    [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i
    3
    [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#let i1=10
    [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#let i2=20
    [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#let i3=$i1+$i2
    [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i3
    30
    • $[expression]
    [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#i1=$[11+22]
    [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i1
    33
    • $((experssion))
    [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#i=$((22+33))
    [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i
    55
    • expr  arg1  操作符  arg2
    [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#i=`expr 11 * 10`;echo $i
    110

         一般情况下使用expr运算符都要用反引号

    2、判断某个用户是否存在,如果不存在,则创建此用户

    #!/bin/bash
    id hadop &> /dev/null || useradd hadoop

    3、计算passwd文件中第10个用户和第20个用户的UID之和

    #!/bin/bash
    uid1=$(id -u `cat /etc/passwd |head | tail -1|cut -d':' -f1`)
    uid2=$(id -u `cat /etc/passwd |head -20| tail -1|cut -d':' -f1`)
    sum=$[$uid1+$uid2]
    echo "10 and 20 user 's uuid is $sum"

    4、统计某个文件的空白行

    [root@:vg_adn_tidbCkhsTest /tmp]#cat /etc/init.d/functions | grep '^$'| wc -l
    90

    5、判断返回值状态

    [root@:vg_adn_tidbCkhsTest /tmp]#cat /etc/fstab &> /dev/null
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0
    [root@:vg_adn_tidbCkhsTest /tmp]#cat /etc/fstabhaha &> /dev/null             #查看一个不存在的文件
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    1

    6、条件测试

    判断某需求是否满足,需要由测试机制来实现:

      如何编写测试表达式以实现所需的测试

    • (1)执行命令,并利用命令状态返回值来判断

        0:成功

        1:失败

    • (2)测试表达式

        test EXPRESSION

        [ EXPRESSION ]  单中括号多见于数值比较

        [[ EXPRESSION ]]   双中括号多见于字符串比较

          注意:EXPRESSION两段必须有空白字符,否则为语法错误

    bash的测试类型

    数值测试:

    -eq:是否等于

    -ne:是否不等于

    -gt:是否大于

    -ge:是否大于等于

    -lt:是否小于

    -le:是否小于等于

    [root@:vg_adn_tidbCkhsTest /tmp]#[ 11 -eq 21 ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    1
    [root@:vg_adn_tidbCkhsTest /tmp]#[ 11 -eq 11 ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0

    字符串测试

    ==:是否等于

    >:是否大于

    <:是否小于

    !=:是否不等于

    =~:左侧字符串能否被右侧的PATTERN所匹配。右侧的PATTERN不能使用bash的通配符来进行。并且PATTERN是匹配左侧字符串的某一部分而已

    -z "STRING":判断指定的字串是否为空,空则为真,不空则为假

    -n "STRING":判断指定的字符串是否不空,不空则真,空则为假。

    [root@:vg_adn_tidbCkhsTest /tmp]#[ tom == tom ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0
    [root@:vg_adn_tidbCkhsTest /tmp]#[ tom != tom ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    1
    [root@:vg_adn_tidbCkhsTest /tmp]#[ "tom" != "join" ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0

    并不是说字符串比较这样子就完美了,如下所示:

    [root@:vg_adn_tidbCkhsTest /tmp]#[ "a" > "b" ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0
    [root@:vg_adn_tidbCkhsTest /tmp]#[ "a" < "b" ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0
    [root@:vg_adn_tidbCkhsTest /tmp]#[[ "a" > "b" ]]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    1
    [root@:vg_adn_tidbCkhsTest /tmp]#[[ "a" < "b" ]]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0

    所以说字符串的比较有两点要注意:

    1、字符串要加引用

    2、要使用双中括号[[ EXPRESSION ]]来进行比较

    [root@:vg_adn_tidbCkhsTest /tmp]#name=tom[root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o" ]]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0
    [root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o.*" ]]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    1
    [root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o*" ]]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    1
    [root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "om" ]]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0
    [root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o?" ]]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    1

    7、文件测试

    文件存在性测试:

    -e:FILE    文件的存在性测试,存在则为真,不存在则为假

    文件类型测试:

    -b FILE:文件是否为块设备文件

    -c FILE: 文件是否为字符设备文件

    -d FILE:文件是否是目录文件

    -f FILE:文件是否是普通文件

    -l FILE:文件是否为链接文件

    -S FILE:文件是否为套接字文件

    -p FILE:文件是否为管道文件

    [root@:vg_adn_tidbCkhsTest /tmp]#[ -b /dev/xvda1 ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0
    [root@:vg_adn_tidbCkhsTest /tmp]#[ -f /etc/init.d/functions ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0

    文件权限性测试

    -r  FILE:文件是否可读

    -w FILE:文件是否可写

    -x FILE:文件是否可执行

    [root@:vg_adn_tidbCkhsTest /tmp]#[ -x /usr/bin/passwd ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0

    文件特殊权限测试

    -g FILE:文件是否拥有SGID权限

    -u FILE:文件是否拥有SUID权限

    -k FILE:文件是否拥有sticky权限

    [root@:vg_adn_tidbCkhsTest /tmp]#[ -u /usr/bin/passwd ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0

    文件大小测试

    -s FILE :文件是否为非空内容,有内容则为真,无内容则为假

    [root@:vg_adn_tidbCkhsTest /tmp]#touch ./haha.sh
    [root@:vg_adn_tidbCkhsTest /tmp]#[ -s haha.sh ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    1
    [root@:vg_adn_tidbCkhsTest /tmp]#echo "hahahaha" > haha.sh
    [root@:vg_adn_tidbCkhsTest /tmp]#[ -s haha.sh ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0

    从属关系测试

    -O FILE:当前有效用户是否为文件属主

    -G FILE:当前有效用户是否为文件属组

    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    0
    [root@:vg_adn_tidbCkhsTest /tmp]#[ -O /home/tidb ]
    [root@:vg_adn_tidbCkhsTest /tmp]#echo $?
    1

    组合条件运算

    [ condition1 -a condition2 ]    相当于  condition1  &&  condition2

    [ condition1 -o condition2 ]    相当于  condition1  ||  condition2

    [ -not condition ]  相当于  !condition

    练习题:判断主机名是否为空或主机名是“localhost.localdomain”

    #!/bin/bash
    hostName=$(hostname)
    [ -z "$hostName" ] || [[ $hostName == "localhost.localdomain" ]]           #这一句相当于:      [ -n "$hostName" -o $hostName == "localhost.localdomain" ]
    if [ $? -eq 0 ];then
            hostname www.feng.com
    fi

    脚本的状态返回值

    默认是脚本中执行的最后一条命令的状态返回值

    自定义状态退出状态码:

    exit [n]:n为自己指定的状态码。

    注意L:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束。

    向脚本传递参数:

    位置参数变量

    Scripts.sh arg1  arg2

    引用方式:

    $1,$2,......${n}..

    [root@:vg_adn_tidbCkhsTest /tmp]#cat test4.sh
    #!/bin/bash
    file1_lines=$(grep '^$' $1 | wc -l)
    file2_lines=$(grep '^$' $2 | wc -l)
    echo "the totle lines: $[${file1_lines} + ${file2_lines}]"
    [root@:vg_adn_tidbCkhsTest /tmp]#bash test4.sh /etc/init.d/functions /etc/issue
    the totle lines: 91

    特殊变量:

    $0:脚本文件路径本身

    $#:保存传递给当前脚本的参数的个数。

    $*与$@:保存传递给当前脚本的所有参数。

    [root@:vg_adn_tidbCkhsTest /tmp]#cat test5.sh
    #!/bin/bash
    echo "the name of scripts is $(basename $0)"
    echo "the arg's sum is $#"
    echo "some names are $*"
    [root@:vg_adn_tidbCkhsTest /tmp]#./test5.sh 1.txt 2.txt
    the name of scripts is test5.sh
    the arg's sum is 2
    some names are 1.txt 2.txt

    练习题:编写一个脚本,用来添加一个用户,要求必须指定一个用户

    [root@:vg_adn_tidbCkhsTest /tmp]#cat test6.sh
    #!/bin/bash
    if [ $# -lt 1 ];then
        echo "At least one user";
       exit 2 fi if grep "^$1>" /etc/passwd &> /dev/null;then echo "user has been exits" else useradd $1 echo $1 | passwd --stdin $1 &> /dev/null echo "useradd finished" fi [root@:vg_adn_tidbCkhsTest /tmp]#./test6.sh hbase useradd finished [root@:vg_adn_tidbCkhsTest /tmp]#./test6.sh hbase user has been exits [root@:vg_adn_tidbCkhsTest /tmp]#

     练习题:通过命令行参数给定两个数字,输出其中较大的数值

    [root@:vg_adn_tidbCkhsTest /tmp]#cat test7.sh 
    #!/bin/bash
    if [ $# -lt 2 ];then
        echo "At least two numbers"
        exit 2 
    fi
    if [ $1 -lt $2 ];then
        echo "The max num is $2"
    else
        echo "The max num is $1"
    fi
    [root@:vg_adn_tidbCkhsTest /tmp]#./test7.sh 3
    At least two numbers
    [root@:vg_adn_tidbCkhsTest /tmp]#./test7.sh 3 5
    The max num is 5
    [root@:vg_adn_tidbCkhsTest /tmp]#./test7.sh 7 5
    The max num is 7

    练习题:通过命令行参数给定一个用户名,判断其ID号时偶数还是奇数

    [root@:vg_adn_tidbCkhsTest /tmp]#cat test8.sh 
    #!/bin/bash
    if [ $# -lt 1 ];then
        echo "At least one user"
        exit 2
    fi
    if ! grep "^$1>" /etc/passwd &> /dev/null ;then
        echo "user not exits"
    else
        uuid=`id -u $1`
        if [ $uuid%2==0 ];then
            echo "this uuid is a ji shu"
        else
            echo "this uuid is a ou shu"
        fi
    fi
    [root@:vg_adn_tidbCkhsTest /tmp]#./test8.sh hbase
    this uuid is a ji shu
  • 相关阅读:
    记录C#开发遇到的问题和应用经验
    HttpApplication,HttpModule,HttpContext及Asp.Net页生命周期
    itextsharp.dll(4.0.8.0)完整示例PDF
    步步为营 .NET 设计模式学习笔记 二十三、Interpreter(解释器模式)
    .net简谈分层架构思想
    FusionCharts Free
    表解锁的方法
    步步为营 .NET 设计模式学习笔记 二十一、Visitor(访问者模式)
    步步为营 .NET 设计模式学习笔记 二十二、Memento(备望录模式)
    再论抽象
  • 原文地址:https://www.cnblogs.com/FengGeBlog/p/10180983.html
Copyright © 2020-2023  润新知