shell脚本就是将完成一个任务的所有 的命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。
vim hello.sh
# hello.sh
#!/bin/bash
echo "Hello World!"
chmod 700 hello.sh
./hello.sh
Hello World!
语法规范
基本规范
- 命名:命名要有意义(30个字解决)、以.sh结尾
- 脚本格式:开头指针脚本运行环境,以#!组成(如#!/bin/bash)—解释环境
- 注释:#,最好加入说明字段:Author,Created Time,Script Description—注释说明
给予权限的时候如果在解释环境下可以不给权限
bash hello.sh
特殊符号
- ~:家目录
- !:执行历史命令
- $:变量中取内容符
- &:后台执行
- ;:一行执行多个命令,以此为间隔
- |:管道符
- ``:反引号,命令中执行命令
管道
上一个命令的输出作为下一个命令的输入
shell重定向
> # 重定向输入,覆盖
>> # 重定向输入,追加
< # 重定向输出
<< # 重定向输出,追加输出
<可用来作为命令的option项
<<重定向输出就是当执行文件的时候,有些参数 要我们输入,此时可用(交互)
# 例如磁盘分区
fdisk /dev/sdb << EOF
n
p
3
+534M
w # 保存退出
EOF
格式化输出
echo
参数
- n:不要自动换行
- e:若出现某个字符。特殊处理
- \a:发出警告声
- \c:不换行
- \n:换行且光标移动到行首
- \t:插入tab
- -help:显示版本信息
程序交互
read命令:默认接受键盘的输入,回车符代表输入结束
- p:打印信息
- t:打印时间(超时限制)
- s:不回显
- n:输入字符个数
变量
变量分类:
- 本地变量:用户私有变量,只有本用户可以用,保存在家目录下的.bash_profile,.bashrc文件中
- 全局变量,所有用户都可以使用,保存在etc下的.bash_profile,.bashrc文件中
- 用户自定义变量,脚本中的变量
变量定义:变量名=值
- 命名只能用英文字母,数字或下划线,首个字符不能以数字开头
- 命名不能有空格,可以使用下划线
- 不能使用标点符号
- 不能使用bash里面的关键字
读取变量
echo $name
取消变量
unset name
定义全局变量export
export name="abc"
上面的这些都是临时变量,想要定义永久变量写在配置文件中.bash_prefile,.bashrc
数组
基本数组
# 数组名称=(元素1 元素2...)
数组读出
echo ${(array_name)[index]}
访问数组元素
echo ${(array_name)[@]} # 访问数组所有元素
echo ${#(array_name)[@]} # 统计数组个数
echo ${!(array_name)[@]} # 获取数组元素的索引
echo ${(array_name)[@]:1:2} # 从数组下标1开始,访问两个元素
关联数组
类似于字典,首先得串联数组变量
declare -A array_name
array={[name]='b' [age]='a'}
流程控制语句
运算
数学比较运算
- eq:等于(equal)
- gt:大于(greater)
- lt:小于(less)
- ge:大于或等于(greater or equal)
- le:小于或等于(less or equal)
- ne:不等于(not equal)
文件运算
- d:检查文件是否存在且为目录
- e:检查文件是否存在
- f:检查文件是否存在且为文件
- r:文件是否可读
- s:不为空
- w:是否可写
- x:可执行
- O:是否被当前用户拥有
- G:默认用户组为当前用户组
字符串比较运算
- ==:等于
- !=:不等于
- -n:字符串长度是否大于0
- z:字符串长度是否为0
逻辑运算
- &&
- ||
- !
赋值运算
- =
if语法
单分支语句
if [condition]
then
commands
fi # 结束
双分支语句
if [condition]
then
commands
else
commands
fi # 结束
多分支语句
if [condition]
then
commands
elif [condition]
then
commands
else
commands
fi # 结束
给脚本传参
# shell.sh
$1 $1
# shell
bash shell.sh 1 2
bash shell.sh 3 4
条件符号使用双圆括号,可以直接在条件中植入数学表达式
if ((2%1== 1)); then
commands
使用双方括号,可以在条件中使用通配符
控制语句
for
条件循环
for var in val1 val2
do
commands
done
C语言写法
for ((i=1;i<10;i++))
do
echo i
sleep 1 # 睡眠时间
done
如果是字符串记得转义
如
#!/bin/bash
for var in I love you
do
echo " word: $var "
sleep 1
done
#!/bin/bash
for ((i=1;i<10;i++))
do
echo $i
done
循环控制语句
sleep:循环节奏
continue:跳出本次循环
break:跳出循环
while
条件为真执行,条件为假跳出
while [condition]
do
done
until
条件为假执行,条件为真跳出
#!/bin/bash
read -p "num: " num
until [ $num -eq 5 ]
do
echo "Hello World!"
done
echo "pp"
case多条件分支语句
#!/bin/bash
read -p "num: " num
case $num in
1)
echo $num
;;
2)
echo $num
;;
esac
#!/bin/bash
case $1 in
zmn|ZMN)
echo "yes"
;;
lrn|LRN)
echo "no"
;;
esac
shell特殊变量
- $*:代表所有参数
- $#:代表参数数量
函数
语法
第一种
#函数名() {
# 函数体
# return N
#}
第二种
#function 函数名 {
# 函数体
# return N
#}
例如
#!/bin/bash
start() {
echo "Hello World!"
}
stop() {
echo "ByeBye!"
}
start
stop
正则表达式
定位符
- ^:以什么开头
- $;以什么结尾
^a
c$
匹配符
- .:匹配除了回车以外的任意字符
- ():字符串分组
- []:匹配括号中的一个字符
- [^]:否定括号内的字符
- \:转义字符
限定符
- *:不出现或出现多次
- ?:出现一次或不出现
- +:出现一次或多次,但必须出现一次
- {n,m}:出现最少n次,最多m次
- {n}:正好出现了n次