shell基础命令
内置判断
-e file 如果文件存在,则结果为真
-d file 如果文件是一个子目录,则结果为真
-f file 如果文件是一个普通文件,则结果为真
-r file 如果文件可读,则结果为真
-s file 如果文件长度不为0,则结果为真
-w file 如果文件可写,则结果为真
-x file 如果文件可执行,则结果为真
if 结构
if [ condition ] ; then ··· ; fi
if [ condition ] ; then ··· ; else ··· ; fi
if [ condition ] ; then ··· ; elif ··· ; fi
简单的逻辑可以使用&& || 去替代
条件可以用命令返回指代替
[ 2 -eq 2 ];echo $?
[ 2 -eq 3 ];ehco $?
[ 2 -eq 3 ];echo $?
[ 3 -lt 3];echo $?
[ 3 -lt 3 ];echo $?
[ 3 -le 3 ];echo $?
[ 2 -ge 1 ];echo $?
[ 2 -ge 1 -a 3 -ge 4 ];echo $?
[ 2 -ge 1 -o 3 -ge 4 ];echo $?
if [ -e 1.sh ];then echo exist; else echo not exist; fi
if [ -e rrr ];then echo exist; else echo not exist; fi
[ -e 1.sh] && echo exist || echo not exist
[ -e 1.sh ] && echo exist || echo not exist
echo "1" && echo "2" || echo "3" && echo "4" || echo "5" || echo "6" && echo "7" && echo "8"|| echo "9"
for 循环
for (( c1; c2; c3 ));
do
··· ;
done
for (( i=0;i<10;i++ ));do echo $i;done
for 遍历循环
用以递归数据,也可用以空格隔开的字符串序列,或者是某个命令的返回值;
for f in ${array[*]};
do
···;
done
sss = "aa bb cc dd";for x in sss; do echo $x;done
for x in `ls`;do echo $x;done
ss=(aa bb "cc dd");for x in ${ss[*]};do echo $x;done
每隔1秒,取出进程所占cpu和内存数
for i in $(seq 1 20);do time=$(date +%H:%M:%S);info=$(ps -o %cpu -o %mem 2316);echo $time $info;sleep 1;done
while 循环
i=0;while [ $i -lt 3 ];do echo $i; ((i=i+1));done
一个有用的小技巧,一行行的读取文件:
while read line;do echo $line;done < /tmp/tmp
while read x; do echo input is $x; done
while read a b;do [ $b -gt $a ] && echo "b>a" || echo "b<a";done
while read x;do echo $x;done < 3 输出重定向,在屏幕上输出 ; >3输入重定向,内容不在屏幕上输出,输入到文件3里面
echo "hello to testwwwold" >> 1 文件的最后进行追加,而不是覆盖
read a;echo $a 输入到内容在屏幕上输出
read -p "enter:" a;echo $a
for f in *; do echo $f;if [ -d $f ];then break;fi;done //打印所有到文件,如果文件是目录,就退出
for f in *;do echo $f;if [ -f $f ];then echo $f is file;else continue;fi;done
shell运行环境
bash是一个进程;
bash下还可以重新启动一个shell,这个shell是sub shell,原shell会复制自身给它
在sub shell中定义变量,会随着sub shell的消亡而消失
()子shell中运行
{}当前shell中运行
$$当前脚本执行的pid
&后台执行
$!运行在后台的最后一个作业的PID(进程ID)
echo $$
(a=1;echo $a);echo $a //小括号里面是引用子进程里面的内容
{ a=2;echo $a;};echo $a; //{}是在当前shell里面运行
sleep 10& 放在后台运行 jobs查看运行的状态
ps
ps -ef显示全部进程
sleep 50 ctr+z 然后执行bg 3调入后台执行 fg 3调入前台执行
shell环境变量
shell首先是一个工作环境,有很多变量可以供我们使用
set可以获得当前的所有变量
env 可以获得传递给子进程的变量
export aa=bbb把私有变量导出
ll -al 可以查看所有的文件(包括隐藏文件)
chmod +x wulala.sh 增加可执行权限
bash wulala.sh 执行文件
curl -s http://www.baidu.com/s?wd=map3 | grep "结果约" -s去掉统计信息
curl -s http://www.baidu.com/s?wd=map3 | grep -o "结果约"
curl -s http://www.baidu.com/s?wd=map3 | grep -o "结果约[0-9,]*" 匹配的结果是:结果约13,100,000
curl -s http://www.baidu.com/s?wd=map3 | grep -o "结果约[0-9,]*" | grep -o "[0-9,]*" 匹配的结果是:13,100,000
vim baidu.keyword
mp3
mp4
android
ios
while read k;do echo $k; curl -s http://www.baidu.com/s?wd=$k;done < baidu.keyword | grep -o "结果约[0-9,]*"
匹配的结果是:
结果约64,300,000
结果约55,900,000
结果约58,500,000
结果约56,100,000
curl icanhazip.com
a=`curl -s https://testerhome.com/topics | grep -o 'href="/topics/[0-9]*"'| awk -F '/|"' '{print $4}'`;for id in $a;do url="https://testerhome.com/topics/"$id;zan=`curl -s $url | grep -o -m1 '<span>[0-9]*'| awk -F '>' '{print $2}'`;if [ -n "$zan" ];then echo $url "点赞人数为:" $zan;else echo $url "点赞人数为:" 0;fi;done | awk -F '/' '{print $NF}'
-m1:选取第一行 NF选择最后一行
循环输入内容,如果输入的值为quit,退出循环
functest(){
while true
do
read -p "please enter:" var_a
if [ ${var_a} == "quit" ]
then
break
else
echo ${var_a}
fi
done
}
functest
输入两个数值,并进行四则运算
functest(){
read -p "请输入第一个数:" var_a
read -p "请输入第二个数:" var_b
echo "$((${var_a} + ${var_b}))"
echo "$((${var_a} - ${var_b}))"
echo "$((${var_a} * ${var_b}))"
echo `awk "BEGIN{print \"$var_a\"/\"$var_b\"}"`
}
functest
curl https://testing-studio.com/ | grep href | grep -o "https[^\"']*"
curl -I https://www.baidu.com -I 发起个头请求
curl -s https://testing-studio.com/ | grep href | grep -o "http[^\"']*" | while read line;do curl -s -I $line | grep 200 && echo 200 $line|| echo error $line;done 对官网进行链路追踪
找出nginx.log中访问量最高的网页地址
awk '{print $7}' /tmp/nginx.log | awk -F '?' '{print $1}' | sort | uniq -c | sort -nr | head -5
求topics/nnn接口的平均响应时间(最后一列为响应时间)
awk '$7~/^\/topics\/[0-9]{3}/{sum+=$(NF-1)}END{print sum/NR}' nginx.log
seq 10 | grep '^.$'
seq 10 | grep '^..$'
seq 10 | grep -E '5|7' 扩展表达式,可以选出5和7 |匹配多个表达式中的任何一个
seq 10 | grep -oE '(5|7)|(10)' ()分组
echo '1|2#3_4' | awk -F '#|_|\\|' '{print $2}'
2
echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";OFS="-"}{print $1,$2,$3,$4}'
1-2-3-4
echo '1|2#3_4' | awk 'BEGIN{RS="#|_|\\|";OFS="-"}{print $1,$2,$3,$4}' RS 行分隔符
1---
2---
3---
4---
echo '1|2#3_4' | awk 'BEGIN{RS="#|_|\\|"}{print $1}'
1
2
3
4
echo '1|2#3_4' | awk 'BEGIN{RS="#|_|\\|";ORS="*"}{print $1}' ORS将每一列拼接起来
1*2*3*4*
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' RS指定列行分隔符
/usr/local/bin
/usr/bin
/usr/local/sbin
/usr/sbin
/home/16116374/.local/bin
/home/16116374/bin
/home/16116374/test
/home/16116374
awk 'BEGIN{print 3*7}'
21
awk 'BEGIN{print 3/7}'
0.428571
awk 'BEGIN{printf "%f\n", 1/3}'
0.333333
awk 'BEGIN{printf "%f\n", 1/3}'
0.333333
seq 10 2 20
10
12
14
16
18
20
seq 10 2 20 | awk '{sum+=$1}END{print sum}'
90
seq 10 2 20 | awk '{sum+=$1}END{print sum/NR}'
90
seq 10 2 20 | awk '$1 > 14'
16
18
20
seq 10 | sed -n '3p' 打印第三行数据,p是print
3
$ seq 10 | sed '3d'
1
2
4
5
6
7
8
9
10
seq 10 | sed 's/1/xxx/'
xxx
2
3
4
5
6
7
8
9
xxx0
seq 10 | sed 's/1$/xxxx/'
xxxx
2
3
4
5
6
7
8
9
10
seq 11 21 | sed 's/1/xxxx/'
xxxx1
xxxx2
xxxx3
xxxx4
xxxx5
xxxx6
xxxx7
xxxx8
xxxx9
20
2xxxx
seq 11 21 | sed 's/1/xxxx/'
xxxx1
xxxx2
xxxx3
xxxx4
xxxx5
xxxx6
xxxx7
xxxx8
xxxx9
20
2xxxx