Linux云计算架构-shell入门到精通(放弃)[1]

Linux云计算架构-shell入门到精通(放弃)[1]

小技巧-小智慧

当下面遇到看不懂的,可以在这里找到相应的解释。

  1. 常用环境变量:$SHELL $USER #LANG
    依次为:解释器、当前用户名、当前语系
  2. awk '{print $4}' 【取某行的第四列的值】
  3. free_size=`free -m | grep Mem: | awk ‘{print $4}’`【在使用赋值语句时,等号两边不能有空格
  4. useradd abong【/bin/bash、家目录为/home/abong、基本用户组abong、无密码】
  5. echo "password" | passwd --stdin abong【以标准输入的方式为用户设置密码】
  6. /dev/null 文件,是一个黑洞文件,可以将不想显示在屏幕上的输出重定向到该文件
  7. $?可以判断上一个命令的执行结果,执行成功返回0,执行不成功返回2
  8. `命令`【返回命令执行的结果】
  9. $(命令) 【返回命令执行的结果】
  10. let TIMES++【让变量TIMES自加1,等价于TIMES=TIMES+1】
  11. exit 0 【终止脚本的运行,该命令后续的脚本都不再运行】
  12. while true【表示一直循环,不退出循环,直到遇到exit 0才退出循环】

1. shell脚本的组成与执行

1.2 shell脚本的组成

  • 脚本声明#!/bin/bash【可通过echo $SHELL查询解释器名称】【必须在第一行进行脚本声明,声明使用哪种命令解释器】

    [root@client ~]# echo $SHELL
    /bin/bash
    
  • 脚本注释#【填写注释信息】

  • 脚本命令脚本命令=Linux命令+参数+条件测试语句+流程控制语句+其他

  • 脚本文件名后缀为**.sh**

1.2 shell脚本的执行

法1bash ex.sh [输入参数] 【bash解释器运行】
法2./ex.sh 【全路径运行,可能需要执行权限x】
法3source ex.sh【可以无执行权限】
法4sh < 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

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/107727743