shell入门

2022-04-05
2475

Shell

一、查看IP的命令

ip addrip a


二、shell命令执行的时候传递参数


1、编写shell命令


echo "第一个参数:$1";echo "第二个参数:$2";


执行命令:


sh demo.sh  参数1  参数2


输出的结果为:


第一个参数:参数1

第二个参数:参数2


注意:注意区分$a和${a},区别是如果后面有拼接字符的话使用${a}


2、shell常见参数


$? #判断上一条命令执行的是否成功$0 #返回脚本的文件名称$1-$9 #返回对应的参数值$* #返回所有的参数值是什么$# #返回参数的个数和


三,shell常见的符号


1、>会覆盖原有的内容

aaa>a.txt aaa覆盖掉a.txt中的文本


2、>>不会覆盖原有的内容


3、; #执行多条命令


4、| #管道符


cat a.txt | grep 'aaaaaaaaaa'


含义:把|前面的结果交给|后面来处理


5、&& #前面的命令执行成功,后面的才可以执行


6、|| #前面的命令执行失败,后面的才可以执行


7、"" #会输出变量值


8、'' #输出本身


9、`` #输出命令结果 eg:a=`date`;echo $a


10、2>/dev/null #错误输出到无底洞


11、1>/dev/null #正确输出到无底洞


三、常见的判断

1、语法:[ 判断表达式 ]

1.1、文件(夹)或者路径:


1.1.1、-e 目标是否存在(exist)


实例1:

[ -e a.sh ] && '存在'

实例2:

[ -e a.sh ] || '不存在'


1.1.2、-d 是否为路径(directory)

实例1:

[ -e /a/b/c ] && '存在'

实例2:

[ -e /a/b/c ] || '不存在'

1.1.3、-f 是否为文件(file)


注意:

[ -e foer.sh ] || touch foer.sh #判断当前目录下是否有foer.sh这个文件,假如没有就创建出foer.sh文件

2、权限:

2.1、-r 是否有读取权限(read)

2.2、-w 是否有写入权限(write)

2.3、-x 是否有执行权限(excute)


[ -x 123.txt ] && echo '有执行权限'


3、整数值(int型):

3.1、-eq 等于(equal)

3.2、-ne 不等于(not equal)

3.3、-gt 大于(greater than)

3.4、-lt 小于(lesser than)

3.5、-ge 大于或者等于(greater or equal)

3.6、-le 小于或者等于(lesser or equal)

[ 9 -gt 8 ] && echo '大于'



4、小数(浮点型):

[ `echo '1.2 < 1.3' | bc` -eq 1 ] && echo '小于'


注意:我们这里使用的是bc计数器

如果:a>b不成立那么会返回0,如果成立那么会返回1


5、字符串:

= 相等

!= 不相等

[ 'kkkkk' != 'kkkk' ] && echo '不等于'


实战1:


if [ $1 -eq $2 ]thenecho "$1等于$2"elseecho "$1不等于$2"fi



实战2:

touch $1if [ $? -eq 0 ]thenecho "创建成功"elseecho "创建失败"fi


四、shell脚本输入之read命令


语法:read -参数


1、-p:给出提示符。默认不支持"\n"换行

实例:

read -p "请输入密码:" passecho $pass


2、-s:隐藏输入的内容

实例:

read -s -p "请输入密码:" passecho ""echo "您输入的密码为:$pass"


注意:-s要加在-p的前面


3、-t:给出等待的时间,超时会退出read

实例:

read -t 5 -s -p "请输入密码:" passecho ""echo "您输入的密码为:$pass"


效果:5s后自动退出


4、-n:限制读取字符的个数,触发到临界值会自动执行

实例:

read -n 5 -p "请输入密码:" passecho ""echo "您输入的密码为:$pass"


效果:输入5个字符后自动结束


注意:

echo "请输入密码:"read pass


五、shell脚本输出上色


语法: echo -e "\033[字背景颜色;字体颜色;特效字符串\033[关闭属性"

#字体色范围:30-37

echo -e "\033[30m 黑色字 \033[0m"

