shell 脚本格式
后缀
以 .sh 结尾
首行设置
设置解析器 #!/bin/bash
注释格式
单行注释 #…
多行注释 :<<!
…
…
! 感叹号可以替换为任意符号
常用3种执行方式
1、sh : sh 脚本文件
2、bash : bash 脚本文件
3、仅路径执行: ./脚本文件 需要脚本文件具有可执行权限
shell变量
系统环境变量
通过加载shell配置文件加载到系统中
1、全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
2、用户配置文件
用户/.bash_profile
用户/.bashrc
查看系统环境变量
env 查看系统环境变量
set 查看系统环境变量+自定义变量+函数
创建系统环境变量
1、在/etc/profile文件中追加命令声明变量:export var=value
2、重载文件 source /etc/profile
常用系统环境变量
自定义变量
自定义局部变量
范围:脚本文件中定义
语法:var_name=value
规范:1、数字、字母、下划线、不能使用数字开头
2、等号两侧不能有空格
3、默认都是字符串类型,不能直接运算
4、变量值有空格,变量要用双引号括起来
5、不能使用shell的关键字
自定义常量
语法 :readonly var_name
作用:变量值不可以改动
自定义全局变量
父子shell:在父shell脚本中调用的shell脚本为子shell
在父shell中定义全局变量,可在子shell中调用
语法:export var_name
自定义变量的操作
删除语法: unset var_name
使用:
1、 $ var_name
2、$ {var_name} 适合字符串去拼接
特殊变量
$n
语意: $n: n-> 1~9 表示shell脚本接收的1 ~ 9 的参数,
n>9, 获取参数方式为 ** ${n}**
n=0, $0 为当前脚本名
传参: sh 脚本 n1 n2 n3 …
$#
语义:获取参数个数
$ *、$@
语义:获取所有参数,但格式不同
$ *:拼接为一个参数
$@:得到一组参数,可以循环遍历
$?
语义:获取上一个shell命令的返回值,或函数的返回值
返回0 ->执行成功
返回 非0->执行失败
$$
语义获取当前shell环境ID号
shell 环境变量深入:加载流程原理介绍
shell工作环境
用户进入linux系统时会加载全局配置文件和用户配置文件
shell工作环境分类
是否交互
交互式shell :输入命令,shell立刻反应
非交互式shell:不需要用户参与
是否登录
shell登陆环境:需要用户名和密码
shell非登录环境:不需要用户名和密码
加载系统环境变量的顺序不同
识别shell环境
shell登陆环境执行脚本文件
语法: sh/bash -l/–login 脚本文件
shell非登陆环境执行脚本文件
语法:
bash #加载shell非登录环境
sh/bash 脚本文件 #直接执行脚本文件
不同环境加载的变量不同
识别登录环境
echo $0 输出bash 非登录环境 输出-bash 登陆环境
切换shell环境
1、直接登录加载shell环境:shell登录环境
2、su切换用户加载shell登录与非登录环境
shell登录环境:切换到指定用户的登录环境
语法:su 用户名 --login
su 用户名 -l
shell非登录环境:切换到指定用户的非登陆环境
语法:su 用户名
3、bash 加载shell登录与非登录环境
shell字符串变量
字符串的三种格式
1、单引号 :原样输出,字符串拼接无效,转义字符无效,不解析变量
2、双引号 :可以使用转义字符,可以字符串拼接,可以包含子双引号 推荐
3、不用引号 :与双引号类似,但是字符串不能包含空格
获取字符串长度
语法:${#字符串变量名}
字符串拼接
1、无符号拼接
2、双引号拼接 推荐
3、混合拼接
字符串截取
shell数组
数组定义
shell只支持一维的数组
语法:方式一 array=(v1 v2 v3…)
方式二 array=([index1]=v1 [index2]=v2…) #指定下标
数组的获取
1、通过下标获取元素值,index从0开始
${arr[index]}
2、获取值并赋给其他变量
3、获取数组中的所有元素
${arr[@]}
${arr[]}
4、获取数组的长度或个数
${#arr[@]}
${#arr[]}
5、获取指定元素的长度
${#arr[index]}
数组的拼接
arr3=(${arr1[@]} ${arr2[@]})
数组的删除
unset arr[index] 删除指定索引元素,删除后该位置元素为空
unset arr 删除数组
shell 内置命令
判断是内置命令还是脚本命令
type 命令
内置命令在内存中,执行快
alias
语义:设置别名
语法:alias 展示所有别名
alias 别名=“命令”
unalias 别名 ======>删除别名
unalias -a ======>删除当前shell的所有别名
echo
语义:输出字符串,默认在最后添加换行
语法:echo 字符串
echo -n 字符串 不换行
echo -e 字符串 解析字符串的转义字符 ,如 \n \c->清楚默认的换行符
read
语义:读取控制台输入
语法:read [-options] [var1 var2 var3…] option和var可选,当省略时读入的值赋值给环境变量 REPLY中
-options
exit
语义:退出当前shell环境,结束运行,并返回状态码
语法:exit 返回0,表示正确退出
exit 非零数字 返回设置的数字,表示错误状态退出
declear
用法
1、声明shell变量,并设置变量属性
2、显示shell 函数
3、设置关联数组
参数
关联数组
语义:key-value 相当于java中的map
语法:
定义 declear -A arrname=([“key”]=value…)
获取 ${arr[“key”]}
test
语义:可以对整数、字符、和文件进行检测,功能与 [ ]一样
语法:
if test n1 option n2
then
…
option 参见 [ ]中使用的比较运算符
shell 运算符
算数运算符
expr
语法:expr 算数运算符表达式
result=·expr 表达式· *反引号包裹 表达式要有空格 ,不能算小数,括号要转义
比较运算符
整数比较
两侧有空格
字符串比较
介绍:比较两个变量,可以为整数、小数、字符串,注意两侧空格
语法:
1、[[ ]]
2、[ ]
单括号和双括号的区别 :
双方括号 大于小于号不用转义
双方括号不会分割字符串
布尔运算符
逻辑运算符常常和test命令一起使用,布尔运算符在单括号中才生效
逻辑运算符
支持双括号,方括号和圆括号都可
! 逻辑非 [[ ! 表达式 ]]
文件测试运算符
shell计算命令
expr
1、整数计算
2、字符串操作
expr对字符串的操作
语法:
expr length string 获取长度
expr substr string start end 截取字符串
expr index 主串 子串 获取字串位置,返回字串第一个字符出现的位置
expr match string 正则表达式 匹配正则表达式
expr string : 正则表达式 匹配正则表达式
((表达式))
对整数进行操作
let
let只用于赋值计算,不能直接输出,不能条件判断.
最简洁的整数运算赋值方法
let 表达式1 空格 表达式2
$[]
于let、(())类似,但是只能对单个表达式求值输出
用法: $[表达式] ,表达式内部不能赋值
整数计算小结
bc(计算器工具)
介绍
语法
参数可以为包含表达式的文件
内置变量
内置函数
使用bc
1、互动式
2、非互动式的管道计算
shell脚本中使用管道使用bc
直接进行表达式计算
echo " expression" | bc [option]
expression:
要符合bc要求的格式
可以使用shell变量
给变量赋值的两种方法
3、非互动式输入重定向运算
将表达式输出给bc执行
反引号和$()都可以
流程控制
if
语法:
1、if
if 条件
then
命令
fi
一行写法
if 条件;then 命令;fi
2、if else
if 条件
then
命令
else
命令
fi
3、if elif else
if 条件1
then
命令
elif 条件2
then 命令
elif 条件3
then
命令
…
else
命令
fi
case
cash value in
匹配模式1) ===>匹配模式支持简单的正则 这四种 * [abc] [m-r] |
命令1
命令2
……
;; =====>注意结尾的冒号
匹配模式2)
命令1
命令2
……
;;
…
…
…
匹配模式*) ===>都不匹配时,默认执行
命令1
命令2
……
;;
esac
while
while 条件
do
command1
command2
...
continue;
break;
done
until
条件为false进入循环,条件为true停止循环
#语法
until condition
do
command
done
for
三种循环方式
方式一
for var in item1 item2 ...itemN
do
command1
command2
...
done
#可以写为一行
方式二
#在范围 start到end中循环
for var in {start..end}
do
command
...
done
方式三
#与其他语言写法类似
for((i=start;i<=end;i++ ))
do
command
...
done
select
shell独有的语法,可以增强交互性,显示出带编号的菜单,输入不同编号就可以选择不同菜单,执行不同的功能
select 是无限死循环,遇到break语句或者 ctrl+d 才会结束循环
执行过程中终端会输出 #? 代表可以输入的菜单编号
常与case in 配合使用
select var in emnu1 emnu2...
do
command
done
shell函数
系统函数
basename 获取文件名函数
basename [string/pathname] [suffix]
#suffix:去掉指定后缀
dirname 从指定的文件绝对路径去除文件名,返回剩下的前缀目录路径
dirname 文件绝对路径
自定义函数
语法
#定义函数
[function] funname(){
command
[return 返回值] #指定返回值,则可以用$? 获取返回值,不指定返回值,则自动返回执行状态
}
#调用
funname 参数1 参数2 .... #参数的使用和shell使用参数相同 $n
shell程序和函数区别
函数会在当前shell中运行
shell程序会打开一个子shell
shell 重定向输入/输出
标准输入 键盘
标准输出 屏幕
默认输入输出文件 stdin 0 stdout 1 stderr 2 ==>临时文件
重定向:改变标准输入和标准输出的位置
重定向语法
wc命令