#!/bin/bash 用于指定解释程序,可以通过$BASH来获取;
字符串相关操作
${str}
${#str}获取字符串的长度
${str:index}从index位置开始截取str
s
t
r
:
i
n
d
e
x
:
l
e
n
g
t
h
从
i
n
d
e
x
位
置
开
始
,
截
取
s
t
r
,
长
度
为
l
e
n
g
t
h
e
x
:
{str:index:length}从index位置开始,截取str,长度为length ex:
str:index:length从index位置开始,截取str,长度为lengthex:{str:5:10}从5位置开始截取,长度为10
Bash的内部变量
$BASH bash实例的全路径名
$HOME 当前用户的home目录
$IFS 内部分隔符的缩写
$OSTYPE 操作系统的类型
$SECONDS 脚本运行的描述
$TMOUT 默认的超时秒数
$UID 当前用户的uid
bash 中的位置参数和特殊参数
$n表示第n个参数
∗
表
示
从
1
−
n
的
所
有
位
置
参
数
,
如
果
在
双
引
号
内
,
"
* 表示从1-n的所有位置参数,如果在双引号内,"
∗表示从1−n的所有位置参数,如果在双引号内,"*"
$@ 表示从1-n的所有位置参数,
$? 表示最近一个在前台执行的命令的退出状态,0表示成功的执行并退出;
$$ 当前shell的进程号
$0 表示当前脚本的名称
使用declare指定变量的类型;
bash中的数组
间接声明 arrayname=()
ex: arr1=(1 2 3 4 5 ‘abc’)
直接声明 declare -a arrayname=()
ex: declare -a arr1=(1 2 3 4 5 ‘abc’)
如果要引用数组中的某一个元素,必须用花括号{}
bash中的算术运算符
(
(
算
术
表
达
式
)
)
e
x
:
((算术表达式)) ex:
((算术表达式))ex:(( a3_1%a3_2 )) KaTeX parse error: Undefined control sequence: \* at position 206: … 8 expr 6 \̲*̲ 8 退出脚本 exit结束…?来查看状态码
调试脚本
shell脚本调试的主要目的是发现并找到脚本错误的原因,从而快速定位并解决相关问题,
目前最主要的脚本调试方法是使用bash 的-x选项
bash -x script
bash -v 激活详细输出模式
更通常的情况,bash -xv script
bash -n script用来测试shell脚本中是否存在语法错误
条件测试
test 主要用于文件属性、字符串、算术测试
格式
test expression 或者[ expression ]
文件属性测试操作符、字符串测试操作符、算术测试操作符
注意区别[ expresion ] 和 [[ expresiion ]]
if结构;
条件执行 && ||
&&逻辑与 只有当前一个命令成功时才会执行后一个命名
||逻辑或 只有当前一个命令失败时才会执行后一个命令
注意:shell中的反引号与
(
c
o
m
m
a
n
d
)
左
右
类
似
,
建
议
使
用
(command)左右类似,建议使用
(command)左右类似,建议使用()的形式
ex:now=$(date)
!expression 逻辑非
case语句
bash循环
for循环、while循环、until循环、
until循环:
格式:
until [ command ]
do
commands
done
注意:until循环的判断条件正好与while循环相反,until循环条件为假的情况该才会持续运行;
select 循环:
格式:
select var in list
do
commands
done
循环控制:break/continue
shell函数
定义:
function function_name(){
commands
}
或者
function_name(){
commands;
}
另外,如果有function关键字,则可以省略圆括号()
function name{
commands;
}
向函数传递参数
shell有自己的命令行参数,函数使用特殊变量$1,
2
,
2,
2,n来访问传递给它的参数;
注意$0指的是shell脚本的名字;
函数调用
function_name args1 args2 …
本地变量:
默认情况下脚本中所有的变量都是全局的
我们可以使用local命令来创建一个本地变量,
格式:local var varname或者 local varname
local命令只能在函数内使用,local命令将变量名的可见范围限制在一个函数内部;
return命令
若在shell函数中有return命令,函数执行到return语句时结束,并且返回到shell脚本中调用函数位置的笑一个命令;
若return带一个数值型参数,则这个参数就是函数的返回值,返回值的最大值为255;否则函数的返回值是函数体内最后一个执行的命令的返回状态;
从函数文件中调用函数
. /dir/script.sh
source /dir/script.sh
& 将函数放在后台运行
脚本输入处理
case语句处理命令行参数
当我们脚本只接受一个命令行参数,并且会根据该命令行参数的不同采取不同的行为时,通常会使用case语句来处理命令行参数;
如果想case语句对命令行参数的大小写不敏感,可以开启nocasematch选项;
在脚本开始和结尾的部分分别加上:
shopt -s nocasematch
shopt -u nocasematch
shift命令处理命令行参数
当我们的脚本需要多个命令行参数时,使用shift命令在一个变量中一个接一个的获取多个命令行参数
for循环读取多个参数
获得用户输入
read -p command
-p选项用于在尝试读取任何输入之前,显示提示信息的内容到标准错误输出
read -t seconds
-t 选项用来设置read命令读取用户输入的超时时间
read -s command
-s选项用来隐藏用户的输入,也就是来自终端的输入不会被显示出来
正则表达式
shell重定向
基本概念:
0——标准输入——键盘:从文件(默认是键盘)读取输入
1——标准输出——屏幕:发送数据到文件(默认是屏幕)
2——标准错误——屏幕:发送所有错误信息到一个文件(默认是屏幕)
标准输入:
数字是0,又被称为stdin,默认是键盘输入
< 输入重定向
格式:command < input_filename;
example: cat < readfromfilebyfor.sh
标准输出
数字是1,又被称为stdout,默认是屏幕输出
> 输出重定向
格式 command > output_filename
标准错误
数字是2,又被称为stderr,默认是屏幕输出
2> 标准错误重定向
格式 command 2> error_filename
重定向:改变输入或输出的默认路径就叫做重定向
> 输出重定向,重定向默认只适用于一条命令;
文件重定向:command > filename;
默认情况下直接打开该文件,若文件存在,文件之前的内容会丢失,若文件不存在,重现创建一个新文件
< 输入重定向
追加重定向:
>> 追加输出重定向,若文件存在,则追加到文件末尾,文件之前的内容不会丢失,若文件不存在,则重新创建一个新文件
空文件的创建
> filename
/dev/null丢弃不需要的输出
同时重定向命令的标准输出和标准错误
command &> filename
或者command >& filename
或者command > filename 2>&1
或者commadn 2>&1 >filename
文件描述符
一般情况下,我们使用的文件描述符是0-9;
文件描述符可以包含多个数字位;
例如,文件描述符001和01与文件描述符1是相同的;
比如,如果你想记录脚本中的命令产生的错误信息,就可以在脚本的开头使用类似如下的命令:exec 2> errors.log
netstat或者netstat -i查看网络状态;
关闭文件描述符
[n]<&-
[n]>&-
ex:关闭标准输入就是“<&-”,而关闭标准错误就是2>&-
Bash支持使用如下语法在文件描述符上打开一个既可读取又可写入的文件:
$ exec [n]<>file
给一个输入文件指定一个文件描述符的语法是:exec [n]< file
给一个输出文件指定一个文件描述符的语法是:$ exec [n]> file
关闭文件描述符的语法是:[n]<&- 或 [n]>&-
管道和过滤器
管道:将两个或多个程序连接到一起,以使一个程序的输出变为下一个程序的输入,以这种方式连接的两个或多个程序就形成了管道
管道通常用于执行一些复杂的数据处理操作;
| 管道符号
格式 command1 | command2 |...
重定向操作符“>”将命令与文件连接,而管道符“|”将第一个命令的输出与第二个命令的输入连接;
example:
ls | grep data.txt
是查看文件data.txt是否存在于当前目录下;
tr a-z A-Z < os.txt | sort | uniq > os.txt.new
使用tr命令将os.txt文件的内容转化为大写,并使用sort命令将内容排序,使用uniq命令去除重复的行,最后将输出重定向到文件os.txt.new
过滤器
简单地说,过滤器可以概括为以下两点
如果一个Linux命令是从标准输入接收它的输入数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器。
过滤器通常与Linux管道一起使用;
常用的被作为过滤器使用的命令:
awk——用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具。
cut——用于将每个输入文件(如果没有指定文件则为标准输入)的每行的指定部分输出到标准输出。
grep——用于搜索一个或多个文件中匹配指定模式的行。
tar——用于归档文件的应用程序。
head——用于读取文件的开头部分(默认是10行)。如果没有指定文件,则从标准输入读取。
paste——用于合并文件的行。
sed——用于过滤和转换文本的流编辑器。
sort——用于对文本文件的行进行排序。
split——用于将文件分割成块。
strings——用于打印文件中可打印的字符串。
tac——与cat命令的功能相反,用于倒序地显示文件或连接文件。
tail——用于显示文件的结尾部分。
tee——用于从标准输入读取内容并写入到标准输出和文件。
tr——用于转换或删除字符。
uniq——用于报告或忽略重复的行。
wc——用于打印文件中的总行数、单词数或字节数
具体实例:
history | awk '{print $2}' | sort | uniq -c | sort -rn | head 列出当前账号最常使用的10个命令
信号
每个信号都有以“SIG”开头的名称,并定义为唯一的正整数,在Shell命令行提示符下,输入“kill -l”命令,将显示所有信号的信号值和相应的信号名
进程
前台进程和后台进程
默认是前台进程
要变成后台进程,最简单的方法是在命令的结尾添加控制符&
进程的状态
D(不可中断休眠状态)——进程正在休眠并且不能恢复,直到一个事件发生为止。
R(运行状态)——进程正在运行。
S(休眠状态)——进程没有在运行,而在等待一个事件或是信号。
T(停止状态)——进程被信号停止,比如,信号SIGINT或SIGSTOP。
Z(僵死状态)——标记为<defunct>的进程是僵死的进程,它们之所以残留是因为它们的父进程适当地销毁它们。如果父进程退出,这些进程将被init进程销毁;
如何查看进程
ps 默认查看当前用户当前终端下的进程;
ps -ef 显示系统中的所有进程;
ps aux 会增加进程状态(STAT)等信息作为默认显示
pstree 显示进程树的信息
pstree username 显示以此用户的进程为根的所有进程树的信息
使用pgrep命令,可以基于名称或其他属性查找进程
pgrep -u root sshd 查看root用户的sshd进程的PID
向进程发送信号
我们可以使用键盘或pkill命令、kill命令和killall命令向进程发送各种信号
Ctrl+C 中断、Ctrl+Z挂起...
kill pid
kill -9 pid
以调试模式运行shell脚本
bash -x scriptname.sh
————————————————
版权声明:本文为CSDN博主「w与荒野」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wuyundong123/article/details/97935192