echo -e "\033[31m 红色字 \033[0m"

echo -e "\033[32m 绿色字 \033[0m"

echo -e "\033[33m 黄色字 \033[0m"

echo -e "\033[34m 蓝色字 \033[0m"

echo -e "\033[35m 紫色字 \033[0m"

echo -e "\033[36m 天蓝字 \033[0m"

echo -e "\033[37m 白色字 \033[0m"


#字背景颜色范围:40-47

echo -e "\033[40;37m 黑底白字 \033[0m"

echo -e "\033[41;30m 红底黑字 \033[0m"

echo -e "\033[42;34m 绿底蓝字 \033[0m"

echo -e "\033[43;34m 黄底蓝字 \033[0m"

echo -e "\033[44;30m 蓝底黑字 \033[0m"

echo -e "\033[45;30m 紫底黑字 \033[0m"

echo -e "\033[46;30m 天蓝底黑字 \033[0m"

echo -e "\033[47;34m 白底蓝字 \033[0m"


# 特效范围

echo -e "\033[0m 无任何特效 \033[0m"

echo -e "\033[1m 高亮度 \033[0m"

echo -e "\033[4m 下划线 \033[0m"

echo -e "\033[5m 闪烁 \033[0m"


使用实例:

read -p "`echo -e "\033[31m 请输入密码:\033[0m"`" passecho $pass


六、处理海量数据之grep命令

grep应用场景:通常对数据进行 行的提取

语法:grep [选项]...[内容]...[file]


1、-v #对内容进行取反提取

grep 'useraaa' a/b/cgrep -v 'useraaa' a/b/c


2、-n #对提取的内容显示行号

grep -n 'useraaa' a/b/c


3、-w #精确匹配

grep -w 'useraaa' a/b/c


4、-i #忽略大小写

grep -i 'useraaa' a/b/c


5、^ #匹配开头行首

grep '^useraaa' a/b/c


6、-E #正则匹配

grep -E 'user1|user2|user3' a/b/c



七、处理海量数据之cut命令

cut应用场景:通常对数据进行列的提取

语法:cut [选项]...[file]


-d #指定分割符

-f #指定截取区域

-c #以字符为单位进行分割

注意:不加-d选项,默认为制表符,不是空格

/bin/bash #代表可以登录的用户

/sbin/nologin #代表不可以登录的用户


1、-d与-f:

实例1:以':'为分隔符,截取出/etc/passwd的第一列跟第三列

cut -d ':' -f 1,3 /etc/passwd


实例2:以':'为分隔符,截取出/etc/passwd的第一列到第三列

cut -d ':' -f 1-3 /etc/passwd


实例3:以':'为分隔符,截取出/etc/passwd的第二列到最后一列

cut -d ':' -f 2- /etc/passwd


2、-c:

实例4:截取/etc/passwd文件从第二个字符到第九个字符

cut -c 2-9 /etc/passwd


实例5:比如领导想叫你截取linux上面所有可登陆普通用户

grep '/bin/bash' /etc/passwd | cut -d ':' -f 1 | grep -v root

注意:

/bin/bash #代表可以登录的用户

/sbin/nologin #代表不可以登录的用户


八、处理海量数据之awk命令

1、awk的简介:其实一门编程语言,支持条件判断,数组,循环等功能,与grep,sed被称为linux三剑客

之所以叫AWK是因为取其三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字


2、awk的应用场景:通常对数据进行列的提取


3、语法:

awk '条件 {执行动作}'文件名

awk '条件1 {执行动作} 条件2 {执行动作} ...' 文件名

或awk [选项] '条件1 {执行动作} 条件2 {执行动作} ...' 文件名


4、特殊要点与举例说明:

printf #格式化输出,不会自动换行。

(%ns:字符串型,n代表有多少个字符;

%ni:整型,n代表输出几个数字;

%.nf:浮点型,n代表的是小数点后有多少个小数


print #打印出内容,默认会自动换行

\t #制表符

\n #换行符


实例:


printf '%s\t%s\t%s\n' 1 2 3 4 5 6

实例:


printf '%s\t%s\t%s\t%s\t%s\t%s\n' 1 2 3 4 5 6

实例:


df -h | grep /dev/mapper/centos-root | awk '{printf "/dev/vda1的使用率是:"} {print $5 }'

注意:这里的/dev/vda1需要按照你自己的计算机上的书写可以使用df -h 查看,我这里的是/dev/mapper/centos-root,如图所示:


小数:


echo "scale=2; 0.13 + 0.1" | bc | awk '{printf "%.2f\n", $0}'

注意:这里需要安装bc,否则会报错。安装命令 yum install bc

$1 #代表第一列

$2 #代表第二列

$0 #代表一整行

实例:


df -h | grep /dev/mapper/centos-root | awk '{print $5}'


-F #指定分割符

实例:


cat /etc/passwd | awk -F":" '{print $1}'


BEGIN #在读取所有行内容前就开始执行,常常被用于修改内置变量的值

FS #BEGIN时定义分割符

实例:


cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}'


END #结束的时候 执行

NR #行号

实例:

df -h | awk '(NR>=2 && NR<=5) {print $5}'


九、处理海量数据之sed命令

sed的应用场景:主要对数据进行处理(选取,新增,替换,删除,搜索)


sed语法:sed [选项][动作] 文件名


常见的选项与参数:

-n #把匹配到的行输出打印到屏幕

p #以行为单位进行查询,通常与-n一起使用

实例:

 #打印出第二行df -h | sed -n '2p' 


d #删除

实例: 

sed '2d' df.txt #删除第二行#注意:这里不会对源文件产生影响


a #在行的下面插入新的内容

实例: 

sed '2a 1234567890' df.txt #在第二行的下面加入内容(不会对源文件产生影响)


i #在行的上面插入新的内容

实例: 

sed '2i 1234567890' df.txt #在第二行的上面加入内容(不会对源文件产生影响)


c #替换

实例: 

sed '2c 1234567890' df.txt


s/要被取代的内容/新的字符串/g #指定内容进行替换

实例: sed 's/0%/100%/g' df.txt


搜索:在文件中搜索内容

实例:


cat -n df.txt | sed -n '/100%/p'


-e #表示可以执行多条动作

实例:


cat -n b.txt | sed -n -e 's/100%/100%-----100%/g' -e '/100%-----100%/p'#解析:'s/100%/100%-----100%/g'表示替换'/100%-----100%/p'表示打印到屏幕上


-i #对源文件进行修改(高危操作,慎用,用之前需要备份源文件)


以上的操作都不会对源文件产生影响,如果需要对源文件进行修改就加上-i

实例:


set -i 's/0%/100%/g' df.txt #会把源文件的0%都替换成100%


搜索(打印出b.txt文件中的100%):

sed -n '/100%/p' b.txtcat -n b.txt | sed -n '/100%/p'


一般-n和p是配合来使用的



十、if 循环控制(单分支与多分支)

单个判断(单分支循环):

if [ 条件判断 ];

then

执行动作

fi


实例:

if [ -e c.txt ]thenecho '文件存在'fi


if [ 条件判断 ];

then

执行动作

else

执行动作

fi


实例:

if [ -e c.txt ]thenecho '文件存在'elseecho '文件不存在'fi




多个判断(多分支循环):

if [ 条件判断 ];

then

执行动作

elif [ 条件判断 ];

then

执行动作

elif [ 条件判断 ];

then

执行动作

fi


实例1:

if [ $1 -gt 90 ];thenecho '成绩优秀'elif [ $1 -gt 60 ];thenecho "成绩及格"elif [ $1 -lt 60 ];thenecho "不合格"fi


调用:sh demo.sh 参数



实例2:

echo '请输入成绩:'read numberif [ $number -gt 90 ];thenecho '成绩优秀'elif [ $number -gt 60 ];thenecho "成绩及格"elif [ $number -lt 60 ];thenecho "不合格"elif [ $number -eq 60 ];thenecho "成绩为60"fi



十一、for循环控制

1、for 变量名 in 值1 值2 值3

do

执行动作

done


实例(依次打印出1-10):

for i in 1 2 3 4 5 6 7 8 9 10do echo $isleep 2done


实例(依次打印出1-10):

for i in 1 2 3 4 5 6 7 8 9 10do echo $idone


2、for 变量名 in `命令`

do

执行动作

done


实例(依次打印出1-10):

for i in `seq 1 20`do echo $idone


实例(检测主机是否正常工作):

for i in $(cat a.txt)do ping -c 2 $idone


#注意:a.txt是一个文件,ping -c 2 $i表示ping两次就结束


3、for ((条件))

do

执行动作

done


实例:

for ((i=1;i<11;i++))do echo $isleep 1done


十二、case循环控制

应用场景:case循环常使用于多重分支,与if不同的是,if可以判断多个条件,case一次只能判断一种条件


语法结构:

case 变量 in

值1 )

执行动作1

;;

值2 )

