shell的简要介绍
shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。
shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。
shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序。
shell脚本
就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。
shell脚本中最重要的就是对shell命令的使用与组合,再使用shell脚本支持的一些语言特性,完成想要的功能。
chmod +x ./test.sh #给脚本添加执行权限
./test.sh #执行脚本文件
或者
bash test.sh 将脚本作为参数传递给bash解释器
注释
“# ”开头的就是注释,被编译器忽略
单行注释: #
多行注释: :<
运行shell时,会同时存在三种变量:
局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
shell编程中,定义变量是直接定义的,没有明确的数据类型,shel允许用户建立变量存储数据,但是将认为赋给变量的值都解释为一串字符
cout=1 # 定义变量
name=“ohuohuo” # 定义变量
echo $cout # 取变量值
echo $name # 取变量值
使用变量的时,用英文符号"$"取变量值,对于较长的变量名,建议加上{ }花括号,帮助解释器识别变量的边界
readonly name命令使变量只读。
如果想要删除变量,使用unset命令解除命令赋值,但是unset不能删除可读变量
字符串用双引号好,使用双引号的优势:
可以在双引号中使用变量
可以在双引号中使用转移字符
在 Shell 中,用括号()来定义表示数组,数组中元素用"空格"符号分割开。定义数组的一般形式为:
array_name=(value1 value2 value3 value4)
在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,0为脚本名称,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推
$# 传递到脚本的参数个数
$ * 以一个单字符串显示所有向脚本传递的参数。
$$ 脚本运行的当前进程ID号
总体来说,和其他语言比较相似,不再具体介绍。下面说一些例子
查看多少远程IP连接在本机:
netstat -atn | awk ‘{print $5}’ | awk ‘{print $1}’ | sort -nr | uniq -c
使用 netstat ‐atn 可以查看本机所有连接的状态,‐a 查看所有,-t仅显示 tcp 连接的信息,‐n 数字格式显示
第五列是远程主机的 IP 和端口信息,
统计当前 Linux 系统中可以登录计算机的账户有多少个
grep “bash$” /etc/passwd | wc -l
并发执行shell脚本
因为默认情况下,shell脚本中的命令是串行执行的。如果这些命令相互之间是独立的,则可以使用“并发”的方式执行这些命令,这样可以更好地利用系统资源,提升运行效率,缩短脚本执行的时间。
#/bin/bash
all_num=10
a=$(date +%H%M%S)
for num in `seq 1 ${all_num}`
do
sleep 1
echo ${num}
done
b=$(date +%H%M%S)
echo -e "startTime:\t$a"
echo -e "endTime:\t$b"
10次循环,每次sleep 1秒,所以总执行时间10s。
1.使用"&"使命令后台运行
在命令的末尾加上&符号,则表示该命令将在后台执行,这样后面的命令不用等待前面的命令执行完就可以开始执行了
for num in `seq 1 ${all_num}`
do
{
sleep 1
echo ${num}
} &
done
上面会出现的问题是,主进程结束了,时间打印出来了,才出现数字。
解决上面的问题,只需要在上述循环体的done语句后面加上wait命令,该命令等待当前脚本进程下的子进程结束,再运行后面的语句。
后台进程创建很多会使操作系统在瞬间创建出所有的子进程,这会非常消耗系统的资源。最好的方法是并发的进程是可配置的。用xargs -P控制并发数 使用GNU parallel命令控制并发数。