1.shell解析器
cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
2.查看默认解析器
echo $SHELL
3.脚本格式
脚本以#!/bin/bash开头,指定解析器
#新建一个shell文件
touch helloworld.sh
#编辑脚本
vim helloworld.sh
#查看脚本
[root@iZ2zeaps6av1mswsp60vttZ test]# cat helloworld.sh
#!/bin/bash
echo "hello world"
#执行脚本
[root@iZ2zeaps6av1mswsp60vttZ test]# bash helloworld.sh
hello world
4.多命令处理
需求#在/test建立一个文件1.txt,在1.txt文件中增加“I love you”
#新建文件
touch batch.sh
#编辑文件
[root@iZ2zeaps6av1mswsp60vttZ test]# vim batch.sh
查看文件
[root@iZ2zeaps6av1mswsp60vttZ test]# cat batch.sh
#!/bin/bash
#在/test建立一个文件1.txt,在1.txt文件中增加“I love you”
cd /test
touch 1.txt
echo "I love you" >> 1.txt
#执行文件
[root@iZ2zeaps6av1mswsp60vttZ test]# bash batch.sh
[root@iZ2zeaps6av1mswsp60vttZ test]# ls
1.txt batch.sh helloworld.sh
[root@iZ2zeaps6av1mswsp60vttZ test]# cat 1.txt
I love you
5.系统变量
5.1常用系统变量
H O M E , HOME,HOME,PWD,$SHELL $USER
5.2显示当前shell中所有变量:set
5.3定义变量A=3
撤销变量unset
声明静态变量readonly
默认变量为字符型吗,无法直接进行数值运算
可把变量提升为全局环境变量:export 变量名
6.特殊变量$n
$0:代表该脚本名称
$1-$9:代表第一到你九个参数
$#:获取参数的个数,常用于循环
∗ : 这 个 变 量 命 令 行 中 所 有 的 参 数 , *:这个变量命令行中所有的参数,∗:这个变量命令行中所有的参数,*把所有的参数看成一个整体
@ : 这 个 变 量 也 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @:这个变量也代表命令行中所有的参数,不过@:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待
$?:最后一次执行命令的返回状态,如果这个变量的值为0,证明上次执行的命令正确,若为
非0,证明上一次命令执行不正确
例子:
vim parameter.sh
[root@iZ2zeaps6av1mswsp60vttZ test]# bash parameter.sh I
parameter.sh I
I
I
[root@iZ2zeaps6av1mswsp60vttZ test]# bash parameter.sh I love you
parameter.sh I love
I love you
I love you
7.运算符
7.1基本语法:( ( 运 算 式 ) ) 或 者 ((运算式))或者((运算式))或者[运算式]
$((2+3))
-bash: 5: command not found
[root@iZ2zeaps6av1mswsp60vttZ test]# echo $?
[root@iZ2zeaps6av1mswsp60vttZ test]# echo $((2+3))
[root@iZ2zeaps6av1mswsp60vttZ test]# echo $[2+3]
.2expr +,-,*,/,% 加减乘除取余,expr 运算符间要有空格
expr 2 + 3
5
echo $[(2+3)*4]
20
expr `expr 2 + 3`\*4
5*4
8.条件判断:
8.1基本语法:
[condition] (注意condition前后要有空格),条件非空为true
8.2常用判断条件
1)两个整数之间比较
= 字符串比较
-lt小于 -le小于等于
-eq等于 -gt 大于
-ge 大于等于 -ne不等于
2)按照文件权限进行判断
-r 有读的权限 -w有写的权限
-x 有执行的权限
3)按照文件类型进行判断
-f文件存在并且是一个常规文件
-e文件存在
-d文件目录存在并是一个目录
4)多条件判断(&&表示前一条命令执行成功,才执行后一条命令
|| 表示上一条命令执行失败才执行下一条命令)
示例:
vi condition.sh
#!/bin/bash
#23是否大于等于22
[ 23 -ge 22 ]
#判断helloworld是否具有写权限
echo $?
[ -w helloworld.sh ]
echo $?
#判断/test/parameter是否存在
-e /test/parameter.sh ]
echo $?
9.控制流程
9.1 if判断
if [条件判断式];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
例子:
[root@iZ2zeaps6av1mswsp60vttZ test]# cat if.sh
#!/bin/bash
if [ $1 -eq "1" ]
then
echo "你真帅"
elif [ $1 -eq "2" ]
then
echo "你真美"
fi
bash if.sh 1
你真帅
[root@iZ2zeaps6av1mswsp60vttZ test]# bash if.sh 2
你真美
9.2case
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
省略其他分支
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
例子:
[root@iZ2zeaps6av1mswsp60vttZ test]# touch case.sh
[root@iZ2zeaps6av1mswsp60vttZ test]# vim case.sh
[root@iZ2zeaps6av1mswsp60vttZ test]# bash case.sh 1
morning
[root@iZ2zeaps6av1mswsp60vttZ test]# bash case.sh 2
afternoon
[root@iZ2zeaps6av1mswsp60vttZ test]# bash case.sh 3
evening
[root@iZ2zeaps6av1mswsp60vttZ test]# bash case.sh 4
no answer
[root@iZ2zeaps6av1mswsp60vttZ test]# cat case.sh
case $1 in
"1")
echo "morning"
;;
"2")
echo "afternoon"
;;
"3")
echo "evening"
;;
*)
echo "no answer"
;;
esac
9.3 for 循环
语法1:
for((初始值;循环控制条件;变量变化))
do
程序
done
实例:从1加到100
bash for.sh
5050
[root@iZ2zeaps6av1mswsp60vttZ test]# cat for.sh
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
语法2:for 变量 in 值1 值2 值3…
do
程序
done
实例:
#!/bin/bash
for i in $*
do
echo "$i"
done
9.4while循环
语法:
while [ 条件判断式 ]
do
程序
done
vim while.sh
[root@iZ2zeaps6av1mswsp60vttZ test]# cat while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
[root@iZ2zeaps6av1mswsp60vttZ test]# bash while.sh
5050
10.read读取控制
台输入
基本语法:
read(选项)(参数)
选项:-p :指定读取值时的提示符
-t:指定读取等待的时间
参数:指定读取的变量名
bash read.sh
enter youe name in 7 seconds12
12
[root@iZ2zeaps6av1mswsp60vttZ test]# cat read.sh
#!/bin/bash
read -t 7 -p “enter youe name in 7 seconds” NAME
echo $NAME
11.函数
11.1系统函数
basename的基本语法:basename [string/pathname][suffix]
功能:basename命令会删掉所有的前缀包括最后一个(“/”)字符,然后将字符串显示出来
例子:
basename /test/parameter.sh .sh
parameter
11.2firname基本语法
dirname文件绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名,然后返回剩下的路径
实例:
dirname /test/parameter.sh
/test
11.3自定义函数
基本语法:
[ function ] function[()]
{
Action;
[return int;]
}
funname
实例:
bash fun.sh
please inout the number1:12
please input the number2:23
35
[root@iZ2zeaps6av1mswsp60vttZ test]# cat fun.sh
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo $s
}
read -p "please inout the number1:" n1;
read -p "please input the number2:" n2;
sum $n1 $n2;
12.shell工具
12.1 cut 负责剪切数据用的,cut命令从文件的每一行剪切字节、字符和字段并将字节、字符和字段输出
用法:cut [选项参数] filename
默认分隔符为制表符
选项参数:
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列
[root@iZ2zeaps6av1mswsp60vttZ test]# cat cut.txt
#!/bin/bash
dong shen
guan zhen
lai lai
le le
[root@iZ2zeaps6av1mswsp60vttZ test]# vim cut.txt
[root@iZ2zeaps6av1mswsp60vttZ test]# cut -d " " -f 1 cut.txt
dong
guan
lai
le
[root@iZ2zeaps6av1mswsp60vttZ test]# cut -d " " -f 2 cut.txt
shen
zhen
lai
le
[root@iZ2zeaps6av1mswsp60vttZ test]# cat cut.txt | grep "guan" | cut -d " " -f 1
guan
12.2 sed,sed是一种流
编辑器,一次处理一行内容
基本语法:
sed[选项参数] ‘command’ filename
选项参数说明:
-e 直接在命令模式进行sed动作编辑
命令功能描述
a 新值,a的后面可以接字符串,在下一行出现
d 删除
s 查找并替换
g表示global,全部替换
touch sed.txt
[root@iZ2zeaps6av1mswsp60vttZ test]# vim sed.txt
[root@iZ2zeaps6av1mswsp60vttZ test]# sed ‘2a mei nv’ sed.txt
dong shen
guan zhen
mei nv
lai lai
le le
[root@iZ2zeaps6av1mswsp60vttZ test]# vim sed.txt
[root@iZ2zeaps6av1mswsp60vttZ test]# sed ‘/wo/d’ sed.txt
dong shen
guan zhen
lai lai
le le
[root@iZ2zeaps6av1mswsp60vttZ test]# sed ‘s/le/liao/g’ sed.txt
dong shen
guan zhen
wo wo
lai lai
liao liao
12.3 awk 一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片
切开的部门再进行分析处理
基本语法:
awk [选项参数] ‘pattern{action1} pattern2{action2}…’ filename
pattern :表示awk在数据中查找的内容,就是模式匹配
action:在找到匹配内容时所执行的一系列命令
-F 指定输入文件拆分分隔符
-v 赋值一个用户定义变量
12.4 sort 文件排序输出,并排序结果标准输出
sort(选项)(参数)
选项:
-n 依照数值的大小排序
-r 以相反的顺序排排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列