花了大概一周时间实现了操作系统自动化部署的脚本,第一次写脚本,遇到了不少问题,下面就遇到的问题做一下汇总:
1、通过getopts获取shell参数的输入
-
usage()
-
{
-
echo "Usage: 'basename $0' -n[nmae] -p[path]"
-
exit 1
-
}
-
while getopts :n:p: optarg
-
do
-
case "$optarg" in
-
n)
-
# echo "get the name option:$OPTARG"
-
ISO_NAME=$OPTARG
-
isoname=1
-
;;
-
p)
-
# echo "get the path option:$OPTARG"
-
ISO_PATH=$OPTARG
-
isopath=1
-
;;
-
?) echo "error | input incorrect"
-
usage
-
;;
-
esac
-
done
这个程序中的:n:p:解释如下:shell中传入的参数-n,-p不能为空,否则执行?)中的代码。getopts命令返回true,所以一般getopts命令使用while循环。
2、shell中if判断条件
-
if [ $isoname -eq 1 ]&& [ $isopath -eq 1 ]
-
then
-
if [ ! -s "$ISO_PATH/$ISO_NAME" ]
-
then
-
echo "error | cannot find the iso, please try again"
-
else if grep -q $ISO_NAME file.txt
-
then
-
echo "error | the iso is alary exit"
-
else
-
echo "$ISO_NAME $ISO_PATH" >> /shell/file.txt
-
echo "ok"
-
fi
-
fi
-
else if [ $isoname -eq 0 ] || [ $isopath -eq 0 ]
-
then
-
echo "error | the isoname and isopath is both necessary"
-
usage
-
fi
-
fi
if条件语句中的[ con ]con前后都有空格,同时if [ ! -s "$ISO_PATH/$ISO_NAME" ]判断一个文件是否存在且其内容不为NULL,! -s前后都有空格;可以使用if grep -q $ISO_NAME file.txt来判断变量是否在文件中,如果文件包含该变量,则grep返回0,否则返回1.
3、sed的使用
-
sed -in "/file:\/\/\/mnt\/cdrom\//d" CentOS-Media.repo
-
sed -in "/enabled=0/c\enabled=1" CentOS-Media.repo
-
sed -in "/file:\/\/\/media\/cdrecorder/a\ file:\/\/\/mnt/cdrom\/" CentOS-Media.repo
-
-
sed -in "/server_args/s/\/var\/lib\/tftpboot/\/tftpboot/g" tftp
-
sed -in "/disable/s/yes/no/g" tftp
这个可以参考自己整理的shell要点文档,这里主要讲的是s选项,用于找到匹配的行,在该行中用一种模式替换另一种模式,像示例中就是用"no"替换"yes".
4、awk的使用
该示例展示了awk如何接受shll变量以及如何传递变量给shell
-
eval $(awk -v nvar=$ISO_NAME '{if($1==nvar) printf("ISO_PATH=%s", $2)}' file.txt)
在awk中使用-v nvar=$ISO_NAME可以获取到shell中的变量$ISO_NAME,之后使用nvar即可;同时使用printf可以获取到awk环境下的变量;具体awk使用请参考自己整理的shell要点文档
5、source的使用
这样当前shell环境中的变量可以在auto_run.sh脚本中直接使用。shell脚本其实就是实现一些控制指令,应尽量快的执行,有些大的程序可以使用软连接来替代copy.
阅读(989) | 评论(0) | 转发(0) |