bash引导与转义
bash中对于一些$&*特殊字符,则需要进行转义 \,原样输出转义符的话需要 \ \
\除了用于转义,还可以表示一些不可打印的字符,如下:
\a 响铃
\b 退格
\n 换行
\r 回车
\t 制表符
如果需要在命令行使用这些不可打印的字符可以将这些字符放在引号中,也可以使用echo -e
如一条命令过长,则可以使用\将命令改写成多行显示
单引号
单引号中特殊字符在内的所有会被转变成普通字符,如果想在单引号中对单引号进行转义,需要在字符串前加上 $
双引号
双引号中仅有$ ` \可以保持其特殊含义,依然会被自动扩展
双引号会保存原始命令的输出格式
here文档
here docment是一种输入多行字符串的方法,多行字符串的文档名称可以任意指定,多行字符串的结束标记必须定格写,否则结束标记无效。
<<token
token
here文档内会发生变量替换,支持\转义,但是文档内不支持通配符扩展,双引号以及单引号也会失去语法作用,仅作为普通字符。如不需要here文档中出现变量替换,可以将开始标记放在单引号之中
here文档的本质是重定向,将字符串重定向输出给某个命令,相当于包含echo命令。所以here字符串只适用于那些可以接收标准输入作为参数的命令,对于其他命令则无效,例如echo命令不用用here文档作为参数
here字符串
here string ,使用<<<表示,作用是将字符串通过标准输入传递给相关命令,如 cat <<< 'halo'
bash变量
bash变量分为环境变量和自定义变量2种类型
环境变量是bash环境自带的变量,可以直接使用,运行env命令或者printenv命令,可以显示所有的环境变量
常用环境变量如下(查看时需要加上$,如echo $HOST):
BASHPID :bash进程的进程ID
BASHOPTS :当前shell的参数,可以用shopt命令修改
DISPLAY :图形环境的显示器名字,通常是:0,表示X Server的第一个显示器
EDITOR :默认的文本编辑器
HOME :用户的主目录
HOST :当前主机的名称
IFS :词语词之间的分隔符,默认为空格
LANG :字符集以及语言编码,比如:zh_CN.UTF-8
PATH :由冒号分开的目录列表,当输入可执行程序名后,会搜索到这个目录列表
PS1 :shell命令提示符
PS2 :输入多行命令时,次要的shell提示符
PWD :当前工作目录
RANDOM :返回一个0-32767之间的随机数
SHELL :shell的名字
SHELLOPTS :启动当前shell的set命令的参数
TERM :终端类型名,即终端仿真器所有的协议
UID :当前用户的ID编号
USER :当前用户的用户名
bash变量名严格区分大小写;查看单个bash环境变量可以使用 printenv HOST 或者echo $HOST( printenv 可以不加$)
自定义变量
自定义变量是用户再使用shell的时候自己定义的变量,仅在当前shell中可以使用,退出当前shell后,自定义变量消失
set命令可以显示所有变量(包括环境变量和自定义变量),以及所有的bash函数
创建变量
用户创建变量的时候,变量名需要遵循以下规则
字母、数字、下划线字符组成
第一个字符必须是一个字符或一个下划线,不能是数字
不允许出现空格和标点符号
变量生命语法 :variable=value 等号左边是变量名,右边是变量值,等号两边不可以有空格,如果变量的值包含空格,则需要将变量值放在单引号或者双引号中,变量值可以在双引号中引用其他变量的值,也可以使用转义符,也可以是其他命令的执行结果或者数学运算的执行结果。
自定义变量可以重复赋值,但是变量值仅以最后一次赋值的内容为准
同一行中如果定义多个变量,需要以 ; 分号隔开
bash没有数据类型的概念,所有的变量值都是字符串
读取变量
读取变量时直接在变量名前加$,若读取的变量不存在时会输出空字符,不会报错。读取变量时也可以使用{},该情况用于变量名与其他字符拼接使用的情况下
如果变量的值本身也是变量的情况下,可以使用 ${!varname}的语法,直接读取最终的值
如果变量中包含连续的空格,制表符或者换行符时 ,变量名需要放在双引号中再读取
删除变量
unset命令用于删除变量(bash的变量读取机制会导致变量再删除之后读取时,仍然可以读取为空字符)
输出变量
用户创建的变量仅可用于当前shell,子shell中无法读取父shell定义的变量,使用export命令可以将父shell的变量传递给子shell,(对于子shell来说父shell设置的变量相当于子shell的环境变量)
export命令传递变量的时候,变量的传递和赋值也可以同时进行;若子shell中修改了继承的父shell的变量,对父shell无影响。
特殊变量
bash提供一些特殊变量这些变量的值由shell提供,用户不可以进行赋值
$?为上一个命令的退出码,用来判断上一个命令是否执行成功,成功返回0,失败则返回非0数字
$$为当前shell的进程ID(可以用来命名临时文件)
$_为上一个命令的最后一个参数
$!为最近一个后台执行的异步命令的进程ID
$0 在命令行直接执行时为当前shell的名称,在脚本中执行时则为脚本名称
$-为当前shell的启动参数
$@为脚本的参数数量
$#为脚本的参数值
变量的默认值
bash 提供4个特殊语法,跟变量的默认值有关,目的是保证变量不为空
${varname:-word}如果变量vername存在且不为空,则返回变量的值,否则返回word,目的是返回一个默认值
${varname:=word}如果变量varname存在且不为空,则返回它的值,否则将它设为word并且返回word,目的是设置变量的默认值
${varname:+word}如果变量名存在且不为空则返回word,否则返回空值,目的是测试变量是否存在
${varname:?message}如果变量varname存在且不为空,则返回它的值,否则打印出varname:message并中断脚本的执行,如果省略了message,则输出默认的信息“paramter null or not set”,目的是防止变量未定义
若该语法出现在脚本中,则可以用数字1-9表示脚本的参数
declare命令
declare命令可以声明一些特殊类型的变量,为变量设置一些限制,比如声明只读类型的变量和整数类型的变量,语法格式如下:
declare OPTION VARIABLE=value
declare命令的主要参数如下:
-a :声明数组变量
-f :输出所有函数定义
-F :输出所有函数名,不包含函数定义
-i :声明整数变量,声明整数变量后,可以直接进行数学运算(变量声明为整数变量后依然可以被改写成字符串)
-l :声明变量为小写字母,可以自动把变量值转成小写字母
-p :查看变量信息
-r :声明只读变量,声明只读变量后无法改变变量值(再次赋值会有报错提示),也无法unset
-u :声明变量为大写字母,可以自动把变量值转成大写字母
-x :该变量输出为环境变量,等同于export命令,可以输出一个变量为子shell的环境变量
declare命令应用在函数中是,声明的变量只在函数内部有效,等同于local命令
declare命令不带任何参数使,会输出当前环境中的所有变量,包括函数在内,等同于不带有任何参数的set命令
readonly命令
readonly命令等同于 declare -r ,用来声明只读变量,不能改变变量值,也不能unset变量
readonly命令有3个参数
-f :声明的变量为函数名
-p :打印出所有的支付变量
-a :声明的变量为数组
let命令
let命令声明变量时,可以直接执行算术表达式
let命令的参数表达式如果包含空格,就需要使用引号
let可以同事对多个变量赋值,赋值表达式之间使用空格分隔
字符串操作
字符串的长度
获取字符串长度的语法 ${#varname},大括号必须存在,否则bash会将$#的相关内容理解成脚本的参数和个数
子字符串
${varname:offset:length}可以获取一个字符串中的子串,该方法不能直接操作字符串,只能通过变量来读取字符串,并且不会改变原始字符串,执行时变量前的$符号可以省略
offset是开始位置,length为长度。offset也可以设置为负数代表从字符串末尾开始,offset设置为负数时前面必须有一个空格${varname: -2:2}防止与变量设置的默认语法混淆,指定的length可以为正数也可以为负数,length为负数时,值不能超过offset的长度
搜索和替换
bash 中提供多种字符串的搜索和替换的方法
字符串头部模式的匹配
检查字符串开头是否匹配给定的模式,匹配成功就删除匹配的部分,返回剩余的部分,原始变量不会发生任何改变匹配模式pattern可以使用* ? []等通配符
${variable#pattern}非贪婪模式
${variable##pattern}贪婪模式
字符串尾部模式的匹配(除从字符串尾部开始匹配外,其余同字符串头部匹配的说明)
${variable%pattern}非贪婪模式
${variable%%pattern}贪婪模式
将尾部匹配的部分替换成其他内容
模式必须出现在字符串的结尾 ${variable/%pattern/string}
任意位置的模式匹配
${variable/pattern/string}非贪婪模式
${variable//pattern/string}贪婪模式
省略string部分的时候,相当于匹配的部分换成空字符串,也就是删除匹配的部分
改变大小写
将字符串转为大写 :${varname^^}
将字符串转为小写 :${varname,,}