linux中shell脚本基本注意事项

shell不适合大量代码集合,更多的是命令的集合,如果要实现更复杂的逻辑,个人更偏向于python脚本语言

第一部分:基本注意事项

参考:
https://www.cnblogs.com/davygeek/p/5670212.html shell特殊变量
https://www.cnblogs.com/gossip/p/5948398.html read
https://blog.csdn.net/qq13650793239/article/details/80163495 大小于
https://www.cnblogs.com/avivahe/p/5635911.html 判断文件类型
https://www.jianshu.com/p/0e20cd55382a SHELL编程注意事项 蛮不错
https://www.jb51.net/article/73334.htm Linux Shell脚本面试25问集合 蛮不错
https://juejin.im/post/5bf512d85188252ea66ae21c 10 个实战及面试常用 Shell 脚本编写
https://charlee.li/bash-pitfalls.html bash陷阱
shell的一些注意事项:
1.shell特殊变量
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。


2.read用法
-p 提示字符
-t 时间
-s 机密
-n 特定字符数

read -t 30 -p "请输入用户名称:" name



3.shell 中 [-eq] [-ne] [-gt] [-lt] [ge] [le]
-eq //等于
-ne //不等于
-gt //大于 (greater )
-lt //小于 (less)
-ge //大于等于
-le //小于等于




4.判断文件类型
-r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真
-a         与
-o        或
!        非
-n str1        当串的长度大于0时为真(串非空)
-z str1        当串的长度为0时为真(空串)




5.SHELL编程注意事项
shell脚本:语法检查:bash -n name.sh ; 调试检查: bash -x name.sh
set -e 遇到执行非0时退出脚本,set-x 打印执行过程。
双引号:弱类型表达,可执行引号中的命令引用
单引号:强类型表达,直接输出引号中的字符串
bash中的算数运算(关键字let),语法形式如下:
let var=算数表达式
var=$[算数表达式]
var=$((算数表达式))
echo '算数表达式' | bc



6.Linux Shell脚本面试25问集合
https://www.jb51.net/article/73334.htm



7.
if while中的[[]] 用两个即可解决一些引号问题

个人动手去敲了部分网上流传的面试代码,发现更多偏基础

第二部分:部分shell代码

参考:

#https://cloud.tencent.com/developer/article/1072053
#http://www.361way.com/linux-sa-interview-questions/4310.html
#https://juejin.im/post/5cc2755b6fb9a0324936b9b1
#!/bin/bash
# 3.设计一个shell 程序,添加一个新组为class1,然后添加属于这个组的30 个用户,用户名的形式为stdxx,其中xx 从01到30。
#read -t 30 -p "请输入数字":$num
i=1
while [[ $i -le 30 ]]
do
if [[
$i -le 9 ]];then
temp_num=stu0${i}
else
temp_num=stu${i}
fi
echo $temp_num
i=$(($i+1))
done


crontab -e test.sh
crontab test.sh
#!/bash/bin
#(1)在下午4 :50 删除/abc 目录下的全部子目录和全部文件;
#(2)从早8:00~下午6:00 每小时读取/xyz 目录下x1 文件中每行第一个域的全部数据加入到/backup 目录下的bak01.txt 文件内;
#(3)每逢星期一下午5:50 将/data 目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;
#(4)在下午5:55 将IDE 接口的CD-ROM 卸载(假设:CD-ROM 的设备名为hdc);
#(5)在早晨8:00 前开机后启动。
#min hours days year everyweek command
50 16 * * * rm -r /abc/*
0 8-18/1 * * * cat /xyz/x1 | awk '{print $1}' > /backup/bak01.txt
55
17 * * 1 tar -czvf /data/* backup.tar.gz
55 17 umount /sdb/hdc
at

#设计一个shell 程序,在每月第一天备份并压缩/etc 目录的所有内容,
# 存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,
# yy 为年,mm为月,dd 为日。Shell 程序fileback 存放在/usr/bin 目录下。
#!/bin/sh
DIRNAME=`ls /root | grep bak`
if [ -z "$DIRNAME" ] ; then
mkdir /root/bak
cd /root/bak
fi
YY=`date +%y`
MM=`date +%m`
DD=`date +%d`
BACKETC=$YY$MM$DD_etc.tar.gz
tar zcvf $BACKETC /etc
echo "fileback finished!"

* * 1 * * /bin/sh /usr/bin/fileback

#有一普通用户想在每周日凌晨零点零分定期备份/user/backup 到/tmp 目录下,该用户应如何做?
0 0 * * sun cp /user/backup /tmp

查询file里面空行的所在行号
grep
-n ^$ 2.txt | awk -F ":" '{print $1}'
查询file1 以abc 结尾的行
grep abc$ file1
打印出file1 文件第1 到第3 行
sed -n '1,3p' file
head -3 file

#查看 http 的并发请求数与其 TCP 连接状态
netstat -anp | awk '/tcp/
netstat -anp | grep -v udp

#用 tcpdump 嗅探 80 端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -5

#.查看/var/log 目录下文件数
ls /var/log/ -lR| grep "^-" |wc -l

#查看当前系统每个 IP 的连接数
netstat -n | awk '/^tcp/ {print $5}'| awk -F: '{print $1}' | sort | uniq -c | sort -rn

#随机密码的生成:
cat 2.txt| head 1 | md5sum | head -c 32

#7.统计出 apache 的 access.log 中访问量最多的 5 个 IP
cat access_log | awk '{print $1}' | sort | uniq -c | sort -nr | head -5

#fsck 修复命令

#Linux 系统的开机启动顺序

#显示/etc/inittab 中以#开头,且后面跟了一个或者多个空白字符,而后又跟了任意非空白字符的行
grep "^# \{1,\}[^ ]" /etc/inittab

#显示/etc/inittab 中包含了:一个数字:(即两个冒号中间一个数字)的行
grep "\:[0-9]\{1\}\:" /etc/inittab

2019.5.7

发表评论

电子邮件地址不会被公开。 必填项已用*标注