shell脚本编写基础教程详解及其demo

脚本概念
  • 将多个命令整合在一个文件
  • 通过执行加载一个文件可以完成多件事
变量
  • 创建变量,是临时的

    X=1234
    
  • 输出变量

    echo $X
    
  • 执行脚本

    sh 脚本路径.sh
    
  • 脚本demo

    dir=oldgirl
    
    mkdir /$dir/oldboy01
    mkdir /$dir/oldboy02
    mkdir /$dir/oldboy03
    
  • 永久变量的设置

    vi /etc/profile
    切换到行尾
    添加x=1234
    即使系统重启后echo $x 也会存在
    后续修改后需要重新加载
    
  • 重新加载文件

    source /ect/profile
    
  • 显示环境变量

    echo $PATH
    或
    env
    
  • 环境变量生效顺序

    • /etc/profile:开机所有用户加载此文件
    • .~/.bashrc
    • .bash_profile
    • .bashrc
    • /etc/bashrc
条件表达式
  • 文件测试

    参数解释
    -e存在则为真
    -f是否为文件
    -d是否为目录,是否存在
    -x是否可执行
    -r是否可读
    -w是否可写
  • 用法

    #/etc/hosts是否存在
    [ -e /etc/hosts ]
    
    echo $?
    0
    0为上一条命令执行结果为正确,文件存在
    
    
    [ -f /etc/hostsss ] && echo ok || echo error
    error
    不为文件/不存在
    
    [ -d /etc ] && echo ok || echo error
    ok
    /etc为目录
    
    或者用 test -参数 文件
    
数值比较

语法格式:[ 数值1 比较符 数值2 ]

判断比较符号
符号含义
-gt大于
-lt小于
-eq等于
-ge大于等于
-le小于等于
-ne不等于
-n字符串长度不为0
-z字符串长度是否为0
  • [ [] ]建议使用 == != > < >= <= 比较符

  • 用法

    [ 10 -eq 10 ] && echo $? || echo $? == [ 10 -eq 10 ];echo $?
    0
    0
    
    [root@pert ~]# [ 10 -eq 12 ] && echo $? || echo $? == [ 10 -eq 12 ];echo $?
    1 == [ 10 -eq 12 ]
    0
    
  • 统计磁盘使用率,如果磁盘大于5%则发邮件报警,小于则提示ok

    • 如何取出磁盘当前使用率

      disk=`df -h | grep /$ | awk '{print ${NF-1}}'` 
      
      #从后往前删除一个%,需要加撬棍转义
      echo ${disk%\%}
      
    • 用数值表达式判断大小 如果小于提示ok

    • 测试脚本

      #!/bin/bash
      disk=`df -h | grep /$|awk '{print $(NF-1)}'`
      [ ${disk%\%} -gt 5 ] && echo 磁盘使用已超过5%,当前使用率为$disk || echo ok
      
  • 统计内存判断使用率

    [ `free | awk 'NR==2{print $3/$2*100}' | awk -F. '{print $1}'` -gt 4 ] && echo mail || echo error
    
多整数比较
参数含义
-a并且
-o或者
[ 10 -eq 10 -a 10 -lt 9 ] && echo 成立 || echo 不成立
不成立

[ 10 -eq 10 -o 10 -lt 9 ] && echo 成立 || echo 不成立
成立
  • 在双括号([[]])里用 && == -a、||==-o
字符串比较需要加双引号
[ "$USER"==root ] || echo 成立 || echo 不成立
成立
正则比较:需要使用[[ ]]

“=~” 用于判断string和右边的pattern是否匹配

[[ $USER =~ ^r ]]
echo $?
0

[[ !$USER =~ ^r ]]
echo $?
0

判断是否是整数
test=123qqq
[[ $test =~ ^[0-9]+$ ]]
echo $?
if
if [判断的条件] && [判断条件2]
then
	符合执行的
else
	不符合执行的
fi

$UID:显示当前登陆系统用户id数值
/usr/bin/id -gn:显示当前登陆系统用户的组名
/usr/bin/id -un:显示当前登陆系统用户的用户名

&&都需要满足
  • 单个条件可以简写

    [ 判断的条件 ] && 满足条件执行的命令
    
  • demo

    #!/bin/sh
    
    SYSTEM=`uname -s` # 获取操作系统类型,我本地是linux
    
    # 如果是linux话输出linux字符串
    if [ $SYSTEM = "Linux" ] ; then 
    echo "Linux"
    elif [ $SYSTEM = "FreeBSD" ] ; then
    echo "FreeBSD"
    elif [ $SYSTEM = "Solaris" ] ; then
    echo "Solaris"
    else
    echo "What?"
    fi # 判断结束,以fi结尾
    
for
  • 命令行中使用

    for num in {01..10};do echo $num;done
    
  • 脚本中使用

    1.sh
    #!/bin/bash
    
    for old in {1..100}
    do
    	cat 1.txt >> 2.txt
    done
    
    sh 1.sh
    
