前言
正式开写
正文
一、需求模拟
譬如某一天我们做了一个很屌的软件。
为了安全,该软件在运行时不推荐使用ROOT账户运行。所以我们会有个初始化shell脚本,来创建用户和初始化文件
1、判断用户是否存在(譬如叫god),没有则创建
2、创建后设置密码为123
3、把一些程序文件拷贝过去,并且除了root外,只能god用户运行(最好是root也不能方便的运行)
二、grep命令 搜索文件及文件中的内容
强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
这也是日常维护和系统部署时,用的最多的一个命令。
1.格式
grep "你要检索的字符串" 文件名
grep "你要检索的字符串" 文件名*
grep '正则' 文件名
cat 文件名 | grep "你喜欢的字符串"
ls | grep "你喜欢的文件名"
2.常用参数
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
例如: cat /etc/passwd | grep '^pangzi' -c
三、stdin 非交互式输入 模拟键盘
使用passwd 修改密码需要提示和确认 如果我们强迫设置可以吗?
echo "123" | passwd 用户名 --stdin
stdin 标准输入(键盘)
--stdin 代表使用非交互模式 输入,前面一条语句是管道
四、shell1
USER_COUNT=`cat /etc/passwd | grep '^god:' -c`
USER_NAME='god'
if [ $USER_COUNT -ne 1 ]
then
useradd $USER_NAME
echo "123" | passwd $USER_NAME --stdin
else
echo 'ok'
fi
缺点:用户不能反复创建及修改密码
五、强大的标记(部分)
$#传递到脚本的参数个数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的进程ID号
$@与$#相同,但是使用时加引号,并在引号中返回每个参数
$?显示最后命令的退出状态。0表示没有错误,其它任何值表明有错误(或执行不成功)
六、shell2 优化可重复执行
USER_COUNT=`cat /etc/passwd | grep '^god:' -c`
USER_NAME='god'
useradd $USER_NAME
if [ $? -eq 0 ] #判断上一个命令的执行状态,0是失败
then
echo "123" | passwd $USER_NAME --stdin
echo "done"
else
echo "error"
fi
尾声