文章目录
Linux云计算架构-shell入门到精通(放弃)[1]
小技巧-小智慧
当下面遇到看不懂的,可以在这里找到相应的解释。
- 常用环境变量:
$SHELL
$USER
#LANG
依次为:解释器、当前用户名、当前语系 awk '{print $4}'
【取某行的第四列的值】- free_size=`free -m | grep Mem: | awk ‘{print $4}’`【在使用赋值语句时,等号两边不能有空格】
useradd abong
【/bin/bash、家目录为/home/abong、基本用户组abong、无密码】echo "password" | passwd --stdin abong
【以标准输入的方式为用户设置密码】/dev/null
文件,是一个黑洞文件,可以将不想显示在屏幕上的输出重定向到该文件$?
可以判断上一个命令的执行结果,执行成功返回0,执行不成功返回2- `命令`【返回命令执行的结果】
- $(命令) 【返回命令执行的结果】
let TIMES++
【让变量TIMES自加1,等价于TIMES=TIMES+1】exit 0
【终止脚本的运行,该命令后续的脚本都不再运行】while true
【表示一直循环,不退出循环,直到遇到exit 0
才退出循环】
1. shell脚本的组成与执行
1.2 shell脚本的组成
-
脚本声明:
#!/bin/bash
【可通过echo $SHELL
查询解释器名称】【必须在第一行进行脚本声明,声明使用哪种命令解释器】[root@client ~]# echo $SHELL /bin/bash
-
脚本注释:
#
【填写注释信息】 -
脚本命令:脚本命令=Linux命令+参数+条件测试语句+流程控制语句+其他
-
脚本文件名后缀为**.sh**
1.2 shell脚本的执行
法1:bash ex.sh [输入参数]
【bash解释器运行】
法2:./ex.sh
【全路径运行,可能需要执行权限x】
法3:source ex.sh
【可以无执行权限】
法4:sh < ex.sh
或者 cat ex.sh | sh(bash)
常用法1和法2
2. shell变量
变量是shell存储和传递数据的一种方式。可以对变量进行存储、传递、修改和访问。
变量设置规则:
①一般是大写字母,也可以是大小写字母、数字、下划线的组合。区分大小写,不能以数字开头。
②变量赋值时,等号两边不能有空格。
③变量的数据类型为整型和字符串型
④变量赋予字符串值时,建议用单引号或者双引号括起来
⑤调用变量前在变量名称前加$
号
⑥如果需要增长变量的值,那么可以进行变量值的叠加。变量需要用双引号包含"$变量名"
或用${变量名}
包含
变量分类:
按作用分:
①用户自定义变量
②环境变量:主要是和系统操作环境相关的变量
③位置变量:用来向脚本中传递参数。如$1
$2
④预定义变量:bash中已经定义好的变量按作用域分
①全局变量:一般是环境变量,不随脚本执行结束而消失。
②局部变量:一般是用户自定义变量、位置变量、预定义变量。当前bash生效。在执行脚本时,会用一个新的bash去执行,故此时局部变量不再生效。
# 用户自定义变量
[root@client ~]# var=abong
[root@client ~]# echo $var
abong
# 变量叠加
[root@client ~]# echo $var.log
abong.log
[root@client ~]# echo $varlog
[root@client ~]# echo ${var}log
abonglog
[root@client ~]# echo "$var"log
abonglog
# 输出命令的结果
[root@client ~]# date
2020年 07月 30日 星期四 22:01:56 CST
[root@client ~]# echo date
date
[root@client ~]# echo `date`
2020年 07月 30日 星期四 22:02:11 CST
[root@client ~]# echo $(date)
2020年 07月 30日 星期四 22:02:18 CST
[root@client ~]# ll a.txt
-rw-r--r--. 1 root root 0 7月 30 22:03 a.txt
[root@client ~]# echo `ll a.txt`
-rw-r--r--. 1 root root 0 7月 30 22:03 a.txt
[root@client ~]# echo $(ll a.txt)
-rw-r--r--. 1 root root 0 7月 30 22:03 a.txt
【在tar压缩时,若系统当前时间是未来时间,会报错】
# 输出嵌套命令的结果
[root@client ~]# echo hahah > a.txt
[root@client ~]# echo $(cat $(ls a.txt))
hahah
单引号:变量还原字符串再输出
双引号:变量转值再输出
转义:\
[root@client ~]# echo '$var'
$var
[root@client ~]# echo "$var"
abong
[root@client ~]# echo /$var
/abong
[root@client ~]# echo \$var
$var
# 全局变量
# 查看所有的环境变量
[root@client ~]# env
# 查看指定的环境变量
[root@client ~]# env | grep PATH
[root@client ~]# env | grep SHELL
# 升级局部变量为全局变量
[root@client ~]# var=abong
[root@client ~]# echo $var
abong
[root@client ~]# cat test.sh
#!/bin/bash
echo $var
[root@client ~]# export var
[root@client ~]# bash test.sh
abong
# 变量开机生效或者永久生效
vim /etc/profile #系统全局环境和登录系统的一些配置
vim /etc/bashrc #shell全局自定义配置文件,用于自定义shell
vim /root/.bash_profile #用户单独自定义某个用户的系统环境
vim /root/.bashrc #用于单独自定义某个用户的bash
不懂的可以看这个博客:https://blog.csdn.net/weixin_36522099/article/details/106929182
# 设置环境变量
[root@client ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
[root@client ~]# test.sh
bash: test.sh: 未找到命令...
[root@client ~]# pwd
/root
[root@client ~]# PATH=/root:$PATH
[root@client ~]# echo $PATH
/root:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
[root@client ~]# test.sh
abong
写法 | 作用 |
---|---|
$0 | 脚本名称 |
$# | 参数数量 |
$* | 依次列出各参数值 |
$? | 返回上一个命令的执行结果,执行成功返回0,不成功返回2 |
$1 | 获取第一个参数 |
$2 | 获取第二个参数 |
# 位置变量
[root@client ~]# vim loc.sh
#!/bin/bash
echo "脚本名称为:$0"
echo "参数个数:$#"
echo "各参数值为:$*"
echo "上一条命令是否执行成功:$?"
echo "第2个参数是:$2"
echo "第4个参数是:$4"
echo "进程ID为:$$"
touch a.txt & echo "后台运行的最后一个进程ID:$!"
[root@client ~]# loc.sh 1 2 3 4 5
脚本名称为:/root/loc.sh
参数个数:5
各参数值为:1 2 3 4 5
上一条命令是否执行成功:0
第2个参数是:2
第4个参数是:4
进程ID为:12207
后台运行的最后一个进程ID:12208
3. 数学运算
expr 代数式
:运算符两边要有空格
命令 | 作用 |
---|---|
expr length "str_length" | 计算字符串长度 |
expr substr "str_substr" n m | 截取字符串,从第n个字符开始,长度为m |
expr index "str_abababadde" a | 计算字符串中某个子串第一次出现的位置 |
expr 10 + 10 | 计算加法 |
expr 18 % 2 | 计算取模 |
expr 30 \* 3 | 计算乘法 |
expr 50 / 2 / 5 | 计算除法 |
echo $((代数式))
:代数式可以包含以下运算
运算符 | 作用 |
---|---|
++ – | 自加、自减 |
+ - | 正 负 |
+ - * / % | 加减乘除取模 |
< <= > >= | 比较运算符 |
== != | 相等 不相等 |
>> << | 向左位移、向右位移 |
& ^ | | 与 异或 或 |
&& || !~ | 逻辑与 逻辑或 逻辑与取反 |
?: | 条件判断 |
[root@client ~]# a=2
[root@client ~]# echo $a
2
[root@client ~]# echo $((a++)) # 先执行echo,再执行a=a+1,这时a=3
2
[root@client ~]# echo $((a++)) # 先执行echo,再执行a=a+1,这时a=4
3
[root@client ~]# echo $((++a)) # 先执行a=a+1,这时a=5,再执行echo
5
[root@client ~]# echo $((++a)) # 先执行a=a+1,这时a=6,再执行echo
6
5. read命令读取键盘输入
read GRADE
【读取用户的输入信息,作为变量GRADE】
# 标准输入为变量赋值
[root@client ~]# read a b
abong hahaha
[root@client ~]# echo $a
abong
[root@client ~]# echo $b
hahaha
# 隐式输入值,保密安全
[root@client ~]# read -s passwd
[root@client ~]# echo $passwd
123456
# 规定输入值的时间,3s不输入值就退出
[root@client ~]# read -t 3 account
# 规定输入的字符长度,超过这个长度就直接退出
[root@client ~]# read -n 3 test
# 允许输入特殊符号,包括转移符号\
[root@client ~]# read -r line
abong /dev/sda /dev/sdb
[root@client ~]# echo $line
abong /dev/sda /dev/sdb
# 显示提示符
[root@client ~]# read -p ">>" name
>>abong
[root@client ~]# echo $name
abong
6. 条件测试语句
格式:[ 条件表达式 ]
4种类型的条件表达式:
6.1 文件测试语句
[ 参数 文件名 ]
参数 | 作用 |
---|---|
-d | 判断目录是否存在,存在返回true,不存在返回false |
-e | 判断文件是否存在 |
-f | 判断文件是否是一般文件 |
-r | 判断当前用户是否对文件有读权限 |
-w | 判断当前用户是否对文件有写权限 |
-x | 判断当前用户是否对文件有执行权限 |
-s | 判断文件是否存在且存在至少一个字符 |
-c | 判断文件是否存在且为字符型文件 |
-b | 判断文件是否存在且为块设备文件 |
file1 -nt file2 | file1的修改时间比file2要晚 |
file1 -ot file2 | file1的修改时间比file2要早 |
6.2 逻辑测试语句
[ 条件表达式 ] || 后续命令
[ 条件表达式 ] && 后续命令
[ ! 条件表达式 ]
逻辑符 | 作用 |
---|---|
|| | 或,当前面的条件表达式返回fasle时,执行后续命令 |
&& | 与,当前面的条件表达式返回true时,执行后续命令 |
! | 非,条件表达式取反 |
# 多条件判断
[ 条件1 ] && [ 条件2 ] && echo "结果"
[ 条件1 -a 条件2 ]
[[ 条件1 && 条件2 ]]
[ 条件1 ] || [ 条件2 ]
[ 条件1 -o 条件2 ]
[[ 条件1 || 条件2 ]]
[root@client ~]# [ -f a.txt ] && [ ! -f b.txt ] && echo "hahah"
hahah
# [[]]与[]的区别:
1. [[]]支持特殊字符,如* > < 不需要转义
2. [[]]支持正则表示式,常用于模糊匹配
6.3 整数值比较
[ a 比较符 b ]
比较符 | 作用 |
---|---|
巧记 | e等于、n不、g大于、l小于 |
-eq | 等于 |
-ne | 不等于 |
-ge | 大于等于 |
-le | 小于等于 |
-gt | 大于 |
-lt | 小于 |
6.4 字符串比较
[ str1 比较符 str2]
比较符 | 作用 |
---|---|
= | 字符串相等 |
!= | 字符串不相等 |
-z | 判断字符成是否为空 |
6.5 条件测试语句实战
[root@client ~]# cat test.sh
#!/bin/bash
#判断文件是否存在
[ -e $1 ] && echo "$1已存在!" || echo “$1不存在”
[root@client ~]# bash test.sh a.txt
a.txt已存在!
[root@client ~]# cat test.sh
#!/bin/bash
#判断当前用户是否是root
[ $USER = root ] && echo "当前用户是root" || echo "当前用户不是root"
[root@client ~]# bash test.sh
当前用户是root
[root@client ~]# cp -r test.sh /home/abong/
[root@client ~]# ll /home/abong/test.sh
-rwxr-xr-x. 1 root root 125 7月 31 22:21 /home/abong/test.sh
[root@client ~]# su - abong
上一次登录:五 7月 31 22:20:57 CST 2020pts/0 上
[abong@client ~]$ bash test.sh
当前用户不是root
[root@client ~]# cat test.sh
#!/bin/bash
#判断输入的数字是否大于100
[ $1 -gt 100 ] && echo "输入数字大于100" || echo "输入数字不大于100"
[root@client ~]# bash test.sh 99
输入数字不大于100
[root@client ~]# bash test.sh 101
输入数字大于100
[root@client ~]# bash test.sh 100
输入数字不大于100
[root@client ~]# cat test.sh
#!/bin/bash
#判断系统内存情况,若不足1G,则提示系统内存不足,否则提醒系统内存充足。
free_size=`free -m | grep Mem: | awk '{print $4}'`
[ $free_size -lt 1024 ] && echo "系统内存不足!" ||echo "系统内存充足!"
[root@client ~]# bash test.sh
系统内存不足!
[root@client ~]# free -m
total used free shared buff/cache available
Mem: 972 631 72 58 268 72
Swap: 1023 89 934
7. 流程控制语句
7.1 if条件测试语句
① 1个条件一种选择
#判断目录是否存在,若不存在,则创建该目录
[root@client ~]# cat test.sh
#!/bin/bash
if [ ! -e $1 ]
then mkdir -p $1
fi
[root@client ~]# cat test.sh
#!/bin/bash
if [ ! -e $1 ] ; then
mkdir -p $1
fi
② 1个条件,两种选择
[root@client ~]# cat test.sh
#!/bin/bash
#判断网络连通性,若ping通,则提示“服务器工作正常”,若ping不通,则提示“服务器无法ping通”
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "服务器工作正常"
else
echo "服务器无法ping通"
fi
[root@client ~]# bash test.sh 192.168.10.42
服务器工作正常
[root@client ~]# bash test.sh 192.168.10.43
服务器无法ping通
③ 多个条件多个选择
[root@client ~]# cat test.sh
#!/bin/bash
#输入一个分数,判断等级:优秀、合格、不合格
read -p "请输入一个分数:" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then echo "优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -lt 85 ]
then echo "合格"
elif [ $GRADE -ge 0 ] && [ $GRADE -lt 70 ]
then echo "不合格"
else
echo "输入的分数有误!"
fi
[root@client ~]# bash test.sh
请输入一个分数:85
优秀
[root@client ~]# bash test.sh
请输入一个分数:60
不合格
[root@client ~]# bash test.sh
请输入一个分数:75
合格
7.2 for条件循环语句
循环次数有限
for 变量名 in 取值列表 【这个变量名没有$,仅仅只是变量名,不用获取值】
# 取值列表每个值之间用空格分隔
# 可以读取文本作为取值列表
# IFS变量可以指定分隔符,默认是以空格、制表符、换行符为分隔符
# '\n' 即转义符\和字母n
# $'\n' 即换行符
[root@client ~]# cat test.sh
#!/bin/bash
#读取用户名表,批量创建用户
read -p "输入默认密码:" PASSWORD
for UNAME in `cat user.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then echo "账户$UNAME 已存在"
else
useradd $UNAME &> /dev/null
echo $PASSWORD | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then echo "创建用户$UNAME 成功!"
else echo "创建用户$UNAME 失败!"
fi
fi
done
[root@client ~]# bash test.sh
输入默认密码:123456
创建用户test1 成功!
创建用户test2 成功!
创建用户test3 成功!
[root@client ~]# tail -3 /etc/passwd
test1:x:1001:1001::/home/test1:/bin/bash
test2:x:1002:1002::/home/test2:/bin/bash
test3:x:1003:1003::/home/test3:/bin/bash
# 在shell脚本中,允许向C++的for循环语句类似的写法
for ((i=0;i<10;i++))
do
commands
done
# 对前n个自然数进行求和
[root@client ~]# cat sum.sh
#!/bin/bash
# 对前n个自然数进行求和
read -p "对前n个自然数求和,请输入n:" n
sum=0
for ((i=1;i<=$n;i++))
do
sum=$[sum+i]
done
echo "前100个自然数的和为:"$sum
[root@client ~]# bash sum.sh
对前n个自然数求和,请输入n:100
前100个自然数的和为:5050
[root@client ~]# bash sum.sh
对前n个自然数求和,请输入n:1000
前100个自然数的和为:500500
# 多变量进行for循环
for ((a=1,b=9 ; a<10 ; a++,b--))
do
commands
done
7.3 while条件循环语句
[root@client ~]# cat test.sh
#!/bin/bash
#系统随机生成一个数字,然后对100取模,再通过二分法得到余数
NUM=$(expr $RANDOM % 100)
TIMES=1
echo "该数字在0-99之间,请猜猜这个余数是多少?"
read -p "请输入余数的可能值:" X
while true
do
if [ $X -eq $NUM ]
then echo "恭喜猜对了,这个余数是$NUM"
echo "一共猜测了$TIMES 次"
exit 0
elif [ $X -lt $NUM ] ; then
echo "猜小了"
else
echo "猜大了"
fi
read -p "继续猜:" X
let TIMES++
done
[root@client ~]# bash test.sh
该数字在0-99之间,请猜猜这个余数是多少?
请输入余数的可能值:50
猜小了
继续猜:75
猜小了
继续猜:83
猜小了
继续猜:92
猜大了
继续猜:88
猜小了
继续猜:90
猜大了
继续猜:89
恭喜猜对了,这个余数是89
一共猜测了7 次
# 输出一个数的平方
[root@client ~]# cat test.sh
#!/bin/bash
num=1
while [ $num -lt 10 ]
do
sum=$(($num * $num))
echo "$num * $num = $sum"
((num++))
done
[root@client ~]# bash test.sh
1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
6 * 6 = 36
7 * 7 = 49
8 * 8 = 64
9 * 9 = 81
7.4 case条件测试语句
注意case条件测试语句的格式
#!/bin/bash
#判断输入的字符是字母还是数字,若都不是,则提示为该字符是特殊字符。
read -p "请输入一个字符,并按Enter键确认:" CHAR
case $CHAR in
[a-z]|[A-Z])
echo "您输入的是一个字母!"
;;
[0-9])
echo "您输入的是一个数字!"
;;
*)
echo "您输入的是一个特殊字符!"
esac
[root@client ~]# bash test.sh
请输入一个字符,并按Enter键确认:a
您输入的是一个字母!
[root@client ~]# bash test.sh
请输入一个字符,并按Enter键确认:A
您输入的是一个字母!
[root@client ~]# bash test.sh
请输入一个字符,并按Enter键确认:5
您输入的是一个数字!
[root@client ~]# bash test.sh
请输入一个字符,并按Enter键确认:*
您输入的是一个特殊字符!
7.5 流程控制语句实战
# 对/var/log/messages的日志保留100行,多余的删除。
# 由于采用清空日志的方式,不改变inode号,故可用于在线日志。
[root@client ~]# cat test.sh
#!/bin/bash
#保留/var/og/messages的最后100行日志
read -p "请输入要保留100行的日志:" log
if [ $USER != root ] ; then
echo "执行脚本需要root用户"
exit 0
fi
if [ ! -f $log ] ; then
echo "$log日志不存在"
exit 0
fi
read -p "请输入备份100行的文件名:" backup_log
if [ ! -d /opt/log ] ; then
mkdir -p /opt/log
fi
tail -100 $log > /var/log/$backup_log.log
cp /var/log/$backup_log.log /opt/log/
echo "" > $log
cat /var/log/$backup_log.log > $log
rm -rf /var/log/$backup_log.log
[root@client ~]# bash test.sh
请输入要保留100行的日志:/var/log/messages
请输入备份100行的文件名:messages01
[root@client ~]# wc -l /var/log/messages
100 /var/log/messages
[root@client ~]# wc -l /opt/log/messages01.log
100 /opt/log/messages01.log
# 退出码 exit,默认正常退出是exit 0
# 取值范围是0-255
8. 脚本实战
实战1:编写apache启动脚本
[root@client ~]# vim httpd.sh
#!/bin/bash
case $1 in
start)
/usr/bin/systemctl $1 httpd
/usr/bin/ps aux | grep httpd
echo "httpd start"
;;
stop)
/usr/bin/systemctl $1 httpd
/usr/bin/ps aux | grep httpd
echo "httpd stop"
;;
restart)
echo "httpd stop..."
/usr/bin/ps aux | grep httpd
/usr/bin/systemctl $1 httpd
echo "httpd restart..."
/usr/bin/ps aux | grep httpd
;;
status)
/usr/bin/systemctl $1 httpd
;;
*)
echo "please input start|stop|restart|status"
esac
[root@client ~]# chmod +x httpd.sh
[root@client ~]# bash httpd.sh start
实战2:打印乘法口诀
[root@client ~]# cat test.sh
#!/bin/bash
# 乘法口诀
for i in `seq 9`
do
for j in `seq $i`
do
echo -n "$i*$j=`echo $(($i*$j))` "
done
echo ""
done
[root@client ~]# bash test.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
实战3:检测服务是否开机自启并记录
[root@client ~]# cat test.sh
#!/bin/bash
# 检测服务是否开机自启并记录
while true
do
port=$(nmap -sT 192.168.10.43 | grep tcp | grep http |awk '{print $2}')
if [ "$port" == "open" ] ; then
echo "$(date) httpd is ok" >> /var/log/autostart-httpd-acc.log
else
/usr/bin/systemctl start httpd &> /dev/null
echo "$(date) restart httpd!!!" >> /var/log/autostart-httpd-err.log
fi
sleep 5 # 等待5s再次进入循环
done
# 实施监控日志变化
[root@client ~]# tail -f /var/log/autostart-httpd-err.log
2020年 08月 01日 星期六 09:31:32 CST restart httpd!!!
[root@client ~]# tail -f /var/log/autostart-httpd-acc.log
2020年 08月 01日 星期六 09:31:50 CST httpd is ok
2020年 08月 01日 星期六 09:32:08 CST httpd is ok
2020年 08月 01日 星期六 09:32:26 CST httpd is ok
2020年 08月 01日 星期六 09:32:45 CST httpd is ok
实战4:定期备份/var/log目录下的日志到指定目录下
[root@client ~]# cat tar.sh
#!/bin/bash
SRC_DIR=/var/log
DES_DIR=/opt/back_log/`date +%Y%m%d`
if [ ! -d $DES_DIR ] ; then
mkdir -p $DES_DIR
fi
for i in `find $SRC_DIR -name "*.log"`
do
tar czvf $i.tar.gz $i &> /dev/null
done
mv $SRC_DIR/*.tar.gz $DES_DIR
ls -lh $DES_DIR
echo "The scripts exec end,Files tar successfully!"
[root@client ~]# chmod +x tar.sh
[root@client ~]# bash tar.sh
实战5:ping一个网段的主机,判断服务器是否关机或异常
[root@client ~]# vim ping.sh
#!/bin/bash
for ((i=40;i<45;i++))
do
ping -c 3 192.168.10.$i &> /dev/null
if [ $? -ne 0 ] ; then
echo "192.168.10.$i is shutdown"
else
echo "192.168.10.$i is startup"
fi
done
[root@client ~]# chmod +x ping.sh
[root@client ~]# bash ping.sh
192.168.10.40 is shutdown
192.168.10.41 is shutdown
192.168.10.42 is shutdown
192.168.10.43 is startup
192.168.10.44 is shutdown
实战6:创建用户,并生成随机密码
# md5sum生成文件的md5校验码
[root@client ~]# md5sum user.sh
d41d8cd98f00b204e9800998ecf8427e user.sh
[root@client ~]# vim user.sh
#!/bin/bash
for i in test{1..5}
do
id $i &> /dev/null
if [ $? -ne 0 ] ; then
useradd $i &> /dev/null
pass=`date +%s|md5sum|cut -c 1-8`
sleep 1
echo "$i:$pass" >> /opt/passwd.log
echo $pass | passwd --stdin $i &> /dev/null
echo "create user $i is successfully!"
else
echo "$i is exist!"
fi
done
[root@client ~]# chmod +x user.sh
[root@client ~]# bash user.sh
test1 is exist!
test2 is exist!
create user test3 is successfully!
create user test4 is successfully!
create user test5 is successfully!
[root@client ~]# cat /opt/passwd.log
test3:e8c4e37a
test4:bf1d27a7
test5:c5133fec