执行动作2

;;

值3 )

执行动作3

;;

....

esac


实例:

echo "请输入:"read xcase $x in1)echo "周一";;2)echo "周二";;3)echo "周三";;4)echo "周四";;5)echo "周五";;6)echo "周六";;0)echo "周日";;*)echo '输入有误重新输入';;esac


十三、while 循环

应用场景:while循环是条件循环也是不定循环,只要条件判断式成立,循环就会一直进行着。直到判断式不成立 或者 选择跳

出循环 才会结束

语法结构:

while [ 条件判断式 ]

do

执行动作

done


实例:

计算0加到你输入数子的和

i=0sum=0while [ $i -lt $1 ]do sum=$(($sum+$i))i=$(($i+1))doneecho "和为:"$sum


十四、实例实战

1、如何让shell实现 可选择性执行 的功能

while [ 1 ]docat <<EOF************************************1、计算出你输入目录下一共有多少文件 eg:/data*2、计算从0加到您输入的数字为止*3、批量创建用户*4、测试用户名和密码是否匹配*5、测试IP*6、查看内存的使用率*7、数据库中查询学生成绩*q、退出***********************************EOF  echo "请输入功能编号:"read keycase $key in1 )clearsh 1.sh;;2 )clearsh 2.sh;;3 )clearsh 3.sh;;4 )clearsh 4.sh;;5 )clearsh 5.sh;;6 )clearsh 6.sh;;7 )clearsh 7.sh;;q )clearecho "------------------------感谢使用程序已退出------------------------"break;;esacdone


