RHCE-Shell脚本

第七天Shell脚本

脚本

是Linux最基本的语言

如何学好编程?

  1. 熟练使用vim编辑器
  2. 数量掌握Linux基本命令
  3. 数量掌握文本三剑客工具(grep、sed、awk)
  4. 熟悉常用服务的部署、优化、日志及排错

脚本的基本元素

mkdir /scripts		#创建写脚本的文件夹
vim file.sh			#加SH VIM是可以识别的

#!/bin/bash
#display date
date +%F
单行注释#
多行注释:<<BLOCK
			BLOCK
			
正文部分
赋予执行权限

脚本执行

通常使用1,2来执行脚本

  1. 相对路径
  2. 绝对路径
  3. 直接使用bash(bash file.sh)
  4. source file.sh

区别:

  1. 相对路径和绝对路径需要执行权限
  2. 使用bash执行不需要执行权限
  3. 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就是定义了

测试文件的属性信息

image-20210802144523682

比较两个数值大小

image-20210802144557821

更多的说明

更多的例子

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
例:备份文件脚本
  1. 如果DEST目录存在,并且是个目录,直接复制
  2. 如果DEST目录文件存在吗,就重命名目录,再创建DEST,最后复制
    1. 输入Y重命名
    2. 输入N不重命名
  3. 创建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	

例:批量创建用户

需求:
  1. 用户名来自用户列表的文件
  2. 设置密码,密码随机的字符串
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
posted @ 2021-08-02 21:31  令禹  阅读(90)  评论(0)    收藏  举报