1 条件判断
数字比较:
-eq 等于;-ne 不等于;-gt 大于;-lt 小于;-ge 大于等于;-le 小于等于;
字符串比较
不相等 "$A" !="$B" 相等"$A" =="$B"
2 各种循环
while true循环:
while :
do
内容
done
while循环
while [ $i -le 100 ]
do
let i+=2
done
for循环,可以遍历指定数组;
a=(1 2 3 4 6 7 8 9 10 11 12 13)
for i in "${!a[@]}";
do
echo "${a[$i]}"
done
3 时间相关操作
3.1 获取当前时间
$(date +"%Y-%m-%d %H:%M:%S")
计算某个程序的耗时;代码如下:
startTime_s=`date +%s`
operateXXX
endTime_s=`date +%s`
sumTime=$[ $endTime_s - $startTime_s ]
echo "time cost : $sumTime s"
如何将耗时以s统计的,换成以分钟,小时统计的呢?
可以直接使用[],如下,不过这种方式都是int数除法,比如4/3 = 1;
echo "cost : $sumTime s = $[sumTime/60] m = $[sumTime/3600] h"
如果需要小数,可以使用bc工具,用scale控制保留几位小数;
time_m=`echo "scale=2; $sumTime/60 " | bc`
time_h=`echo "scale=2; $sumTime/3600 " | bc`
echo "time cost : $sumTime s = $time_m m = $time_h h ----"
也可不使用time_m,直接加到命令中,如下;
echo "time cost : $sumTime s = `echo "scale=2; $sumTime/60 " | bc` m = `echo "scale=2; $sumTime/3600 " | bc` h"
3.2 指令修改系统时间
date 查看目前系统时间;
更新时间如下:
date -s 20201103
date -s 18:32:23
4 $?返回上一条指令结果;
function add(){
return `expr $1 + $2`
}
add 23 50 #此处返回73
if [ $? -eq 73 ]
then
echo "yyy $?"
else
echo "nnn $?"
fi
注:结果输出为yyy 0;因为18行返回的是16行的结果;
5 获得键盘输入
read -p "are you ok?(y/n)" to_continue
if [ -z $to_continue ] #结果为空
then
exit -1
else
if [ $to_continue != 'y' ] #结果不等于y
then
echo "exit"
exit -1
fi
fi
6 获取文件中每一行数据,并输出
cat 文件名 | while read line
do
echo $line
done
7 远程拷贝,不需要二次输入密码,使用nohup,并且不在控制台显示信息;
a nohup sshpass -p "密码" scp -r 要拷贝的文件 目标路径 > scp_log 2>&1 &
b nohup sshpass -p "密码" scp -r 要拷贝的文件 目标路径 &
说明:
sshapass -p 设定密码scp,无需每次输入密码;
a比b的优势是a直接将结果输入到scp_log中,b默认输出到nohup文件,并在控制台显示;
nohup 操作 & 意思执行操作,忽略所有挂断信号;
8 带颜色的字体输出
字体颜色
#30:黑 ;#31:红 ;#32:绿 ;#33:黄 ;#34:蓝色 ;#35:紫色 ;#36:深绿 ;#37:白色
背景颜色
#40:黑 ;#41:深红 ;#42:绿 ;#43:黄色 ;#44:蓝色 ;#45:紫色 ;#46:深绿 ;#47:白色
echo -e "e[47;35m你好e[0m"白底紫字
9 输出结果到屏幕(控制台)同时写入文件
假设run.sh有输出,则
sh run.sh | sed "w log"
结果写入log;
10 shell中引号的区别:单引号,双引号,反引号(一般是键盘ESC下边那个)
上代码:
name=tim
echo '1 $name has $800'
echo "2 $name has $800"
echo '3 $name has $800'
echo "4 $name has $800"
echo '5 ls ./'
echo "6 ls ./"
echo `ls ./`
输出:
1 $name has $800
2 tim has 00
3 $name has $800
4 tim has $800
5 ls ./
6 ls ./
文件列表
说明:
1 单引号将所有内容当做字符,一视同仁,忽略所有的命令和特殊字符;双引号可以包含特殊字符并解析,并且需要输出特殊字符,需要加;反引号内部是一个命令,会先执行命令,然后返回结果;
2 输出说明:
1是单引号,所以直接输出结果;2是双引号,所以对$name进行解析;3是单引号,同1;4想输出$字符,加转义字符;5,6直接输出;7 执行ls操作,返回文件列表;
11 用户账户管理
a 建用户:
adduser peter //新建peter用户
passwd peter //给peter用户设置密码,修改密码
b 永久性删除用户账号
userdel peter
c 给用户改变权限
vim /etc/passwd文件
root:x:0:0:root:/root:/bin/bash
peter:x:0:0::/home/peter:/bin/bash#将x后边的改成都改成0即可,权限和root就一致了,注:此操作不可取,乃是黑客常用手段;
d 某些系统会对密码有要求,例如,密码必须有多少个数字,多少个小写字母之类的规则;
12 crontab
作用:相当于时钟,可以定时完成某个操作;
命令:
crontab -u root -e r l
-e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI;也可以直接打开/etc/crontab编辑;
-r : 删除目前的时程表,注:是全部删除,慎用;
-l : 列出目前的时程表
内部格式:
* * * * * 操作
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 7) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
举例:
0 */2 * * * oper 意思是每两个小时oper一下
*/2 * * * * oper 每两分钟oper一下
50 7 * * * oper 每天7:50oper
50 22 * * * oper 每天22:50
0 0 1,15 * * oper 每月1号和15号
1 * * * * oper 每小时的第一分
00 03 * * 1-5 oper 每周一至周五3点钟,
30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令
注:一般root账户,可以设置user,如果是非root账户,无需在crontab -e中设置账户,默认就是当前账户;crontab失效原因一般是:路径和权限错误,特别是sh文件,里边需 加上bin/bash等信息;
crond 是linux执行周期性任务的守护进程,命令如下:
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看crontab服务状态:
注:crond一般是打开的,这时候执意要你crontab -e,就会自动的更新,无需重启等操作;
14 字符串操作
字符串拼接:
str1=“”
str1=$str1"xxxx "
15 查看端口是否被占用
ss -lntpd 展示所有端口;
ss -lntpd | grep :22 寻找端口号22被什么程序占用;
16 patch 命令
用于修补文件,包括修改,更新文件;
17 sort 对ip排序:
命令说明:
”-t” : 表示以那个字符做分割
“-k” :和-t结合使用,表示取那一段为关键字进行排序,后面跟数据,1…n,表示取第几段,也可以是范围如1,3,表示将第1段到第3段作为一个整体来排序
“-n” :以数字进行排序
“-r” :倒序
# 按升序排序
sort -t'.' -k1,1n -k2,2n -k3,3n -k4,4n ip.txt
# 按降序排序
sort -t'.' -k1,1nr -k2,2nr -k3,3nr -k4,4nr ip.txt
18 常见shell指令
欢迎拍砖