2、巡查内存使用率

2.1创建6.sh

mem_total=`free -m | sed -n '2p' | awk '{print $2}'`  mem_used=`free -m | sed -n '2p' | awk '{print $3}'`  mem_free=`frce -m | sed -n '2p' | awk '{print $4}'`  Percent_mem_used=`echo "scale=2; $mem_used / $mem_total * 100" | bc`  Percent_mem_free= `echo "scale=2; $mem_free / $mem_total * 100" | bc`  now_time=`date +"%Y-%m-%d %H:%M:%S 星期%w"`  echo -e "\n"  echo -e " $now_time\n内存的使用率是: $Percent_ mem_used%"  echo -e "内存还剩余: $Percent_mem_free%未使用 "  if [ $mem_used -gt 1 ]thenecho -e "\033[31;5m告警:\033[ 0m"echo -e "\033[31;5m内存 使用率已超过负载能力,目前使用率达到: $Percent_mem_used%\033[0m"elseecho "目前内存负载正常"fi  echo -e "\n"

3、批量创建用户

应用场景:创建10000个用户


4、数据库里查询学生成绩


5、如何实现高效率登录别的机器

场景:假如公司有50台机器。每台机器对应ip不一样。

实例:

re_ip=`cat /home/shell/ip.txt | grep $1 | awk -F "|" '{print $2}'`ssh ${re_ip}


其中ip.txt的内容为

sh | 192.168.2.3

js | 192.168.2.4




十五、其他

查看磁盘的使用率:df -h