shell入门

x33g5p2x  于2021-10-07 转载在 Shell  
字(7.8k)|赞(0)|评价(0)|浏览(285)

一、查看IP的命令

ip addr
ip a

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

1、编写shell命令

#放在shell文件中
echo "第一个参数: $1";
echo "第二个参数:$2";

执行命令:

sh demo.sh  参数1  参数2

输出的结果为:

第一个参数: 参数1
第二个参数:参数2

注意:注意区分a 和 a和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 ]
then
echo "$1等于$2"
else
echo "$1不等于$2"
fi

实战2:

touch $1
if [ $? -eq 0 ]
then
echo "创建成功"
else
echo "创建失败"
fi

四、shell脚本输入之read命令

语法:read -参数

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

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

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

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

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

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

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

效果:5s后自动退出

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

read -n 5 -p "请输入密码:"  pass
echo ""
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"`"  pass
echo $pass

六、处理海量数据之grep命令
grep应用场景:通常对数据进行 行的提取
语法:grep [选项]…[内容]…[file]

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

grep 'useraaa' a/b/c
grep -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.txt
cat -n b.txt | sed -n '/100%/p'

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

十、if 循环控制(单分支与多分支)
单个判断(单分支循环):
if [ 条件判断 ];
then
执行动作
fi

实例:

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

if [ 条件判断 ];
then
执行动作
else
执行动作
fi

实例:

if [ -e c.txt ]
then
echo '文件存在'
else
echo '文件不存在'
fi

多个判断(多分支循环):
if [ 条件判断 ];
then
执行动作
elif [ 条件判断 ];
then
执行动作
elif [ 条件判断 ];
then
执行动作
fi

实例1:

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

调用:sh demo.sh 参数

实例2:

echo '请输入成绩:'
read number
if [ $number -gt 90 ];
then
echo '成绩优秀'
elif [ $number -gt 60 ];
then
echo "成绩及格"
elif [ $number -lt 60 ];
then
echo "不合格"
elif [ $number -eq 60 ];
then
echo "成绩为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 10
do 
echo $i
sleep 2
done

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

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

2、for 变量名 in 命令
do
执行动作
done

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

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

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

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

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

3、for ((条件))
do
执行动作
done

实例:

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

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

语法结构:
case 变量 in
值1 )
执行动作1
;;
值2 )
执行动作2
;;
值3 )
执行动作3
;;

esac

实例:

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

十三、while 循环
应用场景:while循环是条件循环也是不定循环,只要条件判断式成立,循环就会一直进行着。直到判断式不成立 或者 选择跳
出循环 才会结束
语法结构:
while [ 条件判断式 ]
do
执行动作
done

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

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

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

while [ 1 ]
do
cat <<EOF
***********************************
*1、计算出你输入目录下一共有多少文件 eg:/data
*2、计算从0加到您输入的数字为止
*3、批量创建用户
*4、测试用户名和密码是否匹配
*5、测试IP
*6、查看内存的使用率
*7、数据库中查询学生成绩
*q、退出
***********************************
EOF

echo "请输入功能编号:"
read key
case $key in
1 )
clear
sh 1.sh
;;
2 )
clear
sh 2.sh
;;
3 )
clear
sh 3.sh
;;
4 )
clear
sh 4.sh
;;
5 )
clear
sh 5.sh
;;
6 )
clear
sh 6.sh
;;
7 )
clear
sh 7.sh
;;
q )
clear
echo "------------------------感谢使用程序已退出------------------------"
break
;;
esac
done

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 ]
then
echo -e "\033[31;5m告警: \033[ 0m"
echo -e "\033[31;5m内存 使用率已超过负载能力,目前使用率达到: $Percent_mem_used%\033[0m"
else
echo "目前内存负载正常"
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

相关文章

微信公众号