栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Shell 详解

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Shell 详解

Shell 变量

常见的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 的整数
6524
Shell 字符串

单引号特点

' 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的

双引号特点

' 双引号里可以有变量
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 "文件不存在"
fi
Shell 流程控制语句 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 "输入有误!!"
fi
for 循环语句
'格式: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
done

while 循环语句
' 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
done
Case 选择语句
' 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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604399.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号