本机IP和虚拟机IP不能是同一个网段,VMware虚拟网络管理中修改虚拟机IP网段。
追加重定向>> 在文件原来内容基础上追加上新的内容
覆盖重定向> 可以发现之前的123456被789给覆盖掉了
<和<< 在屏幕上输出EOF之间你所输入的内容。(EOF可以被替换为任意字符,只要前后开头结尾一致即可)
将文件中的wobuhao覆盖成了wohenhao
在文件中的wobuhao的基础上追加了wohenhao。
shell脚本 建立/删除user1…user100个用户
建立/root/A/a.sh并写入内容“测试”
脚本的执行 1使用指定的shell解释器:(不需要脚本有执行权限),会重新加载一个子bash环境去执行,不会影响当前bash环境变量值,常使用。
2使用路径的方式:(需要脚本有执行权限)
3使用source和“.”执行脚本:(需要脚本有执行权限),会在当前执行命令的终端去执行脚本,效果直接影响当前终端。
1和2都是在子终端内执行脚本,只有3是在当前终端执行。
test1文件内容:echo $x
所以用1和2的方式去执行test1.sh脚本时并不会显示10,因为都不是在当前终端执行的。只有3是在当前终端执行,所以只有3才会显示10
常见的比较运算符号 (g≈大于、l≈小于、e≈等于)
字符串类型比较用符号,数字比较用字母
1 2 3 4 5 6 7 8 9 10 11 12 13 read -p "请输入你的成绩:" grade if [ $grade = 100 ] then echo "满分" elif [ $grade -lt 100 -a $grade -gt 80 ] then echo "优秀" elif [ $grade -lt 80 -a $grade -gt 60 ] then echo "及格" else echo "不及格" fi
【while循环】 #########################
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 while [ 判断条件 ] do 循环体 计数器(否则死循环) done # while : do 循环体 done # while read 变量 do 循环体 done <文件路径 #
练习 for循环求和
1 2 3 4 5 6 sum=0 for i in {1..100} do let sum=$sum+$i done echo $sum
输入一个用户查看是否存在,存在的话显示该用户存在,并询问是否需要修改密码。不存在的话显示该用户不存在然后创建该用户。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 read -p "请输入用户名:" user id $user &>/dev/null if [ $? -eq 0 ] then echo "该用户存在" read -p "是否需要修改密码【Y/是|N/否】" x if [ $x = "Y" ] then read -p "请输入你要修改的密码:" pass echo "$pass" | passwd --stdin $user # echo 命令会将"pass" 字符串输出到标准输出,然后通过管道(|)将其传递给passwd命令的--stdin选项。passwd命令接收到标准输入中的密码后,将其作为新密码设置给用户"pass" 。 # 命令:| # 表示管道,上一条命令的输出,作为下一条命令参数进行传递,如:ls | grep “aa”,在ls的输出中查找aa字符串 fi else echo "该用户不存在" useradd $user echo "$user创建成功" fi
echo $? 可以查看上一条命令执行是否正确,正确则返回0,不对则返回非0. 2>/dev/null 是将错误结果丢进垃圾箱。将2改成&则是不管结果是正确还是错误都丢进垃圾箱。
【作业及答案】 下述第一种为标准答案,第二种为自己所写。
1、提示用户输入数字,并计算从何1开始到这个数字的相加总和;
1 2 3 4 5 6 7 8 9 # 答案 # !/bin/bash sum=0 read -p "请输入正整数: " num for i in `seq $num` do sum=`echo "$sum + $i"|bc` done echo "总和:$sum"
1 2 3 4 5 6 7 8 9 10 11 12 13 sum=0 i=1 read -p "请输入一个数:" A for i in `seq 1 $A` do let sum=$sum+$i done # while [ $i -le $A ]# do # let sum=$sum +$i # let i++ # done echo $sum
2、将用户名放在/root/username.txt文件中(每行一个用户名),书写脚本判断username.txt中的用户是否存在, 存在则删除,用户不存在则创建;
1 2 3 4 5 6 7 8 9 10 11 12 13 # 答案 # !/bin/bash while read user do id $user &>/dev/null if [ $? -eq 0 ] then userdel -r $user else useradd $user fi done </root/user.txt
1 2 3 4 5 6 7 8 9 10 while read user do id $user &>/dev/null if [ $? -eq 0 ] then userdel -r $user else useradd $user fi done </root/username.txt
3、使用脚本模拟获得用户密码登陆,判断用户密码是否正确(用户密码为123),如果连续3次输入错误,则退出脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # 答案 # !/bin/bash while : do read -p "请输入你的用户名: " name if [ "$name" == "Alan" ] || [ "$name" == "alan" ] then for i in {1..3} do read -p "请输入密码: " pass if [ $pass -eq 123 ] then echo "登陆成功。" exit 0 else echo "密码验证错误:请重新输入。" fi done echo "====== 超过尝试次数,被强制退出。======" exit 1 else echo "*****没有这个账号,请重新输入。*****" echo fi done
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 while : do read -p "请输入用户名:" name if [ $name = "ldq" ] || [ $name = "Ldq" ] then i=0 while [ $i -lt 3 ] do read -p "请输入登陆密码" p if [ $p -eq 123 ] then echo "登陆成功" exit else echo "密码错误,请再次输入" fi let i++ done exit fi done # exit 后跟数字可以控制返回值,即$?得到的值
4、使用脚本获取用户注册账号并生成一个8位随机密码,要求密码开头必须包含用户名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 # 答案 # !/bin/bash read -p "请输入你的账号: " user num=`echo $user|wc -L` n1=$(($RANDOM % 10 + 0 )) n2=$(($RANDOM % 10 + 0 )) n3=$(($RANDOM % 10 + 0 )) n4=$(($RANDOM % 10 + 0 )) n5=$(($RANDOM % 10 + 0 )) n6=$(($RANDOM % 10 + 0 )) n7=$(($RANDOM % 10 + 0 )) if [ $num -ge 8 ] then echo "用户名过长,无法生成密码。" else if [ $num -eq 7 ] then passwd=$user$n1 echo "请牢记你的密码:$passwd" elif [ $num -eq 6 ] then passwd=$user$n1$n2 echo "请牢记你的密码:$passwd" elif [ $num -eq 5 ] then passwd=$user$n1$n2$n3 echo "请牢记你的密码:$passwd" elif [ $num -eq 4 ] then passwd=$user$n1$n2$n3$n4 echo "请牢记你的密码:$passwd" elif [ $num -eq 3 ] then passwd=$user$n1$n2$n3$n4$n5 echo "请牢记你的密码:$passwd" elif [ $num -eq 2 ] then passwd=$user$n1$n2$n3$n4$n5$n6 echo "请牢记你的密码:$passwd" elif [ $num -eq 1 ] then passwd=$user$n1$n2$n3$n4$n5$n6$n7 echo "请牢记你的密码:$passwd" else echo "账号不能为空!" fi fi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 read -p "请输入注册账号:" user num=`echo $user|wc -L` n1=$(($RANDOM% 10 + 0)) n2=$(($RANDOM% 10 + 0)) n3=$(($RANDOM% 10 + 0)) n4=$(($RANDOM% 10 + 0)) n5=$(($RANDOM% 10 + 0)) n6=$(($RANDOM% 10 + 0)) n7=$(($RANDOM% 10 + 0)) if [ $num -ge 8 ] then echo "账号过长" elif [ $num -eq 7 ] then p=$user$n1 echo "你的密码为:$p" elif [ $num -eq 6 ] then p=$user$n1$n2 echo "你的密码为:$p" elif [ $num -eq 5 ] then p=$user$n1$n2$n3 echo "你的密码为:$p" elif [ $num -eq 4 ] then p=$user$n1$n2$n3$n4 echo "你的密码为:$p" elif [ $num -eq 3 ] then p=$user$n1$n2$n3$n4$n5 echo "你的密码为:$p" elif [ $num -eq 2 ] then p=$user$n1$n2$n3$n4$n5$n6 echo "你的密码为:$p" elif [ $num -eq 1 ] then p=$user$n1$n2$n3$n4$n5$n6$n7 echo "你的密码为:$p" else echo "账号不能为空!" fi
1 2 3 4 5 6 7 8 9 10 11 12 # 命令行 wc -l /filepath # 参数说明 -c, --bytes:统计字节数。 -m, --chars:统计字符数。 -w, --words:统计字数。 -l, --lines:统计行数。 -L, --max-line-length:统计最长行的长度。
时间命令 1.Linux系统时间 1 2 3 4 5 6 🕧查看时间 # date 🕞以自己想要的格式查看时间 # date "+%Y__%m__%d %H::%M::%S" 🕔自己设置系统时间 # date -s "2050-12-25 12:25:41"
2.硬件时间 1 2 3 4 5 6 🕘查看硬件时间 # hwclock 🕤强制把系统时间写入硬件(cmos)中 # hwclock -w 🕤"-s" 相反, 将硬件时间写入系统时间 # hwclock -s
3.NTP时间协调 服务器 1 2 3 4 5 6 🕢同步网络时间 # ntpdate ntp1.aliyun.com 🔵查看时间是否更新了 # date 🔵然后将其写入硬件时间把我们之前乱写的时间改回来 # hwclock -w
🍥这里说的系统时间,是linux由操作系统维护的
🍭硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,硬件时间存放于CMOS中
🍥系统时钟则是指内核(kernel)中的时钟,当Linux启动时,Linux操作 系统将时间从CMOS中读到系统时间变量
🍭之后系统时钟即独立运作, 所有Linux相关指令与函数都是读取系统时钟的设定
🍥为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS
🍭由于该同步是每隔一段时间(大约是11分钟) 进行的, 在我们执行”date -s”后,如果马上重起机器,修改时间就有可能没有被写入CMOS
🍥如果要确保修改生效可以执行”hwclock -w” 将其写入硬盘
查看命令的绝对路径 type -a 命令
which 命令