- 求100以内正奇数和
注意点:
- $[]和$(()):是进行数学运算的。支持+ - * / %:分别为 “加、减、乘、除、取模”。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。
- {a..b}:表示范围。大于等于a,小于等于b。
- 打印9*9乘法表
注意点:
- echo -n:echo不带参数会自动换行,加-n不会换行。
- echo -e:支持转义字符。
注意点:
- $()和``(反引号):表示命令替换。将对反引号或$()里的内容先进行执行,然后将执行的结果代换到当前命令中。
- 在多层次的复合替换中,` `必须要额外的转义字符处理(反斜线),而$( )比较直观。
- $( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。
- seq命令:功能是输出序列化的一串整数。详细介绍:Linux--seq命令_linux seq_一只小菜鸡1111的博客-CSDN博客
- 随机生成一个10以内的数字,然后写一个猜数字的游戏,若输入的值比随机的值大,则提示大,再输入,若小,则提示小,若相等则提示win。
注意点:
- RANDOM:是Bash中用来生成0~32767之间随机整数的一个内置函数。非常量。
- read命令:从标准输入中读取一行,并把输入行的每个字段的值指定给shell变量。
参数:
-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分隔符。
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
-p 后面跟提示信息,即在输入前打印提示信息。
-e 在输入的时候可以使用命令补全功能。
-n 后跟一个数字,定义输入文本的长度,很实用。
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话\就是个正常的字符了。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间。
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。
说明:
read内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。
编写一个创建用户的脚本,要求以下功能
a.提示用户输入希望创建的用户名(当用户超时8秒不输入,提示超时并退出)
b.检测用户名是否已存在,若用户不存在,则进入第c步骤,若用户存在则提示用户是否要对该用户设置密码,若用户输入yes、YES、y、Y时则跳至d步骤,如输入其他,或超时8秒均退出。
c.用户创建完成后提示用户是否要继续设置密码,若用户输入yes、YES、y、Y时则继续下一步,如输入其他,或超时8秒均退出。
d.接上一步,为用户设置密码,首先提示用户输入要设置的密码,密码的输入过程不可见。
e.对用户上一步所输入的密码进行长度检测,若少于5位(包含5位),则提示用户密码太短,请重新输入。
f.对用户在第d步所输入的密码进行复杂度检测,若所输入的内容与/usr/share/dict/words 字典中的某一行条目完全一致,则提示密码是一个常见单词,请重新输入。若第e/f两步的密码错误次数一共超过3次,则提示错误次数过多,并退出。
g.再一次让用户输入密码,若第二次输入的密码与在第d步输入的不一致,则提示用户两次密码不一致,请重新输入,则跳回至第d步。
h.d至g步骤全部通过后,为用户设置密码后,并提示密码已成功设置。最后正确退出。
以上的所有退出情况应给出不同的返回值。
注意点:
- linux设置用户和密码:添加用户使用命令:adduser + 用户名,设置密码使用命令:passwd + 用户名,回车后,会需要输入旧密码和新密码,输入的密码不会回显。另一种设置密码的方法:passwd --stdin 用户名,从标准输入中获取新密码,echo 新密码 | passwd --stdin 用户名。弊端是使用history命令可以查看到密码。
- read -t: 后面跟秒数,定义输入字符的等待时间。超时返回142错误码。
- read换行:利用-p选项,输出文本,在文本中利用``或者$(),命令替换使用echo -e "文本",支持转义。
- id命令:命令会显示用户的 UID(User ID)、GID(Group ID)以及附属于用户的所有组 ID。可以用来查看用户是否存在。
- &>和>区别:>:输出重定向,将'>'左边的输出的结果重定向到右边,如果是文件,还会覆盖原来的内容。&>:也是输出重定向,不仅会将正确信息输出重定向到右边,还会将错误信息重定向。
- /dev/null:是一个空设备文件,对于写入会统统丢掉。我们可以通过把命令的输出重定向到 /dev/null 来丢弃脚本的全部输出。cat 去读取这个文件,那么它只会返回文件终点(EOF: end of file)。
- wc命令:用于统计输入的字节,字符,字数和行数。
- -c:统计字节数
- -l:统计行数
- -m:统计字符数
- -w:统计字数
- -L:打印最长行的长度
- shell中字符串比较
str1 = str2 : 相等比较
str1 != str2 : 不等比较
str1 < str2 : str1小于str2为true,比较字母在字母表顺序,字母越靠后就越大,反之越小
str1 > str2 : str1大于str2为true,比较字母在字母表顺序,字母越靠后就越大,反之越小
-n str1 : str1长度不是0则为true
-z str1 : str1长度为0则为true,-z 是Zero简写
编写一个录入个人信息的脚本/root/bin/information.sh,要求如下:
1.提示用户输入username(需对名字进行字符要求检查,用户名中不能模糊包含系统中任何一个已在存在用户名,如不能为helloroot1,123bin,ggntp2等。且要求username要以大写字母开头,长度至少5个字符。
2.提示用户输入性别,仅能输入male或female,输入其他的提示用户重试。
3.提示用户输入生日,格式必须为yyyy-mm-dd,并对日期的合法性进行检查,若输入2018-02-30等与现实不符的日期,则提示日期错误,请重试。
4.提示用户输入手机号,长度仅能11位,且务必以13x,18x,15x,17x开头,若错误则提示用户重新输入。5.提示用户输入身份证号,长度可为18位,格式前17位均为数字。要求第7位至第14位所填的内容与第3步的生日符合。同时要求第17位所填的数字若为奇数,那么第2位所填写的性别应为male,反之偶数应为female。最后1位可为数字或x。
6.将以上输入的信息以:为分隔符,保存至/root/info.txt中,每次输入一个用户,会向下追加一行。如Zhangsan:male:1999-12-20:13588291219:4101011999122030051
注意点:
- egrep:
- ^:行首
- $:行尾
- 条件:[[:upper:]]表示大写,[ ]:范围内的任意单个字符。[^ ]:范围外的任意单个字符。[a-b]:字符需要在a-b之间,包含a,b。
- {m, }:表示至少m个字符。
- {m}:匹配m次即长度为m的字符。
- {m, n}:至少m次,至多n次
- {0,n}:匹配至多n次至少0次
#!/bin/bash
read -p "please enter your name# " user_name
for i in `cat /etc/passwd | cut -d: -f1`
do
echo $i | grep $user_name &>/dev/null
if [ $? -eq 0 ];then
echo -e "用户名中不能模糊包含系统中任何一个已在存在用户名, $i, $user_name\n"
exit
fi
done
echo $user_name | egrep "^[[:upper:]].{4,}" &> /dev/null
if [ $? -ne 0 ];then
echo -e "要以大写字母开头,长度至少5个字符\n"
exit
fi
while true
do
read -p "please enter gender# " user_gender
case $user_gender in
male|female)
break
;;
*)
echo -e "please enter male or female, try again\n"
continue
;;
esac
done
while true
do
read -p "please enter birthday# " user_birthday
year=`echo $user_birthday | cut -d- -f1`
month=`echo $user_birthday | cut -d- -f2`
day=`echo $user_birthday | cut -d- -f3`
cal $day $month $year &> /dev/null
if [ $? -ne 0 ];then
echo -e "日期错误,请重试\n"
continue
fi
break
done
while true
do
read -p "please entar telphone number# " user_tel
echo $user_tel | egrep "^1[3857][0-9]{9}" &> /dev/null
if [ $? -ne 0 ];then
echo -e "电话号码错误 重新输入\n"
continue
fi
break
done
while true
do
read -p "please enter user id card# " user_id
echo $user_id | egrep "^[0-9]{17}[0-9x]" &>/dev/null
if [ $? -ne 0 ];then
echo -e "身份证号错误 重新输入\n"
continue
fi
usr_year=`echo $user_id | cut -c 7-10`
usr_month=`echo $user_id | cut -c 11-12`
usr_day=`echo $user_id | cut -c 13-14`
if [ $year=$usr_year -a $month=$usr_month -a $day=$usr_day ];then
echo -e "身份证号输入成功\n"
else
echo -e "身份证号错误 重新输入,生日不符 $year, $month, $day, $usr_year, $usr_month, $usr_day\n"
continue
fi
usr_sex=`echo $user_id | cut -c 17`
if [ $(($usr_sex%2)) -eq 0 ];then
if [ $user_gender="female" ];then
break
else
echo -e "身份证号错误 重新输入,性别不符 $user_gender\n"
continue
fi
else
if [ $user_gender="male" ];then
break
else
echo -e "身份证号错误 重新输入,性别不符 $user_gender\n"
continue
fi
fi
done
ls $(pwd)/info.txt &>/dev/null
if [ $? -ne 0 ];then
touch $(pwd)/info.txt
fi
echo "$user_name:$user_gender:$user_birthday:$user_tel:$user_id" >> $(pwd)/info.txt
利用上面的脚本,输入20个用户信息。
编写一个抽奖系统的脚本 ,可对/root/info.txt文件中的手机号进行随机抽奖,将中奖的手机号打印出来,要求第4-7位显示为*,即135****1219
注意点:
- sed命令:
- -r选项表示:支持扩展正则表达式
- s/rule/dst/:将输入行的字符串,通过rule正则表达式规则得到的字符串,替换成dst。
- ():将符合括号里规则的字符串保存到\1和\2...中
- .*:所有字符串
#!/bin/bash
rand_i=$((RANDOM%1+1))
sed -n "${rand_i} p" $(pwd)/info.txt | cut -d: -f4 | sed -r "s/(^[[:digit:]]{3}).*([[:digit:]]{4}$)/\1****\2/"