zoukankan      html  css  js  c++  java
  • shell脚本基础


    shell脚本基础


    一、shell脚本编写步骤
    1)使用vim编辑器编写shell脚本
    2)添加shell脚本的执行权限
    3)执行shell脚本

    二、重写向与管道符
    1、输出重定向

    :将命令结果输出到指定的文件中
    ps –aux >process.txt

    :将命令结果追加输出到指定文件中
    ps –aux >>process.txt

    2、输入重定向
    <:从某个文件中读取内容作为命令的参数

    3、错误重定向
    2>:将命令的错误信息输出到指定的文件中
    2>>:将命令的错误信息追加输出到指定的文件中
    tar czf etc.tar.gz /etc/ 2>error.log

    若希望将命令的正常输出信息及错误输出信息同时输出到指定的文件中,可以使用&>重定向操作
    tar czf etc.tar.gz &>infor.log

    三、管道符操作
    df –hT | grep “/$” | awk ‘{print $1,$6}’
    |:代表Linux中的管道符,先执行管道符前面的命令,将命令的结果作为后一个命令的参数再继续执行

    awk命令:
    awk命令可以将输出的内容以某个字符(例如空格、制表符、冒号、分号等)为分隔,然后输出某几段的内容
    awk –F: ‘{print $1,$6}’:以冒号:分隔一行的内容,输出第1、6段的内容
    awk ‘{print $1,$3}’:默认以空格或者制表符分隔内容,输出第1,3段的内容

    四、shell变量
    1、自定义变量
    定义变量product,并输出变量的内容
    product=car
    echo $product
    定义变量product,输出变量与1.8T连接输出
    product=car
    echo ${product}1.8T

    变量的赋值
    1)使用双引号” ”将包括空格的变量值赋予变量
    car=”car 1.8T”
    2)使用单引号’ ’将特殊字符(%,$,#,@)包括
    3)变量值中如果有单引号,需要使用转义符
    4)变量值如果是一个命令的结果,需要使用``反撇号将命令括起来
    info=ps aux | grep root
    5)如果命令在含有命令的嵌套,需要使用$()将命令括起来
    info=rpm –qf $(which useradd)
    read命令
    使用read命令可以通过用户的输入为变量赋值
    read –p “请指定数据备份的目录:” dir1
    变量的作用范围
    1)变量的作用范围默认只限于本shell环境中,如果用户切换到其他的shell环境使用变量值时,变量的值为空
    2)使用export可以将变量的作用范围设置为全局
    export name=”www.baidu.com”
    变量运算符
    expr 变量1 运算符 变量2 运算符 变量3
    运算符:
    1)+:加法运算 expr $x + $y
    2)-:减法运算 expr $x - $y
    3)*:乘法运算 expr $x /* $y
    4)/:除法运算
    5)%:取两个数字的余数
    6)变量与运算符之间必须用空格隔开

    2、环境变量
    环境变量是随着Linux系统的安装自动产生的变量,该类变量的值会随着用户的操作环境变化而变化
    使用env命令可以显示系统中存在的环境变量
    1)USER:代表用户名
    2)HOME:代表用户的宿主目录
    3)HOSTNAME:代表计算机名
    4)LANG:代表系统使用的语言
    5)PATH:代表用户可以执行哪些目录下的命令
    6)PWD:代表当前目录的位置
    7)SHELL:代表用户当前所使用的shell

    4、位置变量(占位符)
    Linux shell脚本中,使用$1,$2……$9代表占用符
    例如编写以下脚本:
    vim service.sh

    /bin/bash

    /etc/init.d/$1 restart
    用户在执行上面脚本时./service.sh network结果就是重启network服务

    5、特殊变量
    1)$#:代表某个命令的参数的个数
    2)$*:代表某个命令的详细参数信息
    3)$?:代表前一个命令的执行结果。结果为0代表命令正常执行
    4)$0:代表当前执行的脚本或者命令的名称

    简单shell脚本举例
    显示系统中的进程数,显示当前登录系统的用户数及根文件系统的使用率
    vim count.sh

    /bin/bash

    process_num=ps aux | wc –l
    account_num=who | wc –l
    use_percent=df –hT | grep “/$” | awk ‘{print $6}’
    echo “系统中的运行数为: $process_num”
    echo “登录系统的用户数: $account_num”
    echo “根分区的使用率为: $use_percent”

    五、条件测试
    语法: [ 条件表达式 ]
    条件表达式与方括号中间要用空格隔开,通过$?返回测试的结果,返回0代表测试通过,非0代表测试失败

    1、文件测试
    1)[ -e 目录或者文件位置 ]:判断文件或者目录是否存在
    2)[ -d 目录或者文件位置 ]:判断是否为一个目录
    3)[ -f 目录或者文件位置 ]:判断是否为一个文件
    4)[ -r 目录或者文件位置 ]:判断当前用户是否有读取权限
    5)[ -w 目录或者文件位置 ]:判断当前用户是否有修改权限
    6)[ -x 目录或者文件位置 ]:判断当前用户是否有执行权限

    2、整数值比较
    1)[ number1 –eq number2]:判断两个数字是否相同
    2)[ number1 –ne number2]:判断两个数字是否不同
    3)[ number1 –lt number2]:判断第1个数字是否小于第2个数字
    4)[ number1 –gt number2]:判断第1个数字是否大于第2个数字
    5)[ number1 –le number2]:判断第1个数字是否小于等于第2个数字
    6)[ number1 –ge number2]:判断第1个数字是否大于等于第2个数字

    3、字符串比较
    1)[ 字符串1 = 字符串2 ]:判断两个字符串是否相同
    2)[ 字符串1 != 字符串2 ]:判断两个字符串是否不同
    3)[-z 字符串 ]:判断字符串是否为空

    4、逻辑判断
    [ 条件1 && 条件2 ]:两个条件都成立时,返回0
    [ 条件1 || 条件2 ]:两个条件有一个为0时,返回0
    [ !条件 ]:当条件不成立时,返回0

    六、if选择分支结构
    1)语法1
    if [ 条件测试操作 ]
    then
    条件完成执行的操作
    else
    条件未完成执行的操作
    fi
    2)语法2
    if [ 条件测试操作1 ]
    then
    条件1完成执行的操作
    elif [ 条件测试操作2 ]
    then
    条件2完成执行的操作
    else
    以上条件都未完成执行的操作
    fi

    if分支举例:
    监控系统的CPU、内存、根分区使用率,如果CPU使用率大于80%,内存使用率大于90%,根分区使用率大于90%,分别显示相应的告警信息

    !/bin/bash

    获取根分区磁盘使用率

    disk_usage_root=df -h | grep "/$" | awk '{print $5}' | awk -F% '{print $1}'

    获取CPU使用率

    cpu_idle=mpstat | tail -1 | awk '{print $11}' | awk -F. '{print $1}'
    cpu_usage=expr 100 - $cpu_idle

    获取内存使用率

    mem_used=free | grep "cache:" | awk '{print $3}'
    mem_total=free | grep "Mem:" | awk '{print $2}'
    mem_usage=expr $mem_used * 100 / $mem_total

    if [ $disk_usage_root -ge 90 ]
    then
    echo "你的磁盘使用率已经高于90%,目前你的磁盘使用率是:${disk_usage_root}%"
    elif [ $cpu_usage -ge 80 ]
    then
    echo "你的CPU使用率已经高于80%,目前你的CPU使用率是:${cpu_usage}%"
    elif [ $mem_usage -ge 90 ]
    then
    echo "你的内存使用率已经高于90%,目前你的内存率是:${mem_usage}%"
    fi

    七、for循环结构
    语法:
    for 变量名 in 变量取值列表
    do
    执行的操作
    done

    根据用户列表文件中的内容,实现批量建立用户,用户的初始密码为123456

    !/bin/bash

    userName=cat /shell/user.list
    for user in $userName
    do
    useradd $user
    echo "123456" | passwd --stdin $user &>/dev/null
    done

    八、while循环结构
    语法:
    while [ 条件测试操作 ]
    do
    执行的操作
    条件变化
    done
    在while循环中,有两个特殊的条件分别是true和false;当条件指定为true时,会无限循环,直到遇到exit语句才会跳出结束脚本;条件指定为false时,循环不会执行

    随机生成商品价格,用户猜测商品价格

    !/bin/bash

    price=expr $RANDOM % 1000
    times=0;

    echo "商品实际价格范围为0-999,猜猜看是多少:"

    while true
    do
    read -p "请输入你猜测的价格:" int
    let times++
    if [ $int -eq $price ]
    then
    echo "恭喜你答对了,实际价格是:$price"
    echo "你总共猜了${times}次"
    exit 0
    elif [ $int -gt $price ]
    then
    echo "太高了"
    else
    echo "太低了"
    fi
    done

    九、case选择结构
    语法:
    case 变量 in
    取值1)
    执行的操作
    ;;
    取值2)
    执行的操作
    ;;
    *)
    默认执行的操作
    *):代表case默认执行的操作
    ;;:表示中断一个case的操作

    使用case编写启动、停止、重启服务的脚本

    !/bin/bash

    case "$1" in
    start)
    echo -n "正在启动sleep服务…"
    sleep 7200 &
    if [ $? -eq 0 ]
    then
    echo "OK"
    fi
    ;;
    stop)
    echo -n "正在停止sleep服务…"
    pkill "sleep" &>/dev/null
    echo "OK"
    ;;
    status)
    pgrep "sleep" &>/dev/null
    if [ $? -eq 0 ]
    then
    echo "sleep服务已经启动"
    else
    echo "sleep服务已经停止"
    fi
    ;;
    restart)
    $0 stop
    $0 start
    ;;
    *)
    echo "用法: $0(start|stop|status|restart)"
    esac

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
  • 相关阅读:
    在线教程的游戏化-20分钟做了个demo
    (转)内江师院网络专业大二学子实习快报
    学云网线下国信安教育走进川师大
    Ruby on Rails框架开发学习
    Unity3D编程学习分享
    后高考时代规划专家推荐 学云网“学历技能就业”
    Tomcat调优及JMX监控
    XenServer pool 移除server 设置master
    计算程序总行数的Python代码
    SQL Server 无法生成 FRunCM 线程。请查看 SQL Server 错误日志和 Windows 事件日志
  • 原文地址:https://www.cnblogs.com/huoxc/p/12901267.html
Copyright © 2011-2022 走看看