shell之变量、read命令、命令别名的设定、函数、几种语句
1.变量
(1).环境级变量
export a=1 ##声明a=1,相当于把变量放到公共部分让子进程可以读到
echo $a
bash
ps f
logout
echo $a
(2).用户级变量
vim .bash_profile
###################
添加 export a=1
source .bash_profile
echo $a
exit
echo $a
(3).系统级变量
vim /etc/profile
###############
添加 export a=1
source /etc/profile
echo $a
su - student
echo $a
2.字符的转译及变量的声明
\ #转译单个字符
"" #弱引用,批量转译""中出现的字符
'' #强引用,批量转译''中出现的字符
""与''的区别 在于 ""不能转译 \ ` ! $ 这4个特殊字符
${} #变量声明
实验:
a=(1 2 3)
echo $a
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
ls
name=(`ls`)
echo $name
echo ${name[0]}
echo ${name[1]}
echo ${name[2]}
3.变量值传递
$0 #脚本名
$1 #脚本后的第一串字符
$2 #脚本后的第二串字符
$3 #脚本后的第三串字符
$# #脚本后所跟字符串的个数
$* #脚本后所跟的所有字符;模式为 "1 2 3" 即一串字符
[email protected] #脚本后所跟的所有字符;模式为"1" "2" "3" 即三串字符
实验:
ps #查看当前进程
echo $$ #查看当前进程的ip
vim & # &打入后台
echo $$ #进程ip不变
vim test.sh
##########
sh test.sh
sh test.sh westos
sh test.sh westos linux
sh test.sh westos linux redhat
vim file.sh
##########
sh -x file.sh westos linux redhat #说明$*表示脚本后边跟的是一串字符
#echo只执行了1次
vim file.sh
###############
sh -x file.sh westos linux redhat #说明[email protected]表示脚本后边跟的是三串字符
#echo只执行了3次
for语句的一般形式:
for NUM in 1 2 3 或 NUM in {1..3} 或 NUM in `seq 1 3` #变量NUM从1取到3
do
想要执行的命令
done
@@用脚本实现自动建立用户文件userfile中的用户,并指定密码文件passfile中的密码为用户密码
vim userfile
########
vim passfile
#########
vim user_create.sh
#########
注释:
$# 表示脚本后所跟字符串的个数 -ne 不等于
-e "\033[31m \033[0m" ##设定颜色,前边必须加-e
红色 关闭所有属性
wc -l + 文件名 #显示文件内容的行数与文件名 $1 表示脚本后跟的第一串字符
cut -d " " -f 1 #以空格为分隔符,截取第一列 -d 表示指定分隔符 -f 表示指定截取的列
sed -n '2,3p' file #显示文件中的2,3行
echo 123 | passwd --stdin root #非交互式更改用户密码
sh user_create.sh
sh user_create.sh userfile
sh user_create.sh userfile passfile
su - westos1
su - westos2 #登陆成功,密码设定成功
5.read 命令(交互式)
##实现变量传递
read WESTOS
read -s WESTOS # -s 表示对输入内容的加密(即不显示输入的内容)
read -p "input:" WESTOS # -p表示显示输出内容,显示""中的内容作为提示语并将输入的内容赋给WESTOS
实验:
vim test.sh
########
sh test.sh
@@测试ip是否能ping通
vim test.sh
#######
sh test.sh
ping -c1 -w1 ip #-c1 表示 -w1 表示ping的时间
@@自动创建用户和密码的改进
vim user_create.sh
###########
注释:
! -e #表示文件是否不存在
awk ##报告生成器
awk 'BEGIN{n=0}{n++}END{print n}' $USERFILE #逐行读入用户文件内容,每读入一行就给n加1,即统计用户文件内容的行数
BEGIN{} #表示处理文本第一行之前需要执行的操作,一般用来初始化操作
{} #表示逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令块
END{} #表示处理文本最后一行以后需要执行的操作,一般用来处理结果
sh user_create.sh
7.命令别名的设定
alias #设定别名
ualias #撤销别名
实验:
###别名的设定:
alias xie='vim' ##临时设定别名
xie
alias
exit
xie
alias #别名消失
vim .bashrc ##只对root用户永久生效
########
source .bashrc #刷新
xie
su - student
xie
logout
vim /etc/bashrc ##对所有用户永久生效
#########
source /etc/bashrc #刷新
su - student
xie
logout
###别名的永久性删除
vim .bashrc
#########
删除 alias xie='vim'
source .bashrc
vim /etc/bashrc
##########
删除 alias xie='vim'
source /etc/bashrc
alias
unalias xie #撤销别名
alias
8.利用命令执行结果设定变量:
$? 的值 为 0 表示正确
$? 的值 为 2 表示错误
实验:
saw
echo $?
ls
echo $? #0表示正确
vim westos.sh
###########
sh westos.sh
echo $? ##exit后边跟的值
vim westos.sh
############
sh westos.sh
echo $?
ls --l
echo $? #2表示错误
@@用命令执行结果设定变量的方式检测ip是否能ping通
ping -c1 -w1 172.25.254.130
echo $?
ping -c1 -w1 172.25.254.555
echo $?
#说明能$?的值为0表示能ping通,$?的值为2表示不能ping通
vim ip_check.sh
#############
sh ip_check.sh
9.脚本中的函数:
##它是把一个复杂的语句定义成一个字符串的方法
优点: 确保命令可循环执行 简化脚本,提高可读性
@@循环检测ip是否能ping通
vim ip_check.sh
############
sh ip_check.sh
@@判断文件的类型
vim file.sh
########
sh file.sh
@@管理用户即循环创建用户或删除用户
vim user_ctrl.sh
##########
sh user_ctrl.sh
10.几种常见的语句
(1)for语句
for语句的一般形式:
for NUM in 1 2 3 (或 NUM in {1..3} 或 NUM in `seq 1 3`) #变量NUM从1取到3
do
想要执行的命令
done
(2) if语句
if语句的一般形式:
if 条件 ##满足条件则执行命令1,否则执行命令2
then 命令1
elif 命令2
##几种常见的退出方式:
exit #退出当前脚本
break #退出当前循环
continue #提前退出当前循环,进入下一次循环
实验:
vim westos.sh
###########
sh westos.sh
sh westos.sh exit #退出当前脚本
sh westos.sh break #退出当前循环
sh westos.sh continue #提前退出当前循环,进入下一次循环
##return 不能直接使用!!!
vim for.sh
########
sh for.sh
vim for.sh
########
sh for.sh
vim for.sh
########
sh for.sh
vim for.sh
########
sh for.sh
vim for.sh
#######
sh for.sh
@@for循环的另一种写法
vim for.sh
######
sh for.sh
@@检测教室里有那些ip是通的即输出所有通着的ip
vim check_host.sh
#############
@@备份数据库
准备工作:
yum install mariadb-server -y
systemctl start mariadb
mysql -uroot -e "show databases;" ##用不同的两种方式显示所有数据库
mysql -uroot -EN -e "show databases;"
实验:
mysql -uroot -EN -e "show databases;" | grep -E "^\*|schema$" -v #过滤掉 以*开头 并且 以schema结尾 的行 \ 表示对*的转译 | 表示与(同时满足两个条件)
vim dump_mysql.sh
#############
sh dump_mysql.sh
(3)while语句
while语句的一般形式:
while ture #满足条件则执行命令
do
想要执行的命令
done
实验:
vim test.sh
#######
sh test.sh
vim test.sh
#######
sh test.sh
@@检测/目录下的使用情况(如果/的使用量use超过80%则给root用户发邮件报警)
echo hello world | mail -s warning root #给root用户发送名为warning的邮件
df
df -H | awk '/\/$/{print $5}' | awk -F "%" '{print $1}' #过滤出使用量use
dd if=/dev/zero of=/bigfile bs=1M count=5000 #模拟/使用情况超过80%
df -H
vim mail_file.sh
##########
sh file.sh &
ps