常见的3种变量
-
系统变量
-
环境变量
-
用户变量
简单变量
[root@localhost ~]# a=18 [root@localhost ~]# echo $a 18
系统变量
$0 当前脚本的名称; $n 当前脚本的第n个参数,n=1,2,…9; $* 当前脚本的所有参数; $# 当前脚本的参数个数; $? 程序执行完后的状态,返回0表示执行成功; $$ 程序本身的PID号。
环境变量
echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/wangj:/root/bin echo $HOME # 打印用户家目录 /home/wangj echo $SHELL # 打印当前Shell类型 /bin/bash echo $USER # 打印当前用户名 wangj echo $ID # 打印当前用户ID 1000 echo $PWD # 打印当前所在路径 /root echo $TERM # 打印当前终端类型 xterm echo $HOSTNAME # 打印当前主机名 localhost.localdomain echo $PS1 # 定义主机命令提示符 [u@h W]$ echo $RANDOM # 随机生成一个 0 至 32767 的整数 6524Shell 字符串
单引号特点
' 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
双引号特点
' 双引号里可以有变量Shell 数组
读取索引数组
' Shell 数组用括号表示,元素用空格符号分割开
#!/bin/bash
a=(A B "C" D)
echo $a
'输出结果:A'
`你是否在疑惑只输出的第一个,shell里我们不能像别的语言一样,直接输出全部,因此我们要修改一下
`像这样:
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}
`如果想一次性全部输出,并不想通过索引来输出怎么办?可以使用 @ 或 * 获取数组中的所有元素
echo ${a[@]}
echo ${a[*]}
`获得数组的长度
echo ${#a[*]}
Test 语句
数值测试
-eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于则为真 -lt 小于则为真 -le 小于等于则为真
实例
#!/bin/bash NUM1=200 NUM2=200 if test $NUM1 -eq $NUM2 then echo "两数相等" else echo "两数不等" fi
字符串测试
= 等于则为真 != 不相等则为真 -z 字符串 字符串的长度为零则为真 -n 字符串 字符串的长度不为零则为真
实例
#!/bin/bash NUM1="wangjun" NUM2="wangjun" if test $NUM1 = $NUM2 then echo "两字符串相同" else echo "两字符串不同" fi
文件测试
-e 文件名 如果文件存在则为真 -r 文件名 如果文件存在且可读则为真 -w 文件名 如果文件存在且可写则为真 -x 文件名 如果文件存在且可执行则为真 -s 文件名 如果文件存在且至少有一个字符则为真 -d 文件名 如果文件存在且为目录则为真 -f 文件名 如果文件存在且为普通文件则为真 -c 文件名 如果文件存在且为字符型特殊文件则为真 -b 文件名 如果文件存在且为块特殊文件则为真
实例
#!/bin/bash if test -e ~/1.sh then echo "文件已存在" else echo "文件不存在" fiShell 流程控制语句 if 条件语句
'if条件判断语句 通常以if开头 fi结尾 也可加入else或者elif进行多条件的判断' ` 单分支语句 if (条件表达式); then 语句1 fi ` 双分支if 语句 if (表达式) 语句1 else 语句2 fi ` 多支条件语句 if (表达式) 语句1 elif 语句2 elif 语句2 fi
常见逻辑判断运算符
-f 判断文件是否存在 eg: if [ -f filename ] -d 判断目录是否存在 eg: if [ -d dir ] -eq 等于 -ne 不等于 -lt 小于 -gt 大于 -le 小于或等于 -ge 大于或等于 -a 双方都成立(and) 逻辑表达式 –a 逻辑表达式 -o 单方成立(or) 逻辑表达式 –o 逻辑表达式 -z 空字符串 -x 是否具有可执行权限 || 单方成立 && 双方都成立表达式实例
判断服务是否在运行
#!/bin/bash # 定义变量名 NAME=zabbix # 定义 NUM=`ps -ef | grep $NAME | grep -vc grep` # 过滤 if [ $NUM -ge 1 ]; then # 判断 echo "$NAME running!" else echo "$NAME is not running!" fi
根据输入参数值返回结果
#!/bin/bash NUM=$1 if [ $NUM -gt 90 ]; then echo "Very Good!" elif [ $NUM -gt 70 ]; then echo "Good!" elif [ $NUM -gt 60 ]; then echo "Pass!" else echo "No Pass!" fi
比较两个参数的大小
#!/bin/bash A=$1 B=$2 if [ $A -eq $B ]; then echo "$A 等于 $B" elif [ $A -gt $B ]; then echo "$A 大于 $B " elif [ $A -lt $B ]; then echo "$A 小于 $B" else echo "输入有误!!" fifor 循环语句
'格式:for name [ [ in [ word ... ] ] ; ] do list ; done
for 变量名 in 取值列表; do
语句 1
done
实例
检测同一局域网 多台主机是否存活
#!/bin/bash NETWORK=$1 for HOST in $(seq 100 254); do ping -c 1 $NETWORK.$HOST > /dev/null && RESULT=0 || RESULT=1 if [ "$RESULT" == 0 ]; then echo -e " 33[32;1m$NETWORK.$HOST is up 33[0m" echo "$NETWORK.$HOST" >> /tmp/up.txt else echo -e " 33[;31m$NETWORK.$HOST is down 33[0m" echo "$NETWORK.$HOST" >> /tmp/down.txt fi donewhile 循环语句
' While循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于需要循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while…do开头done结尾 与while关联的还有一个 until 语句,它与 while 不同之处在于,是当条件表达式为 false 时才循环,实际使用中比较少,这里不再讲解 while (表达式) do 语句1 done
break 和 continue 语句
' break 和 continue 语句 break 终止循环 continue 跳出当前循环 ` 示例1: break 语句 #!/bin/bash N=0 while true; do let N++ if [ $N -eq 5 ]; then # N 等于 5 终止循环 break fi echo $N done 输出结果: 1 2 3 4 ` 示例2: continue 语句 #!/bin/bash N=0 while [ $N -lt 5 ]; do let N++ if [ $N -eq 3 ]; then # N 等于 3 跳出当前循环 continue fi echo $N done 输出结果: 1 2 4 5 ` 示例3 打印 1-100 数字 #!/bin/bash N=0 while ((N<=100)) do echo $N N=`expr $N + 1` done实例
求 1-100 的总和
#!/bin/bash N=0 I=1 while ((I<=100)) do N=`expr $N + $I` ((I++)) done echo $N
每 10S 循环判断系统登录
#!/bin/bash USER="root" while true do echo "The Time is `date`" sleep 10 NUM=`who | grep "$USER" | wc -l` if [[ $NUM -ge 1 ]]; then echo "The $USER is login in System!" fi doneCase 选择语句
' Case选择语句,主要用于对多个选择条件进行匹配输出,与if elif语句结构类似,通常用于脚本传递输入参数,打印出输出结果及内容,其语法格式以Case…in开头,esac结尾。语法格式如下: case 模式名 in 模式 1)命令 ;; 模式 2)命令 ;; *)不符合以上模式执行的命令 esac # 每个模式必须以右括号结束,命令结尾以双分号结束实例
编写 httpd 服务启动脚本
#!/bin/bash
while true
do
echo -e " 33[33m 该脚本为HTTP启动脚本 33[0m"
read -p "请输入您的选择[start/stop/restart/status]:" CHAR
case $CHAR in
start)/etc/init.d/httpd start && echo -e " 33[31m httpd服务已开启 33[0m" || echo "开启失败"
;;
stop)/etc/init.d/httpd stop && echo -e " 33[32m httpd服务已关闭 33[0m" || echo "关闭失败"
;;
restart)/etc/init.d/httpd restart && echo -e " 33[33m httpd服务已重启 33[0m" || echo "重启失败"
;;
status)/etc/init.d/httpd status && echo -e " 33[34m httpd服务的状态 33[0m"
;;
*)echo -e " 33[31m 您输入有误 33[0m"
break
;;
esac
done
Select 选择语句
' Select 是一个类似于 for 循环的语句 ' Select 语句一般用于选择,常用于选择菜单的创建,可以配合PS3来做打印菜单的输出信息,其语法格式以select…in do开头,done结尾 select i in (表达式) do 语句 done
选择MySQL版本
#!/bin/bash PS3="Select a Number:" while true; do select MYSQL_VERSION in 5.1 5.6 quit; do case $MYSQL_VERSION in 5.1) echo "MySQL 5.1" break ;; 5.6) echo "MySQL 5.6" break ;; exit) exit ;; *) echo "输入有误!" break esac done done



