Linux命令之Shell编程(第2次更新:20210320)

1. Shell简介


1.1 定义

在命令行模式中,负责与用户交互的人机交互程序称之为Shell。


1.2 常见Shell

查看当前Linux中安装的Shell

cat /etc/shells 
全称简称
Bourne Shellbsh/usr/bin/sh 或 /bin/sh
Bourn Again Shellbash/bin/bash
C Shellcsh/bin/csh
TENEX C Shelltcsh/bin/tcsh


1.3 Shell示例


1.3.1 新建
 vim test.sh


1.3.2 编写
#!/bin/bash
echo "hello bash"

备注:第一行代表使用哪种shell


1.3.3 查看
cat test.sh


1.3.4 运行
  1. 不指定Shell版本运行
chmod +x test.sh
./test.sh

备注:需要给文件添加执行权限。使用“ll”命令查看权限。


  1. 指定Shell版本运行
/bin/bash test.sh

或

sh test.sh



2. 编程基础、变量


2.1 变量


2.1.1 定义变量,并输出


2.1.1.1 shell脚本定义
#!/bin/bash
your_name="abc"
echo $your_nameecho ${your_name}

运行

sh shell.sh


2.1.1.2 终端直接定义
your_name="123"
echo $your_name


2.1.2 删除变量
myname="doug"
echo ${myname}
unset myname
echo ${myname}


2.1.3 只读变量
myname="doug"
readonly myname
unset myname

备注:如果想删除只读变量,关闭当前终端,重新打开终端即可。


2.1.4 系统预定义的变量
预定义变量说明
$0脚本名称
$1~$n获取参数
$#所有参数的个数
$*所有参数的值
$$点前进程或脚本PID
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

新建 shell.sh 文件

#!/bin/bash

echo $1,$2,$3

echo "文件名 " $0

echo "所有参数的个数 " $#

echo "所有参数的值 " $*

echo "最后命令的退出状态 " $?

运行

sh shell.sh 1 2 3

参考:Shell 传递参数、《Linux命令、编辑器与Shell编程》/王刚、霍格沃兹测试学院



2.2 变量类型


2.2.1 字符串


2.2.1.1 语法
语法:变量名="变量值"
举例:your_name="doug"


2.2.1.2 拼接字符串

编写名为stringSplit.sh的脚本

#!/bin/bash
your_name="doug"
your_name_split="hello,"${your_name}",How old are you !"
echo ${your_name_split}#!/bin/bash
your_name="doug"
your_name_split="hello,${your_name},How old are you !"
echo ${your_name_split}

运行

sh stringSplit.sh



2.2.2 数组


2.2.2.1 语法
语法:数组名=(数组值1 数组值2 ... 数组值n)
array_name=(value1 value2 value3 value4)


2.2.2.2 定义数组,并输出
#!/bin/bash
array_name=(A b "c" D)

echo "第一个元素为: ${array_name[0]}"
echo "第二个元素为: "${array_name[1]}
echo "第三个元素为: ${array_name[2]}"
echo "第四个元素为: "${array_name[3]}

运行

sh shell_array.sh

参考:Shell 数组



2.2.2.3 数组赋值

赋值,并打印所有

#!/bin/bash
array_name[0]=A
array_name[1]=b
array_name[2]="C"
array_name[3]=D

echo "数组的元素为: ${array_name[*]}"
echo "数组的元素为: ${array_name[@]}"   

运行

sh shell_array3.sh



3. 控制Shell脚本执行顺序


3.1 if


3.1.1 if


3.1.1.1 语法
if condition
then
   command1
   command2
   ...
   commandN
fi

举例

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

参考:Shell 流程控制



3.1.1.2 练习
#!/bin/bash
if [ 2==2 ]
then
  echo "true"
fi

运行

sh shell_if.sh

或者写成一行(适用于终端命令提示符)

if [ 2==2 ];then echo "true";fi


3.1.2 if else


3.1.2.1 语法
if condition
then
   command1
   command2
   ...
   commandN
else
   command
fi


3.1.2.2 练习
#!/bin/bash
if [[ 2 > 1 ]]
then
  echo "true"
else
  echo "false"
fi

运行

sh shell_if2.sh

或者写成一行(适用于终端命令提示符)

if [[ 2 > 1 ]];then echo "T";else echo "F";fi

备注:直接使用>、<、<=、>=、等符号时需要加双中括号[[]]。



3.1.3 if else-if else


3.1.3.1 语法
if condition1
then
   command1
elif condition2
then
   command2
else
   commandN
fi


3.1.4 实战

比较两个变量的大小,根据结果输出

前置知识点

算术运算符

全称符号说明
-eqequal==等于
-neno equals!=不等于
-gtgreater than>大于
-ltless than<小于
-gegreater equals>=大于等于
-leless equals<=小于等于

编辑脚本

#!/bin/bash

a=5
b=3

if [ ${a} -eq ${b} ]
then
   echo "等于"
elif [ ${a} -gt ${b} ]
then
   echo "大于"
else
   echo "小于"
fi

运行

