目录
第一个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 变量 in 值1 值2 值3
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