1. Shell简介
1.1 定义
在命令行模式中,负责与用户交互的人机交互程序称之为Shell。
1.2 常见Shell
查看当前Linux中安装的Shell
cat /etc/shells
全称 | 简称 | |
---|---|---|
Bourne Shell | bsh | /usr/bin/sh 或 /bin/sh |
Bourn Again Shell | bash | /bin/bash |
C Shell | csh | /bin/csh |
TENEX C Shell | tcsh | /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 运行
- 不指定Shell版本运行
chmod +x test.sh
./test.sh
备注:需要给文件添加执行权限。使用“ll”命令查看权限。
- 指定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_name 或 echo ${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 实战
比较两个变量的大小,根据结果输出
前置知识点
算术运算符
全称 | 符号 | 说明 | |
---|---|---|---|
-eq | equal | == | 等于 |
-ne | no equals | != | 不等于 |
-gt | greater than | > | 大于 |
-lt | less than | < | 小于 |
-ge | greater equals | >= | 大于等于 |
-le | less 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;
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
参考:
[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:本人水平有限,难免出现错误。如您发现错误,请批评指正。