shell编程

目录


第一个shell脚本

#!/bin/bash
# This is first program

echo -e "\e[1;34mhello world\r[0m"

输出命令

  • echo “hello world”
  • echo -e “hello\b\t\n”
  • echo -e “\e[1;31mhello\e[0m”

接受键盘输入

  • read [选项] [变量名]
    – p “提示信息”:在等待read输入时,输出提示信息
    – t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
    – n 字符数:read命令只接受指定的字符数,就会执行
    – s 隐藏输入的数据,适用于机器密码的输入
#!/bin/bash

read -p "please input you name: " -t 30 name
echo $name

read -p "please input you passwd: " -s passwd
echo -e "\n"
echo $passwd

read -p "please input your sex [M/F]: " -n 1 sex
echo -e "\n"
echo $sex

Bash变量

命名规则
  • 变量名只能以字母或者下划线开始,由字母、下划线和数字组成
  • 变量名的长度不超过255个字符
  • 变量名在有效的范围内必须是唯一的
  • 在Bash中,变量的默认类型都是字符串型
变量的分类
  • 用户自定义变量
  • 环境变量
  • 位置参数变量
  • 预定义变量
用户自定义变量
  • 变量名=变量值:x=5
  • 变量调用:echo $变量名
  • 变量叠加:x=123 echo “$x”456
  • 查询变量:set 命令
    – u 如果设定此选项,调用为声明变量时会报错(默认无任何提示)
  • unset 变量名
    注意:变量名前面不加$符号
Bash环境变量
  • 与用户自定义变量区别:Bash环境变量时全局变量,用户自定义变量是局部变量。
  • 对系统生效的环境变量名和变量作用时固定的
  • export 变量名=变量值 或
    – 变量名=变量值
    – export 变量名
  • 查看环境变量:env
PATH环境变量
  • 系统查找命令路径
  • 增加PATH命令的值:PATH=”$PATH”:/root
PS1环境变量
Bash语系变量
  • 查询当前语系:locale
  • 查看所有语系环境:locale -a
  • 查询系统默认语系:vi /etc/sysconfig/i18n
位置参数变量
  • $n:n为数字,$0表示命令本身,$i-$9代表第一到第九个参数,十以上的参数需要大括号包含,如${10}
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum
  • $*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
  • @ @把没个参数区分对待
  • $#:这个变量代表命令行中所有参数的个数
#!/bin/bash

for i in "$*"
# 循环一次
        do
                echo "The parameters is: $i"
        done

for y in "$@"
# 根据输入参数循环
        do
                echo "The parameters is: $y"
        done
预定义变量
  • $?:最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体哪个数, 由命令自己决定),则证明上一个命令执行不正确
  • $$:当前进程的进程号(PID)
  • $!:后台运行的最后一个进程的进程号(PID)

shell 运算符

declare声明变量类型
  • declare [+/-] [选项] 变量名
  • 选项
    – -:给变量设定类型属性
    – +: 取消变量的类型属性
    – -a:将变量声明为数组型
    – -i:将变量声明为整型
    – -x:将变量声明为环境变量
    – -r:将变量声明为只读变量’
    – -p:显示指定变量的被声明的类型

  • 声明数组变量

  • 定义数组
  • movie[0]=zp
  • movie[1]=zp
  • declare -a movie[2]=live
  • 查看数组
  • echo ${movie}
  • echo ${movie[2]}
  • echo ${movie[*]}

  • 声明环境变量

  • declare -x test=123

  • 声明只读属性

  • declare -r test=123
数值运算方法
  • 方法2:expr或let数值运算工具
  • aa=11
  • bb=11
  • ff=$(expr $aa + $bb)
  • echo $ff
  • 方法2:”$((运算式))”或”$[运算式]”
  • ff=$(($aa+$bb))
变量测试
  • unset y
  • x=${y-2}
  • echo $x
  • y=”” y为空

环境变量配置文件

  • source 配置文件 或 . 配置文件
环境变量配置文件简介
  • 环境变量配置文件中主要是定义对系统操作系统生效的系统默认环境变量,如PATH等。
  • /etc/profile
  • /etc/profile.d/*.sh
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc

环境变量配置文件的功能

  • /etc/profile
    – USER变量:
    – LOGNAME变量:
    – MAIL变量:
    – PATH变量:
    – HOSTNAME变量:
    – HISTSIZE变量:
    – umask:
    – 调用/etc/profile.d/*.sh文件

  • ~/.bash_profile

  • ~/.bashrc
    – 别名
  • /etc/bashrc
    – PS1变量
    – umask
    – PATH变量
    – 调用/etc/profile.d/*.sh文件
    这里写图片描述
其他环境变量配置文件
  • 注销时生效的环境变量配置文件
  • ~/.bash_logout
  • 本地终端欢迎信息:/etc/issue
    -远程终端欢迎信息:/etc/issue.net
    – 转义符在/etc/issue.net文件中不能使用
    – 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入”Banner /etc/issue.net”行才能显示(记得重启SSH服务)
  • 登陆后欢迎信息:/etc/motd
    – 不管是本地登录,还是远程登录,都可以显示此欢迎信息

shell变成之条件判断与流程控制

  • 按照文件类型进行判断
    – d 判断文件是否存在,并且是否为目录文件
    – e 判断文件是否存在(存在为真)
    – f 判断文件时候存在,并且为普通文件
  • test -e 文件名 或 [ -e 文件名 ]
  • [ -e /root/install.log ] && echo yes || echo no

  • 文件权限判断
    – r 读权限
    – w 写权限
    – x 执行权限

  • 两个文件之间进行比较
    – 文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新(如果新则为真)
    – 文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧(如果旧则为真)
    – 文件1 -ef 文件2 判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法。

  • 两个整数之间比较
  • 整数1 -eq 整数2 判断整数1是否和整数2相等(相等为真)
  • 整数1 -ne 整数2 判断整数1是否和整数2不相等
  • 整数1 -gt 整数2 判断整数1是否大于整数2
  • 整数1 -lt 整数2 判断整数1是否小于整数2
  • 整数1 -ge 整数2 判断整数1是否大于等于整数2
  • 整数1 -le 整数2 判断整数1是否小于等于整数2
  • [ 23 ge 22 ] && echo yes || echo no

  • 字符串的判断
    – z 字符串 判断字符串是否为空
    – n 字符串 判断字符串是否为非空
  • 字符串1 == 字符串2 判断字符串1是否和字符串2相等
  • 字符串1 != 字符串2 判断字符串1是否和字符串2不相等
  • [ -z $name ] && echo yes || echo no
  • aa=11
  • bb=11
  • [ “ aa"==" bb” ] && echo yes || echo no

  • 多重条件判断
  • 判断1 -a 判断2 逻辑与
  • 判断1 -o 判断2 逻辑或
  • ! 判断 逻辑非
  • [ -n “ aa"a aa -gt 22 ] && echo yes || echo no

单分支if条件语句

if [ 条件判断式 ]; then
    程序
 if

if [ 条件判断式 ]
     then
     程序
fi

判断登录的用户是否为root

#!/bin/bash
test=$(env | grep "USER" | cut -d "=" -f 2)
if [ "$test" == "root" ]; then
    echo "Current user is root"
if

分区使用率

#!/bin/bash
rate=$(df -h | grep sda5 | awk '{print $5}' | cut -d "%" -f 1)
if [ "$rate" -ge "90" ]
    then
        echo "Warning root partion greater than 90%"
fi

双分支if条件语句

if [ 条件判断式 ]
    then
        程序
    else
        程序
fi

判断apache是否存在

#!/bin/bash
test=$(ps aux | grep httpd | grep -v grep)
if [ -n "$test" ]
    then
        echo "Apache is working"
    else
        echo "Apache stop "
        /etc/rc.d/init.d/httpd restart
fi

多分支if条件语句

if [ 条件判断式1 ]
    then
        程序
elif [ 条件判断式2 ]
    then
        程序
else
    程序
fi

多分支case条件语句

case $变量名 in
    "值1")
        程序
        ;;
    "值2")
        程序
        ;;
    *)
        程序
        ;;
    esac
#!/bin/bash

read -t 30 -p "please input yes/no: " cho

case "$cho" in
    "yes")
        echo yes
        ;;
    "no")
        echo no
        ;;
    *)
        echo error
        ;;
esac

for循环

for 变量 in123
    do
        程序
    done

批量解压缩

#!/bin/bash

cd /root/test/
ls *.tar.gz > ls.log
ls *.tgz >> ls.log

for i in $(cat ls.log)
    do
        tar -zxvf $i & > /dev/null
    done
#!/bin/bash

s=0
for (( i=0;i<=100;i=1+1 ))
    do
        s=$(( $s+$i ))
    done
echo $s    

批量添加删除指定数量的用户

#!/bin/bash

read -p "Please input user name: " -t 30 name
read -p "Please input the number of users: " -t 30 num
read -p "Please input the password of users: " -t 30 pass

if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
    then
    y=$(echo $num | sed 's/[0-9]//g')
    if [-z "$y"]
        then
            for (( i=0;i<$num;i=i+1))
                do
                    /usr/sbin/useradd $name$i &> /dev/null
                    echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
                done
    fi
fi

while循环和until循环

while [ 条件判断式 ]
    do
        程序
    done
#!/bin/bash

i=1
s=0
while [ $i -le 100 ]
    do
        s = $(( $s+$i ))
        i = $(( $i+1 ))
    done
echo $s
#!/bin/bash

i=1
s=0
until [ $i -gt 100 ]
    do
        s = $(( $s+$i ))
        i = $(( $i+1 ))
    done
echo $s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值