sh shell_if3.sh

或者写成一行(适用于终端命令提示符)




3.2 for


3.2.1 语法
for 变量 in 列表
do
	语句块
done
# 原始类型
for var in item1 item2 ... itemN
do
	command1
	command2
	...
	commandN
done# 变量类型
variable = "item1 item2 item3"
for var in $variable
do
	command1
	command2
	...
	commandN
done# 数字简写
for var in {item1..itemN}
do
	command1
	command2
	...
	commandN
done# 命令类型
for var in $(command)
do
	command1
	command2
	...
	commandN
done

写成一行

for var in item1 item2 ... itemN; do command1; command2 ... done;for var in {item1..itemN}; do command1; command2 ... done;

参考:LInux shell之(for in 用法总结)



3.2.2 练习1

新建 shell_for.sh 文件

#!/bin/bash

for loop in 1 2 3 4 5
do
  echo "hello"
done

运行

sh shell_for.sh



3.2.3 练习2

新建 shell_for.sh 文件

#!/bin/bash

for loop in 1 2 3 4 5
do
  echo ${loop}
done

运行

sh shell_for.sh


3.2.4 练习3

新建 shell_for2_text.txt 文件

root
root2
root3
1
2
3

新建 shell_for2.sh 脚本文件

#!/bin/bash

for i in $(cat shell_for2_text.txt)
do
  echo "${i}"
done

运行

sh shell_for2.sh 

或者写成一行(适用于终端命令提示符)

for i in $(cat shell_for2_text.txt); do echo "$i"; done



3.3 while


3.3.1 语法
while condition
do
   command
done


3.3.2 练习1

新建 shell_while.sh 文件

#!/bin/bash

a=1

while(( $a<=5 ))
do
  echo $a
  let "a++"
done

运行

sh shell_while.sh



3.3.3 练习2

读取文件内容,并输出

新建 shell_while2_text.txt 文件

aaaa root
root2
root3
1
2
3

运行

while read i; do echo $i; done<shell_while2_text.txt

备注:read命令用法参见附录一


与for对比

while read i; do echo $i; done<shell_while2_text.txt

cat shell_while2_text.txt

for i in $(cat shell_while2_text.txt); do echo $i;done



3.4 实战


3.4.1 统计内存大小

前置知识

ps命令 、三剑客命令-awk、grep


新建 shell.sh 文件

#!/bin/bash
sum=0

for n in `ps aux | awk '{print $6}' | grep -v 'RSS''
do
  sum=$[ $sum + $n ]
done
echo $sum

运行

sh shell.sh

或者写成一行(适用于终端命令提示符)

for n in `ps aux | awk '{print $6}' | grep -v 'RSS'`;do sum=$[$sum+$n];done;echo $sum

参考:

shell习题第3题:统计内存大小

[Linux shell 中 ( ) ‘ ‘ , () ` `, (){},$[] $(()),[ ] (( ))"[]]"作用与区别



3.4.2 批量删除进程

新建 shell_for_deal.sh 文件

#!/bin/bash

for i in {1..50};do
{
        while true;
        do
          ((1+1))
        done &
}
done

运行

sh shell_for_deal.sh 

批量kill进程

ps -aux | grep "shell_for_deal.sh" | awk '{cmd="kill -9 " $2;system(cmd)}'

备注:不知道为什么会提示“没有那个进程”?路过的大神请指点



3.4.3 检测指定pid的内存20次

新增Linux命令说明

  • 实时显示进程命令top
参数说明
-n获取多次cpu的执行情况,top -n 4 表示更新4次
-d间隔时间,top -4 每隔4秒更新一次
-p获取指定端口的进程的数据,top -p 4444

参考:霍格沃兹测试学院


输入命令,并运行

for i in  {1..20};do top -n 1 -p 1 | grep "systemd" | awk '{print $11}'; done



附录一


Linux命令——接收用户输入指令read


定义

read命令用于从标准输入读取数值。接收来源可以是终端用户输入,也可以来自文件。

读取整行输入


语法
read [ [option] parameter] name


常用参数
参数说明
a将输入的文本放入数组中(默认使用的分隔符为空格或制表符Tab),数组的下标从0开始。
d指定结束符(默认使用换行为结束符)


读取输入,并保存到单个变量
read a
echo $a


读取输入,并保存到多个变量
read a b c
123 as !@#
echo $a
echo $b
echo $c
echo $a $b $c


读取输入,并保存到数组中
read -a names
smith john william brown jones
echo ${names[*]}



Linux命令——查看进程命令ps


定义

查看系统中运行的进程


语法
ps [option]


常用参数
参数说明
a显示所有终端进程
u显示所有用户的进程
x显示所有进程,包裹没有明确终端的进程


查看当前系统中的所有进程

ps -aux
或
ps aux



工具

虚拟机显示

Linux:CentOS 7

截图工具:FSCapture 8.4

文档编写工具:Typora



PS: 如果本文对您有帮助,请单击文章最后左下角的“点赞”或留言。

PPS:本人水平有限,难免出现错误。如您发现错误,请批评指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值