意外空格,变成意外结果
[root@localhost shell]# echo hello >test file
[root@localhost shell]# ls
test
[root@localhost shell]# cat test
hello file
这个纯粹就是一个意外
基础学习可以参考博客
https://blog.csdn.net/huayangshiboqi/article/details/79947564
乘法口诀
for i in $(seq 9); do for j in $(seq $i); do echo -n "$i*$j=$(($i*$j)) "; done;echo ""; done
11=1
21=2 22=4
31=3 32=6 33=9
41=4 42=8 43=12 44=16
51=5 52=10 53=15 54=20 55=25
61=6 62=12 63=18 64=24 65=30 66=36
71=7 72=14 73=21 74=28 75=35 76=42 77=49
81=8 82=16 83=24 84=32 85=40 86=48 87=56 88=64
91=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 9*9=81
解释:
1、[root@localhost shell]# echo $(seq 9) //1到9的意思
1 2 3 4 5 6 7 8 9
for循环:for arg in Range;do CMD;done
2、序列数据(seq 开始 步长 最后) —步长默认1
但是也可以修改默认值
[root@localhost shell]# echo $(seq 1 2 10)
1 3 5 7 9
shell中涉及的算术计算与其他语言一样(或其他语言与shell一样,顺序请强迫症患者忽略),有加(+)、减(-)、乘(*)、除(/)、取模(\)、取余(%)、求幂(**)。
[root@localhost shell]# echo $[2+3]
5
[root@localhost shell]# echo $((2+3))
5
[root@localhost shell]# let i=3+2
[root@localhost shell]# echo $i
5
//以上这三种的计算方式,结果都是一样的
[root@localhost shell]# echo 0.310-1 |bc
2.0
[root@localhost shell]# awk 'BEGIN{print 0.36-0.3}’
1.5
特情分享
[root@localhost shell]# date “+%y%m%d”
181224
[root@localhost shell]# date “+%Y%m%d”
20181224
http://blog.51cto.com/13520779/2093146
https://blog.csdn.net/zxllynu/article/details/85227007
这个博文写的案例还是挺实用的
https://blog.csdn.net/hxpjava1/article/details/79745221
这是一篇关于语法结构的解释比较好的文章,适合初学者
https://blog.csdn.net/qq3401247010/article/details/78005372
这个是定时任务脚本
http://www.51testing.com/html/71/n-3723971.html
这个视频课程好像值得拥有18个案例
http://edu.51cto.com/course/15585.html
以下这个博客是判断文件 ,目录 ,权限 变量是否为空
https://www.jb51.net/article/113695.htm
[ -f " f i l e " ] 判 断 file" ] 判断 file"]判断file是否是一个文件
[ a − l t 3 ] 判 断 a -lt 3 ] 判断 a−lt3]判断a的值是否小于3,同样-gt和-le分别表示大于或小于等于
[ -x " f i l e " ] 判 断 file" ] 判断 file"]判断file是否存在且有可执行权限,同样-r测试文件可读性
[ -n " a " ] 判 断 变 量 a" ] 判断变量 a"]判断变量a是否有值,测试空串用-z
[ “ a " = " a" = " a"="b” ] 判断 a 和 a和 a和b的取值是否相等
[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立
脚本中的判断语句可以 参考以下博文(这博文有判断,语句分析语句,函数 运算)这个shell脚本的编写规范都可以使用这个博文
https://www.cnblogs.com/yangyanfei/p/6386831.html
#!/bin/bash
### 输入IP 地址
read -p "please input ip:" IP
### ping IP 的命令 并判断是否该IP 是否开启
ping -c3 -w 10s $IP &> /dev/null && echo $IP is up || echo $IP is down
ping -c 3 -w 10s 127.0.0.1 和 ping 127.0.0.1 -c 3 -w 10s 是一样的逻辑结构
#!/bin/bash
### This script is time count down
### 2017-04-27
### by gan_ke
MIN=10
for ((s=10;s>=0;s--))
do
echo -n "10:${s}"
echo -ne "\r"
sleep 1
if
[ "$s" -eq "0" ]
then
for ((s=59;s>0;s--))
do
echo -n "0:${s}"
echo -ne "\r"
sleep 1
done
fi
done
计时器主要用到了for循环来实现,每一秒可以用sleep 1 来实现。然后就是逻辑的构造,首先让秒先循环,直到秒为0,分钟为1的时候,进入子循环,分钟被赋值为0,秒被赋值为59。其次就是刷新的问题,如果不做任何处理,每一秒都会打印出一个时间,这里我们用到了echo -n “1:${s}” echo -ne “\r”来实现刷新。
#!/bin/bash
for i in `seq 1 3`
do
useradd -G tang king$i;
echo king$i | passwd king$i --stdin;
done
这是一个很简单的脚本,但是又经常被用到,所以这个脚本是最基本的shell脚本基本功
sed -i ‘/king/d’ /etc/group
sed -i ‘/king/d’ /etc/passwd
for i in {1…3}; do rm -rf king$i; done
要写一个复制有用数据的意思
ll |grep 20190107| awk ‘{print $6}’
find /tang/ -name “CSVCGET_0001*” -a -name “*20190107_001” -exec cp {} /opt ;
find . -type f -mtime -1 | wc -l
40
find . -type f -mtime -1 -exec cp {} /opt \;
其实都不用,就一个命令就足够了 这个是在虚拟机上操作的命令,压根就不用
#!/bin/bash
## 判断拷贝目录是否存在
if [ ! -d "/king" ];then
mkdir /king
fi
## 进入数据目录
cd /tang
## find查询一天内修改过的文件 ,并拷贝一个新的目录下
find . -type f -mtime -1 -exec cp {} /king \;
## 对新拷贝的文件进行压缩
zip -r /tang.zip /king
http://www.mamicode.com/info-detail-1615943.html
shell脚本中关于 自动输入密码
https://blog.csdn.net/zhangjikuan/article/details/51105166
shell脚本的案例
https://blog.csdn.net/qq_36441027/article/details/80214259
http://blog.51cto.com/hujiangtao/1933288
https://www.cnblogs.com/createyuan/p/3959616.html
这个博文里记录了,很多都是生产环境下,对系统性能的脚本
https://www.cnblogs.com/zwgblog/p/5792470.html
logrotate 这个命令是centos 自带的命令
rpm -ql logrotate 查看命令的软件包信息
[root@localhost ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf 主配置文件
/etc/logrotate.d 主配置目录
/etc/rwtab.d/logrotate
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate
/var/lib/logrotate/logrotate.status
logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下。
关于日志的分割可以参考
https://www.cnblogs.com/clsn/p/8428257.html
#!/bin/bash
for (( i=1;i<4;i++)) ; do date -d '-'"$i"'days' +'%Y%m%d'; done
写这个脚本的注意事项:
1.i 的()这个要注意,是定义一个符号
2、; 这个符号也是要注意事项
3、 -$i和days 之间不可以有空格,
4、 days 要有s
5、 Y m d 这几个字母要注意大少写
换一种写法吧!!!!
for i in {1..3}; do date -d " -$i days" +"%Y-%m-%d"; done
现实生产环境的脚本
cd ~/log/error/archive
for ((i=6;i<28;i++))
do
d=$(date -d '-'"$i"' days' +'%Y-%m-%d')
echo "${d}: "`zcat error${d}_10.101.40.4?.tar.gz | grep -a "$1"|wc -l` >> ssoerr.log
done
https://blog.csdn.net/weixin_44224288/article/details/88248378
#!/bin/sh
a=`free -m | awk '/Mem/{print $4}'`
if [ $a > 200 ];
then
echo "当前内存为$a,内存不足,请及时处理"
fi
#!/bin/sh
a=`df -h | sed -n '2p' | awk '{print $4}'`
ip=`ifconfig ens33 |sed -n '2p' |awk '{print $2}'`
if [ a > 10g ];
then
echo -e "\033[31m 主机$ip \033[0m ,\033[34m当前的可用磁盘大少为$a \033[0m, \033[35m磁盘已经占满请求处理\033[0m"
fi