Shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核。是一个功能强大的编程语言,易编写、易调试、灵活性高。
Linux提供的Shell解析器有六种:cat /etc/shells
/bin/sh
/bin/bash
,在CentOS中默认解析器为bash/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
脚本格式
-
脚本以
#!/bin/bash
开头#!/bin/bash echo "hello world"
-
运行脚本文件可通过:
sh xx.sh
、bash xx.sh
、./xx.sh(注意需要.sh具备执行权限[x],chmod 777)
-
通过
touch xx.sh
创建脚本文件,通过vim xx.sh
编辑脚本文件。
系统变量
$HOME
,当前登录用户的home目录$PWD
,当前所在目录路径$SHELL
,默认shell解析器$USER
,当前登录用户
自定义变量
- 基本语法
- 定义变量:变量=值
- 撤销变量:
unset 变量名
- 声明静态变量:
readonly 变量名
,注意不能撤销静态变量,重启即无效。 - 变量定义规则:字母、数字、下划线组成,不能以数字开头,建议环境变量大写。
- 等号左右无空格,严格要求
- 变量默认为字符串类型,无法直接进行数值运算。
- 变量的值若有空格,需要用引号括起来
- 将脚本中的局部变量,提升为全局变量:
export 变量名
特殊变量
-
$n
-
功能描述:n为数字。
$0
,代表该脚本名称;$1-$9
,代表第一到第九个参数;第十以上的参数需要用${10}
表示。touch partmeter.sh
vim partmeter.sh
#!/bin/bash echo "$0 $1 $2"
bash partmeter.sh p1 p2
partmeter.sh p1 p2
-
-
$#
-
功能描述:获取所有输入参数个数,常用于循环
#!/bin/bash echo "$#"
bash partmeter.sh p1 p2
2
-
-
$*
-
功能描述:获取命令行中所有的参数,将所有入参看做一个整体
#!/bin/bash echo "$*"
bash partmeter.sh p1 p2
p1 p2
-
-
$@
-
功能描述:获取命令行中所有的参数,将所有入参区分对待
#!/bin/bash echo "$@"
bash partmeter.sh p1 p2
p1 p2
-
-
$?
- 功能描述:最后一次执行命令的返回状态。若变量值为0,证明上一次命令执行正确;若变量值为非零,证明上一个命令执行出现错误。
运算符
- 基本语法
$((运算式))
或$[运算式]
expr
运算(运算符之间必须有空格)+
,加-
,减\*
,乘/
,除%
,取余- 运算执行符号:`expr 2 + 3
条件判断
- 基本语法
[ condition ]
,注意表达式前后需要有空格[ test ]
,条件非空即为true;[],条件为空即为false;
- 常用判断条件
=
字符串比较-lt
,小于-le
,小于等于-eq
,等于gt
,大于ge
,大于等于ne
,不等于-r
,有读的权限-w
,有写的权限-x
,有执行的权限-f
,文件存在且是一个常规文件file-e
,文件存在-d
,文件存在且是一个目录directory
- 多条件判断
&&
,前一条命令执行成功时,才执行后一条命令||
,前一条命令执行失败时,才执行后一条命令
流程控制
if
-
基本语法:
if
后要有空格,条件表达式[]
前后必须有空格;elif
,代表else if;fi
结尾。#!/bin/bash if [ condition1 ];then content1 elif [ condition2 ] then content2 fi
case
-
基本语法:
case $变量名 in value)
格式,;;
case结尾,类似break;*)
代表default分支;esac
结尾;#!/bin/bash case $1 in 1) content1 ;; 2) content2 ;; 3) content3 ;; *) content4 ;; esac
for
-
基本语法1:
for((初始值;循环控制条件;变量变化))
格式;do
方法体;done
结尾;具体累加1-100的和:#!/bin/bash s=0 for((i=1;i<=100;i++)) do s=$[$s+$i] done echo $s
-
基本语法2:
for 变量 in value1 value2 value3
格式;$@
区分处理每个入参,$*
入参为整体进行处理#!/bin.bash for i in "$*" do echo "ceshi * $*" done for j in "$@" do echo "ceshi @ $@" done
bash ceshi.sh zs ls
输出结果为:
ceshi * zs ls
ceshi @ zs
ceshi @ ls
while
-
基本语法:
while [ condition ]
格式;do
方法体;done
结尾;具体累加1-100的和:#!/bin/bash s=0 i=0 while [ $i -le 100] do s=$[$s+$i] i=$[$i+1] done
Read读取控制台输入
-
基本语法:
read(选项)(参数)
- 选项
-p
,指定读取值时的提示符-t
,指定读取值时等待的时间(秒)
- 参数
- 变量:指定读取值的变量名
- 选项
-
举例:七秒内在控制台上输入name
#!/bin/bash read -t 7 -p "input your name in 7 seconds" name echo $name
函数
系统函数
basename [string/pathname][suffix]
,截取指定路径下的文件名称dirname 文件绝对路径
,从给定包含绝对路径的文件名中取出文件的所在路径
自定义函数
-
基本语法
// 声明函数 function funname[()]{ action; [return int;] } funname // 执行函数
Shell工具
cut命令
-
从文件的每一行剪切字节、字符和字段,并将这些字节、字符、字段输出。
-
基本用法
-
cut [选项参数] filename
-
选项参数
-f
,列号,提取第几列-d
,分隔符,按照指定分隔符分割列,默认分割符为制表符\t
-
举例:以空格为分割符,切割文件内容第二列及以后内容输出
cut -d " " -f 2- cut.txt
-
sed
-
流编辑器,一次处理一行内容。处理行内容时,把当前的行内容存储在临时缓存区中,称为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后将内容输出。接着处理下一行,直到文末末尾。
-
基本用法
-
sed [选项参数] "命令功能" filename
-
选项参数
-e
,直接在指定列模式上进行sed的动作编辑
-
命令功能(常用)
a
,新增d
,删除s
,查找并替换
-
举例:
-
在文件第二行添加内容:add content
sed "2a add contend" filename
-
删除文件中包含wo的行
sed "/wo/d" filename
-
用ni替换文件中的wo
sed "s/wo/ni/g" filename
,g
代表全局替换 -
删除文件第二行并用ni替换文件中的wo
sed -e "2d" -e "s/wo/ni/g" filename
-
-
awk
-
文本分析工具,把文件逐行读入,默认以空格为分隔符将每行切片,切开的部分可在进行分析处理。
-
基本用法:
awk [选项参数] 'pattern1{action1} pattern2{action2} ...' filename
;pattern
匹配正则表达式;action
匹配内容符合时所执行的命令。-
选项参数
-F
,指定输入文件分隔符-v
,复制一个用户定义变量
-
内置变量
FILENAME
,文件名NR
,已读记录数NF
,浏览记录的域的个数(切割后,列的个数)
-
举例:搜索文件以root开头的所有行,并输出该行的第七列
awk -F : '/^root/{print $7}' filename
-
sort
-
文件排序,并按照排序结果标准输出
-
基本用法
-
sort(选项)(参数)
-
选项
-
-n
,按照数值大小排序 -
-r
,以相反的顺序排序 -
-t
,设置排序的所用分割字符 -
-k
,指定需要排序的列 -
参数
- 指定待排序的文件列表
-
举例:文件按照冒号分割,第三列倒序排序
sort -t : -nrk 3 filename
-
-