脚本首行写上 [#! /bin/bash # 规定俗成的标记,表明该文件是一个shell脚本]
脚本文件后缀.sh
bash指令 : 可以创建一个子进程
shell 变量
运行方式:
1、~$ bash [文件名] # 解释器执行
2、作为可执行文件
1) chmod(缩写:changemod) +x [文件名] # 使脚本具有可执行权限
2) ./文件名 # 当前路径执行
~/文件名 # 家目录路径下执行
/home/acs/文件名 # 绝对路径执行
单行注释 : # [注释内容]
多行注释 : :<<EOF
第一行注释
第二行注释
第三航注释
EOF 至此注释结束(EOF可以换成任意字符串,格式符合既可)
定义变量 变量名 = '字符串内容' # 内容只输出,不执行不取值,如$name、\只能原样输出
变量名 = "字符串内容" # 内容可取值可执行,如$name、\是输出name中的内容和转义
变量名 = 字符串内容 # == ""
以上三者等价
变量名a = [内容]
readonly 变量名a
declare -r 变量名a
二者均将变量声明为只读变量,不可改变其值
type [命令名] : 查看命令属于哪种类型
使用变量应加上$或者${}({}可选,主要目的是区分变量边界)
echo [输出内容] : 输出内容
echo $变量名 : 输出变量中的内容
echo $[变量名a]\${[变量名a]}[字符串b] : 输出a和b
echo ${变量名:num1:num2} : 取出变量中num1到num2,等同于c++中的substr
echo -e(开启转义) "\n" : 输出换行
echo [输出内容] > [文件名].[后缀] : 将显示结果定向输出到文件
echo `[命令]` : 显示命令的标准输出(主要是``的作用)
unset [变量名] : 删除对应变量
${#变量名} : 取变量中字符串的长度
变量类型
1、自定义变量(局部变量)
子进程不能访问的变量
2、环境变量(全局变量)
子进程可以访问的变量
自定义变量改成环境变量:
变量名 = [内容] # 自定义变量
1) export 变量名 # 改变方法1
2) declare -x 变量名 # 改变方法2
环境变量改成自定义变量
1) export [变量名] # 定义环境变量
2) declare +x 变量名 # 改成自定义变量,注意与上一个declare -x的区别
shell默认变量
在执行shell脚本时传递参数
$0是包含路径的文件名
$1参数1
$2参数2
...${10}参数10...依次类推
传参方式:
[运行脚本] [参数1] [参数2] ...
$# : 传入参数的个数
$* : 由所有参数构成的空格隔开的字符串
$@ : 每个参数单独构成字符串且两两之间空格隔开
$$ : 当前脚本的运行进程ID
$? : 上一条命令的退出状态,0表示正常退出,其他数字表示退出异常
$(command) : 返回command这条命令的stdout(输出结果)
`(command)` : 返回command这条命令的stdout(输出结果)
数组
1、下标从零开始
2、可以存放多种不同类型的数值
2、初始化时不用指定大小
4、只支持一维数组
5、数组用小括号表示,元素用空格隔开,也可以直接指明下标为i的元素的值
${array[index]} : 取数组中元素的值
${array[*]} \ ${array[@]} : 读取整个数组
${#array[*]} \ ${#array[@]} : 读取数组的实际长度
expr(ssion)命令
expr 表达式 求表达式的值
表达式要求:
1、空格隔开每一项
2、\放在shell的特殊字符前面(运行错误可尝试转义)
3、对包含空格和其他特殊字符的字符串要用括号括起来
4、expr会在stdout中输出结果
5、支持算术操作,算术表达式优先级低于字符串表达式高于逻辑关系表达式
6、可以用()表示优先级,但是需要用\进行转义
+ - * % / 两端参数会转换成整数,转换失败则报错
()表示优先级需要进行转义
length string : 返回string长度
index string charset : charset中最早出现在string中的位置,下标从1开始,没有则返回0
sbustr string position length : 返回string中从position开始长度最大为length的子串
如果position、length为0、负数、非数值,返回空串
逻辑关系表达式
1、 | 第一个参数非空且非0返回第一个参数的值,否则返回第二个参数的值(同样要求非空且非0)
第一个参数非空且非0则不会返回第二个参数
2、 & 两个参数都非0或非空则返回第一个参数的值,否则返回0,
第一个参数为0或空时不会计算第二个参数
3、 < <= = ==(等于 '=') >= > : (使用时需要转义或者放在''内)比较两端的参数,
如果为true则返回1,否则返回0,比较前会
先将两段化为整数表达式进行比较,如果转化失败则用字符集
顺序规则进行比较
read 命令
用于从标准输入中读取单行数据,读到文件结束符返回0,否则返回1
read [] : 接收输入的[]
read -p [] : 后面可以接收提示信息(向终端输出提示信息)
read -t [second] [] : -t + 秒数表示命令的等待时间,
超过时间没有得到响应则执行下一条指令
test命令和判断符号[]
用于判断文件类型和变量比较
test命令用 exitcode返回结果,0表示真非0表示假
test -e filename 判断文件是否存在
test -f [] : 判断是否为文件
test -d [] : 判断是否为目录
test -r [文件名] : 判断文件是否可读
test -w [文件名] : 判断文件是否可写
test -x [文件名] : 判断文件是否当前用户可执行
test -s [文件名] : 判断文件是否非空
test &a -eq &b : 判断两数是否想等
test &a -ne &b : a是否不等于b
test &a -gt &b : a是否大于b
test &a -lt &b : a是否小于b
test &a -ge &b : a是否大于等于b
test &a -le &b : a是否小于等于b
test str1 ==(!=) str1 : 判断字符串是否相等
test -z string : 判断string是否为空,如果是则返回true
test -n string : 判断数字是否为非空,如果非空则返回true
test -r filename -a -x filename : 两条件是否同时成立(可用!取反)
test -r filename -r -x filename : 两条件是否同时存在一个(可用!取反)
[]的用法与test几乎一样,变量最好用""隔起来,常数最好用''或者""括起来
判断语句
if...then语句
if condition(判断condition的`exitcode`)
then
语句1
语句2
...
fi
if condition
then
语句块
else
语句块
fi
if condition
then
语句块
elif condition
语句块
elif condition
then
语句块
else
语句块
fi
switch case
case #变量名称 in
值1)
语句1
语句2
;; # 类似c++的break
值2)
语句1
语句2
...
;;
*) # 类似于c++的defualt
语句1
语句2
...
;;
esac
循环语句
seq 1 10 : 返回用回车隔开的1到10
for [var] in {0...10}\{a...z} : 遍历1到10或者a到z
for ((expression1; expression2; expression)) do ... done : 同c++
for [变量名] in [值1] [值2] [值3]...do...done
while condition do ... done(执行到condition为假)
until condition do ... done (执行到condition为真)
;; : 同break,但是不能跳出case语句
continue : 同c++
函数
shell函数与c/c++基本类似,但是shell函数返回的是exitcode,为0-255,0为正常返回
获取函数输出的内容可以用echo输出到stdout中,并用${func}或者`func`查看
函数体中不写return默认return0
函数基本格式:
[函数名] (){
函数体
}
函数调用方式:
直接在脚本中写上函数名
参数传递直接在调用函数时写在括号里
在函数中调用$0表示文件名 $1第一个参数 $2第二个参数 $3第三个参数
局部变量
可以在函数内定义,作用范围仅在当前函数内
local 变量名 = 变量值
exit命令
使用exit退出当前shell并返回一个退出状态,可以用$?查询这个状态
exit可以接受一个整数作为参数,如果没有接收整数则默认为0
exit只能返回一个0-255的数字,0表示成功其他数字表示失败
文件重定向
每个进程默认打开三个文件
*[stdin] : 标准输入,从命令行读取数据,文件描述符为0
*[stdout] : 向命令行输出数据,命令描述符为1
*[stderr] : 向命令行输出数据,文件描述符为2
可用文件重定向将这三个文件重定向到其他文件当中
command > file : 将stdout重定向到file中
command < file : 将stdin重定向到file中
command >> file : 将stdout以追加的方式重定向到file中
command n> file : 将文件描述符n重定向到file中
commanf n>> file : 将文件描述符n重定向到file中
可以同时重定向输入和输出
引入外部脚本
类似c++中的引入头文件,bash也可以引入其他文件中的代码
操作:
. filename # .后面有一个空格
source filename
死循环处理方式
printf fromat_string [aguments] : 格式化输出 (printf “%10d\n” 123) # 占十位右对齐
(printf “-%10d” 123) # 占十位右对齐