shell编程

来源:互联网 发布:照片修改软件在线 编辑:程序博客网 时间:2024/06/11 00:18

目录

    • 目录
    • 第一个shell脚本
    • 输出命令
    • 接受键盘输入
    • Bash变量
        • 命名规则
        • 变量的分类
        • 用户自定义变量
        • Bash环境变量
        • PATH环境变量
        • PS1环境变量
        • Bash语系变量
        • 位置参数变量
        • 预定义变量
    • shell 运算符
        • declare声明变量类型
        • 数值运算方法
        • 变量测试
    • 环境变量配置文件
        • 环境变量配置文件简介
      • 环境变量配置文件的功能
        • 其他环境变量配置文件
    • shell变成之条件判断与流程控制
    • 单分支if条件语句
    • 双分支if条件语句
    • 多分支if条件语句
    • 多分支case条件语句
    • for循环
    • while循环和until循环


第一个shell脚本

#!/bin/bash# This is first programecho -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/bashread -p "please input you name: " -t 30 nameecho $nameread -p "please input you passwd: " -s passwdecho -e "\n"echo $passwdread -p "please input your sex [M/F]: " -n 1 sexecho -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/bashnum1=$1num2=$2sum=$(($num1+$num2))echo $sum
  • $*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
  • @@把没个参数区分对待
  • $#:这个变量代表命令行中所有参数的个数
#!/bin/bashfor i in "$*"# 循环一次        do                echo "The parameters is: $i"        donefor 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"aaa -gt 22 ] && echo yes || echo no

单分支if条件语句

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

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

判断登录的用户是否为root

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

分区使用率

#!/bin/bashrate=$(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/bashtest=$(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 restartfi

多分支if条件语句

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

多分支case条件语句

case $变量名 in    "值1")        程序        ;;    "值2")        程序        ;;    *)        程序        ;;    esac
#!/bin/bashread -t 30 -p "please input yes/no: " chocase "$cho" in    "yes")        echo yes        ;;    "no")        echo no        ;;    *)        echo error        ;;esac

for循环

for 变量 in123    do        程序    done

批量解压缩

#!/bin/bashcd /root/test/ls *.tar.gz > ls.logls *.tgz >> ls.logfor i in $(cat ls.log)    do        tar -zxvf $i & > /dev/null    done
#!/bin/bashs=0for (( i=0;i<=100;i=1+1 ))    do        s=$(( $s+$i ))    doneecho $s    

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

#!/bin/bashread -p "Please input user name: " -t 30 nameread -p "Please input the number of users: " -t 30 numread -p "Please input the password of users: " -t 30 passif [ ! -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    fifi

while循环和until循环

while [ 条件判断式 ]    do        程序    done
#!/bin/bashi=1s=0while [ $i -le 100 ]    do        s = $(( $s+$i ))        i = $(( $i+1 ))    doneecho $s
#!/bin/bashi=1s=0until [ $i -gt 100 ]    do        s = $(( $s+$i ))        i = $(( $i+1 ))    doneecho $s
0 0