RHCE-Shell脚本
第七天Shell脚本
脚本
是Linux最基本的语言
如何学好编程?
- 熟练使用vim编辑器
- 数量掌握Linux基本命令
- 数量掌握文本三剑客工具(grep、sed、awk)
- 熟悉常用服务的部署、优化、日志及排错
脚本的基本元素
mkdir /scripts		#创建写脚本的文件夹
vim file.sh			#加SH VIM是可以识别的
#!/bin/bash
#display date
date +%F
单行注释#
多行注释:<<BLOCK
			BLOCK
			
正文部分
赋予执行权限
脚本执行
通常使用1,2来执行脚本
- 相对路径
- 绝对路径
- 直接使用bash(bash file.sh)
- source file.sh
区别:
- 相对路径和绝对路径需要执行权限
- 使用bash执行不需要执行权限
- source执行,脚本中的变量在当前中生效
位置化参数
位置变量
这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
预定义变量
是Bash中已经定义好的变量,不能自定义,变量作用也是固定的
$0:脚本名
$*:所有的参数,双引号引起来时候参观视为单个字符串
$@:所有的参数,双引号引起来时,每个参数作为个体
$#:参数的个数
vim xx.sh
echo first name is "$1"	#$1脚本后的第一个参数
echo last name is "$2"
echo full name is "$*"
echo number is "$#"
echo name of script is "$0"
Read
read -p "please input your name:"NAME
read -t 5		#时间
lisi
echo $NAME
vim read.sh
read -p "please input two number: " X Y
echo "X+Y=$[$X+$Y]"
退出码
$?:上一条命令执行后的退出码
退出码:0-255
- 0表示成功
- 1-255都表示失败
ping -w5 1.1.1.1 > /dev/null	#ping5个包到黑洞
echo $?							#结果为1表示执行失败
判断/etc/profile HISTSIZE这个字符串?
grep -q HISTSIZE /etc/profile	#-q表示静默输出
echo $?
赋予退出码
exit 111	#退出返回111=C#的break
条件执行运算符
&&
command1 && command2 	#当com1执行成功时会执行com2,当com1执行失败时不会再执行com2
||
command1 || command2	#当com1成功时,不会执行com2,当com1失败时,才会执行com2
测试IP地址是否通?
#!/bin/bash
read -p "please input test ip :" ip
ping -w2 $ip &> /dev/null && echo "ip up!" || echo "ip erro"
复合指令
复合指令:即一串命令,()和{}都是对一串的命令进行执行,但有所区别
相同点:
()和{}都是把一串的命令放在括号里,如果命令在一行命令之间用;号隔开
不同点:
- ()只是对一串命令重新开一个子执行,{}对一串命令在当前执行
- ()最后一个命令可以不用分号,{}最后一个命令要用分号
- ()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
- ()和{}里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令
举例:
(pwd;cd/tmp;pwd)
{pwd;cd/tmp;pwd;}
条件测试
长格式语法
test+表达式
test A = B	#判断A=B吗
echo $?		#0为真1为假
短格式语法
[ A = B ]
echo $?
[ $? = 0 ]	#上一条命令执行成功了吗?
[ $? != 0 ] #上一条命令执行失败了吗?
[ -n "$A" ] #判断是否定义,为0就是定义了
测试文件的属性信息
比较两个数值大小
更多的说明
IF语句
单分支结构
例:查看主机是否存活
#ping -w2 192.168.40.1 &> /dev/null && the host is up
if ping -w2 192.168.40.1 &> /dev/null
then 
	echo the host is up 
else
	echo the host is down
fi
多分支结构
例:整数比大小
if [ $1 -gt $2 ];then
	echo "$1"greater then"$2"
elif [$1 -eq $2];then
	echo "$1"is equal to"$2"
else
	echo"$1"less then"$2"
fi
例:备份文件脚本
- 如果DEST目录存在,并且是个目录,直接复制
- 如果DEST目录文件存在吗,就重命名目录,再创建DEST,最后复制
- 输入Y重命名
- 输入N不重命名
 
- 创建DEST,最后复制
SOURCE=/etc	DEST=/tmp/redhat 
if [ -d $DEST ];then
	cp -r $SOURCE $DEST
elif [ -e $DEST ];then
	read -p "rename $DEST to $DEST.bak(y/n): " USERINPUT
	echo $USERINPUT | grep -iq ^y
	if [ $? = 0];then	
		mv $DEST $DEST.bak
		mkdir -p $DEST
		cp -r $SOURCE $DEST
	elif [ $USERINPUT = n ];then
		echo "Please process the file manually, and execute the script file again after completion"
	else
		echo "Enter the wrong parameter, please try again!"
	fi
else
	mkdir -p $DEST
	cp -r $SOURCE $DEST
fi
CASE语句
case $1 in
	redhat)
		echo fedora
		;;
		fedora)
		echo fedora
		;;
		*)
			echo "please input redhat|fedora"
		;;
esac
For循环
变量 变量的值
for 变量名 in 1 2 3 4 5
第一种:基础
for i in 1 2 3 4 5
do		#循环的开始
echo $i
done	#循环的结束
第二种:SEQ
for i in $(seq 10)	#$()取命令获取的值
do		
echo $i
done	
第三种:
for i in {a..z}
do		
echo $i
done	
第四种:$(文件)
for i in $(ls /etc/*.conf)
do		
cp $i /tmp/$i
done	
例:批量创建用户
需求:
- 用户名来自用户列表的文件
- 设置密码,密码随机的字符串
for NUM in $(seq 100)
do
	useradd user$NUM
done
for USER in $(cat /root/scripts/userinfo)
do
	useradd $USER
	PASSWORD=$(open rand -base64 6)		#随机生成密码
	echo $PASSWORD | passwd --stdin $USER &> /dev/null
	echo create user $USER successfully
	echo "username:$USER password:$PASSWORD" >>/root/scripts/user.txt
done
例:判断当前网络(假定为192.168.1.0/24)当前在线用户的IP有哪些?
--使用类似C风格
for ((i=1;i<=254;i++))
do
if ping -c 2 -W 1 192.168.1.$i &>/dev/null
	then
	echo"192.168.1.$i is up..."
else
	echo"192.168.1.$i is down..."
fi
done
--使用老方法实现
SUM=0
for i in $(seq $1)
do
SUM=$[$SUM+$i]
done
while循环
while怎么从文件中取值?
while read line
do
	statement1
done<File
实例:
[root@ scripts]# cat ~/.vimrc
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"##############################################################")
call setline(3, "# File Name: ".expand("%"))
call setline(4, "# Version: V1.0")
call setline(5, "# Author: oscar")
call setline(6, "# Email: l")
call setline(7, "# Created Time : ".strftime("%F %T"))
call setline(8, "# Description:")
call setline(9,"##############################################################")
call setline(10, "")
endif
endfunc

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号