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

posted @ 2019-08-15 17:58  yile  阅读(227)  评论(0编辑  收藏  举报