sheel script
shell脚本语法规范
如何书写一个shell脚本
-
文件没有扩展名的概念,最好以.sh结尾,最好在30个字符以内
-
#代表注释,#!是特例,定义脚本在哪个路径运行
-
脚本的说明字段
- 运行解析路径#!/bin/bash
- 作者#Author:guying
- 时间#Created Time
- 版本号#Release:1.0
- 脚本描述#Script Description:nginx install script
- 如何自动生成???
-
脚本组成
- #解释环境:例如#!/user/bin/env或者bash |python|perl
- #注释说明
- #执行代码
-
如何运行一个shell脚本
- 给执行权限 ./文件名
- 解释器直接运行,不需要给权限 bash 文件名
- 解释环境有很多种,例如bash sh ,用cat /etc/shells查看
-
shell中的特殊符号
- ~ 代表家目录,# cd ~
- ! 执行历史命令 !!执行上一条命令
- $ 变量中取内容符
-
-
-
- % 对应数学运算,加减乘除取余数
-
-
- & 后台执行
-
- shell中的通配符 匹配所有
- ? shell中的通配符 ,匹配除了回车键以外的一个字符
- ; 分号可以在shell中一行执行多个命令,命令之间用分号分隔
- | 管道
- \ 转义字符
反引号 ,命令中执行命令 echo ”today is
date+%F
“- ’ ’ 单引号,脚本中字符要用单引号引起来,但是不同于双引号的是,单引号不解释变量
- " " 双引号,脚本中出现的字符串可以用双引号引起来
-
shell在管道中的应用
- 用于拼接命令,通过管道可以执行一些复杂的数据处理操作
shell中的运算
-
算术运算(四则运算)
-
-
-
- % 对应数学运算,加减乘除取余数
-
-
运算命令
-
整形运算
- -expr只能做整数运算
- -let只能做整数运算,而且运算元素必须是变量,无法直接对整数做运算let sum=1+1
- -$(( ))双小圆括号里也可以做数学运算
- -bc计算器
-
-
浮点运算
- -bc采用命令组合的方式实现,echo “scale=N;数学表达式”|bc,例如echo ”scale=2;100*3“|bc
-
-
-
比较运算
-
整形比较运算
-
精确比较
- -eq等于
- -gt大于
- -lt小于
-
模糊比较
- -ge大于或等于
- -le小于或等于
- -ne不等于
-
-
-
字符串比较运算
- =等于返回true
- ! =不等于返回ture
- -n 检查字符串的长度是否大于0,不为0返回true
-
- z 检查字符串的长度是否为0,为0返回true
- $ 检测字符串是否为空,不为空就返回true
-
逻辑运算
-
使用场景
- 多条件同时判断
-
逻辑运算符
- && 真真为假、真假为假、假假为假
- || 真真为真、真假为真、假假为假
- ! 非假为真、非真为假
-
逻辑与或的短路运算
- 逻辑与中靠前的条件中出现了假,后面的就不再判断了,因为已经是假的了
- 逻辑或中靠前的条件中出现了真后面的就不再往后判断了,结果已经为真了
-
-
文件判断(文件类型、权限、新旧判断)
-
test判断命令
-
检测文件类型和比较运算
-
teat [命令选项] 表达式
-
命令选项
- -d 检查文件是否存在且为目录,若存在且为目录则为真
- -e 检查文件是否存在,存在则为真
- -f 检查文件是否存在且为文件,若存在且为文件则为真
- -r 检查文件是否存在且可读
- -s 检查文件是否存在且不为空, 如果文件存在且至少有一个字符则为真
- -w 检查文件是否存在且可写,可写则为真
- -x 检查文件是否存在且可执行,可执行则为真
- -O 检查文件是否存在且被当前用户拥有
- -G 检查文件是否存在且默认组为当前用户组
- -nt file1 -nt file2检查file1是否比file2新
- -nt file1 -ot file2检查file1是否比file2旧
- -ef file1 -ef file2检查file1和file2是否为同一个文件,判断依据的是i节点
- -b 检查文件是否为块设备文件,若文件存在且为块文件则为真
- -c 检查文件是否为字符设备文件,如果文件存在且为字符特殊文件则为真
- -g 检测文件是否设置了SGID位
- -k 检测文件是否设置了
-
-
-
-
布尔运算符
-
!
- 非
-
-o
- 或
-
-a
- 与
-
脚本的运行和退出
- 运行
- bash 文件名
- 退出
- exit NUM推出脚本,释放系统资源,NUM代表一个整数,代表返回值。
为脚本设置可执行权限,并执行脚本
-
$ chmod +x test.sh
-
$ ./test.sh 1 2 3
- 输出第1、2、3个参数
格式化输出
echo命令
-
在显示器上显示一段文字
-
echo [-ne] [字符串]
-
命令选项
- -n 不要在最后自动换行
- -e 若字符串中出现以下的字符,则特别加以处理,而不会将它当成一般文字输出。
-
转义字符
- \b 删除前一个字符
- \c 最后不加上换行符号
- \n 换行且光标移至行首
- \t 插入tab符号
- \f 换行但是光标仍旧停留在原来的位置
shell的基本输入、输出
read命令 读取
-
命令选项
- -p打印信息
- -t限定时间
- -s不回显
- -n 输入字符个数
echo命令
-
显示普通字符串的时候,双引号可以省略
-
显示转义字符
-
echo “”\我是古颖"" 结果为"我是古颖"
- 双引号也可以省略
-
-
显示变量
- read name
- echo “$name It is a test”
-
显示换行
- echo -e “OK! \n” # -e 开启转义
-
显示不换行
- echo -e “OK! \c” # -e 开启转义 \c 不换行
-
显示结果定向至文件
- echo “It is a test” > myfile
-
原样输出字符串,不进行转义或取变量(用单引号)
- echo ‘$name"’
-
显示命令执行结果
- echo
date
这里是单引号
- echo
printf命令
-
语法:printf format-string [arguments…]
- format-string: 为格式控制字符串
- arguments: 为参数列表
-
格式替代符
-
%s
- 输出一个字符串
-
%c
- 输出一个字符
-
%d
- 整形输出
-
%f
- 输出实数
-
%-10s
- 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
-
%-4.2f
- 指格式化为小数,其中 .2 指保留2位小数。
-
-
printf的转义序列
shell字符串
单引号
- 单引号里的任何字符都会原样输出,单引号中的变量是无效的
- 单引号内的字符串中不能出现单独一个的单引号,可成对出现,对单引号使用转义字符后也不行
双引号
- 双引号中可以有变量
- 双引号中可以出现转义字符
拼接字符串
- 使用双引号拼接!!!
string=“guying is so beautiful”
-
获取字符串长度
- echo $(#string) 输出为4
-
提取子字符串
-
从字符串第二个字符开始截取4个字符
- echo ${string:1:4} 输出为 uyin
-
-
查找子字符串
-
查找字符i或g的位置(哪个字母先出现,就计算哪个)
-
echo
expr index "$string" ig
输出为1- 注意
是反引号
- 注意
-
-
shell数组
定义数组
-
用括号表示数组,数组元素用空格符号分开
-
array_name=(value0 value 1 value2)
-
或者单独定义数组的各个分量:
- array_name[0]=value0
-
读取数据
-
读取元素值
-
${数组名[下标]}
- valuen=${array_name[n]}
-
-
使用@获取数组的所有元素
- echo ${array_name[@]}
获取数组的长度(与获取字符串的方法相同)
-
获取数组元素的个数
- length=$(#array_name[@]}
- 或者length=${#array_name[*]}
-
获取数组单个元素的长度
- length=${#array_name[n]}
shell注释
#开头就是注释,除#!
多行注释
- :<<EOF
- 中间是注释内容
- EOF
shell传递参数
-
∗ 和 *和 ∗和@的区别
-
相同
- 都是引用的所有参数
-
不同
- 只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)
-
shell流程控制
if else
-
语法格式
- if then elif then else fi(换行写)
- if then else fi
- if then fi
for循环
-
语法格式
- for
- do
- done
while循环
-
用于不断执行一系列命令,也用于从输入文件中读取数据
-
语法格式
- while
- do
- done
until循环
-
执行一系列命令直至条件为 true 时停止,与 while 循环在处理方式上刚好相反
-
语法格式
- untiil
- do
- done
多选择语句case•••esac
- 每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句
跳出循环
-
break命令
- 跳出所有循环(终止执行后面的所有循环)
-
continue命令
- 仅仅跳出当前循环
shell函数
可以带function fun() 定义,也可以直接fun() 定义,不带任何参数
函数参数
- $1 为第一个参数
- $2为第二个参数
shell输入输出重定向
重定向命令列表
输出重定向
-
command1 > file1
- 执行command1然后将输出的内容存入file1。
输入重定向
-
command1 < file1
- 从键盘获取输入的命令会转移到文件读取内容
shell文件包含
. filename # 注意点号(.)和文件名中间有一空格
或source filename
创建两个脚本,test1.sh和test2.sh,当test2.sh包含test1.sh,执行test2.sh时,需要给test2.sh添加可执行权限,被包含的test1.sh不需要添加可执行权限
- $ chmod +x test2.sh
- $ ./test2.sh
XMind: ZEN - Trial Version