sleep:睡眠
1.sh
sleep 60
暂停60秒
脚本中符号要注意的
  • 字符串需加双引号,不知道加什么就加双引号,解析变量
  • 单引号所见即所得,不解析变量
  • 反引号解析命令``
  • $()也可以解析命令
  • 命令的定义是把结果复制给了变量,如果想改变结果 再次赋值
Shell特殊位置变量
  • $0

    [root@pert ~]# sh 1.sh
    1.sh
    [root@pert ~]# sh /root/1.sh 
    /root/1.sh
    [root@pert ~]# sh ./1.sh 
    ./1.sh
    
    [root@pert ~]# basename /root/1.sh 
    1.sh
    [root@pert ~]# basename ./1.sh 
    1.sh
    [root@pert ~]# basename 1.sh 
    1.sh
    
  • $n:脚本的第n个参数

    sh 1.sh oldboy oldgirl
    
    #1.sh
    echo $1
    echo $2
    
    oldboy oldgirl
    
    执行脚本后面跟的就是参数
    

    ps: 9 之后需要加括号,比如: 9之后需要加括号,比如: 9之后需要加括号,比如:(10)、$(11)

    否则就是$1+0

  • $#:获取脚本传参的总个数,控制脚本的传参个数

    #1.sh
    [ $# -ne 2 ] && echo "请输入两个参数" && exit
    name=$1
    age=$2
    echo $name $age
    
    sh 1.sh oldboy 18
    oldboy 18
    
    sh 1.sh old
    清输入两个参数
    
    exit 50
    执行结束后打印$?结果的是50
    
  • $ ∗ :获取脚本所有的参数,不加引号和 *:获取脚本所有的参数,不加引号和 :获取脚本所有的参数,不加引号和@相同,加上双引号,则把多个参数视为一个参数

    #1.sh
    echo $*
    echo $@
    
    sh 1.sh old girl boy
    
    old girl boy
    old girl boy
    
  • $ @ :获取脚本所有的参数,不加引号和 @:获取脚本所有的参数,不加引号和 @:获取脚本所有的参数,不加引号和*相同,加上双引号,则把多个参数都视为独立的参数

    #1.sh
    echo "$*"
    echo "$@"
    
    sh 1.sh old girl boy
    
    old girl boy
    old girl boy
    
  • $?:获取上一条命令的返回结果 0:成功、非0:失败

    echo 11
    11
    
    echo $?
    0
    
    ls ----
    error
    
    echo $?
    2
    
  • $$;获取脚本的pid

  • $!:获取上一个在后台运行的脚本pid

    kill -9 $!
    
  • $_:获取上一条命令的最后一个参数,相当于esc+.

PS: ∗ 和 *和 @在脚本中相同,在循环体内不同
#模拟传参
set -- "I am sll boy"
#正常打印,不加双引号
echo $*
I am sll boy
echo $@
I am sll boy

#正常打印,加双引号
echo "$*
I am sll boy
echo "$@"
I am sll boy


#用for循环不加引号
for i in $*;do echo $i;done
I
am
sll
boy
for i in $@;do echo $i;done
I
am
sll
boy

#用for加双引号
for i in "$*";do echo $i;done
I am sll boy

for i in "$@";do echo $i;done
I
am
sll
boy
read:相当于python的input
#!/bin/bash
dir="/etc/hosts"
read -p "请输入一个文件名称:" dir1
echo $dir
echo $dir1

#多个参数
read -p "请输入两个数字" num1 num2
数值运算
  • expr:整数运算
expr 1+1
1+1

expr 1 + 1
2

expr 1 \* 10
10

expr 1 / 10
0

expr 10 /2
5

判断是否为整数
expr 1 + 变量
[ $? -eq 0 ] && echo 为整数 || echo 不为整数
  • $():整数运算,运算效率最高
echo $((10+10))
20

echo $((10/10))
1

echo $((10-10))
0

echo $((10*10))
100
  • $[]:整数运算
echo $[10+10]
20

echo $[10*10]
100
  • bc:整数运算、小数运算
echo 1+1|bc
2

echo 10*10.5|bc
105
  • awk:整数、小数运算
awk 'BEGIN{print 1+1.5}'
2.5

echo 10 20 | awk '{print $1*$2}'
200
echo高级用法
  • 从前往后删除

    url=www.baidu.com
    
    echo $url
    www.baidu.com
    
    echo $url | sed "s#www.##g"
    baidu.com
    
    echo ${url#*.}
    baidu.com
    
    echo ${url#*.*.}
    com
    
    echo ${url##*.}
    com
    
    #:后面跟要删除的匹配字符
    ##:贪婪匹配
    
  • 从后往前删除

    url=www.baidu.com
    
    echo $url
    www.baidu.com
    
    
    echo ${url%.*}
    www.baidu
    
    echo ${url%.*.*}
    www
    
    echo ${url%%.*}
    www
    
    %:后面跟要删除的匹配字符
    %%:贪婪匹配
    
  • 替换

    echo $url
    www.baidu.com
    
    echo ${url/www/sss}
    sss.baidu.com
    
    贪婪匹配
    echo ${url//w/s}
    sss.baidu.com
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值