- 单引号变量,不识别特殊语法;
- 双引号变量,能识别特殊符号;
1.每次调用bash/sh解释器执行脚本,都会开启一个子shell,因此不保留当前的shell变量,通过pstree命令可检查进程树;
2.调用source是在当前shell环境加载脚本,因此保留变量。
环境变量设置
检查系统环境变量的指令
- set,输出所有变量,包括全局变量、局部变量(sh脚本中定义的变量);
- env,只显示全局变量;
- export,显示和设置变量值;
- declare,输出所有的变量,如同set;
- 使用declare事先设定变量a的属性为“整数”
- 特殊符号不必使用\转义
- 算式中,可包含其他变量,变量之前不必加上$.
撤销环境变量
unset 变量名,删除变量或函数
设置可读变量
readonly,只有shell结束,只读变量才会失效;
declare [选项] 变量名
命令行程序
选项 用途 范例 释例 -p 显示变量的属性 declare -p x 显示变量x的属性 -a 变量是一个数组 declare -a array 设定变量array是一个数组 -f 搜寻命令时,只找函数 declare -f showit 寻找showit,只由函数式列表中寻找,不搜寻其他别名或外部命令进程序 -i 变量是一个整数 declare -i a 设定变量a是整数形态 -F 显示所有的函数式名称及其属性 declare -F 显示所有的函数式名称和其属性 -r 设定只读变量 declare -r a 设定a是只读的变量 -t 设定变量具trace属性 declare -t xyz=11 设定变量xyz具trace的属性,利于排错 -x 设为环境变量 declare -x PATH 设定PATH为环境变量
which
找某一部分程序的文件位置
which -a
找出所有符合的程序路径
locate
数据库中找出关键词文件路径
date
显示设定系统的日期和时间
date +'%d%H%M'
日 时 分
who
显示现在谁登陆主机
ls -a
列出目录内容 包括隐藏文件
ls -A
只显示目录信息
cat d1 d2
连接d1 d2内容,并显示出来
cat d1 d2 > result.txt
转向输出,存成result.txt
cat >文件
利用cat创建一个新文件
测试变量是否“不存在”或其值为空:提示错误信息
- 语法:${待测变量:?提示信息}
- 判断条件:若变量不存在或空值,则符合判断。
- 解释:若变量不存在或空值,则显示变量名称和:?后面的提示信息,并立即停止执行script.
测试变量的“存在性”
- 语法:${待测变量:+真值}
- 判断条件:若变量存在且其值非空(存在),则符合判断。
- 解释:若变量存在且其值非空,则传回“真值”:若不然,传回空值。
- 这里的真值,只要是非空字符串或数字都可以 整理
条件式 目的 判断条件 符合的处置方式 不符合的处置方式 ${待测变量:-替换字符串} 回传的结果一定要有非空值 测不存在或空值 传回“默认值”(即替换字符串) 传回变量值 ${待测变量:=替换字符串} 给空值变量设一个默认值 测不存在或空值 把变量值设为“默认值” 传回变量值 ${待测变量:?错误信息 检查条件是否完备 测不存在或空值 显示变量名称:提示信息,停止执行script 传回变量值 ${待测变量:+替换字符串} 判断某事是否为真 测试存在且非空 传回“默认值” 传回空值
- 1.命令行第一个参数用$1表示
- 2.命令本身用$0表示
- 3.$@代表所有的参数
取字符串切片
取字符串切片的语法有两种:
- 语法一:${变量:位置起点} 解释:由指定的位置开始,街区字字符串到字符串结束。
- 语法二:${变量:位置起点:长度} 解释:由指定的位置开始,截取指定长度的字符串。
算术运算
符号 名称 语法 范例 1 算术扩展 $((算术式)) r=$((2+5*8)) 2 使用外部程序expr expr算术式 r= expr 4 + 5
3 使用$[] $[算术式] r=$[ 4 + 5 ] 4 使用内置命令declare declare -i 变量=算术式 declare -i r=8+16 5 使用内置命令let len 算术式 let r=8+16 let就是让变量重新赋值
注:
- 在求值时,如果算术式中变量不存在或空值,则该变量的值为0。
- 如果数字以0开头,则视为八进制数字。
- 以0x或0X开头,视为16进制数字。
- 不同进制的数字,可使用“基底#数字”的表示法,其中基底范围为2~64。
- 小括号可改变运算的优先级,小括号优先级最高。
使用外部程序expr做算术运算
- r=
expr 参数1 \| 参数2
- \代表“或”的意思。
- 如果“参数1”存在,非空,不是0,则传回“参数1”的值,否则,传回“参数2”的值。
- 由于|是特殊字符,所以要写出转义字符|。
注:expr没有乘幂功能,换言之
expr 2 ** 3
是错误的语法,无法执行。
找出子字符串的位置(zsh中第一位为1,而不是0) expr index
取子字符串(片切) expr substr
字算字符串长度 expr length
视关键词为一般字符串
+后方接要视为一般字符串的关键词或运算符。
模式扩展
Bash 是先进行扩展,再执行命令。因此,扩展的结果是由 Bash 负责的,与所要执行的命令无关。命令本身并不存在参数扩展,收到什么参数就原样执行。
模式扩展与正则表达式的关系是,模式扩展早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是优点是简单和方便。
波浪线扩展
- 波浪线~会自动扩展成当前用户的主目录。
~+
会扩展成当前所在的目录,等同于pwd
命令。
?
字符扩展
?
字符代表文件路径里面的任意单个字符,不包括空字符。比如,Data???
匹配所有Data
后面跟着三个字符的文件名。?
字符扩展属于文件名扩展,只有文件确实存在的前提下,才会发生扩展。如果文件不存在,扩展就不会发生。
*
字符扩展
*
字符代表文件路径里面的任意数量的任意字符,包括零个字符;
*.txt
代表后缀名为.txt
的所有文件;如果想输出当前目录的所有文件,直接用
*
即可;注意,
*
不会匹配隐藏文件(以.
开头的文件),即ls *
不会输出隐藏文件;如果要匹配隐藏文件,需要写成.*
。
*
只匹配当前目录,不会匹配子目录。方括号扩展
- 方括号扩展的形式是
[...]
,只有文件确实存在的前提下才会扩展。如果文件不存在,就会原样输出:括号之中的任意一个字符。比如,[aeiou]
可以匹配五个元音字母中的任意一个。- 方括号扩展还有两种变体:
[^...]
和[!...]
。它们表示匹配不在方括号里面的字符,这两种写法是等价的。比如,[^abc]
或[!abc]
表示匹配除了a
、b
、c
以外的字符。[start-end] 扩展
方括号扩展有一个简写形式
[start-end]
,表示匹配一个连续的范围。比如,[a-c]
等同于[abc]
,[0-9]
匹配[0123456789]
。下面是一些常用简写的例子。
[a-z]
:所有小写字母。[a-zA-Z]
:所有小写字母与大写字母。[a-zA-Z0-9]
:所有小写字母、大写字母与数字。[abc]*
:所有以a
、b
、c
字符之一开头的文件名。program.[co]
:文件program.c
与文件program.o
。BACKUP.[0-9][0-9][0-9]
:所有以BACKUP.
开头,后面是三个数字的文件名。这种简写形式有一个否定形式
[!start-end]
,表示匹配不属于这个范围的字符。比如,[!a-zA-Z]
表示匹配非英文字母的字符。大括号扩展
大括号扩展
{...}
表示分别扩展成大括号里面的所有值,各个值之间使用逗号分隔。比如,{1,2,3}
扩展成1 2 3
。注意,大括号扩展不是文件名扩展。它会扩展成所有给定的值,而不管是否有对应的文件存在。
另一个需要注意的地方是,大括号内部的逗号前后不能有空格。否则,大括号扩展会失效。
- 逗号前面可以没有值,表示扩展的第一项为空。
- 大括号可以嵌套。
- 大括号也可以与其他模式联用,并且总是先于其他模式进行扩展。
{start..end} 扩展
大括号扩展有一个简写形式
{start..end}
,表示扩展成一个连续序列。比如,{a..z}
可以扩展成26个小写英文字母。这种简写形式支持逆序。注意,如果遇到无法理解的简写,大括号模式就会原样输出,不会扩展。
- 大括号扩展的常见用途为新建一系列目录,另一个常见用途,是直接用于
for
循环。- 这种简写形式还可以使用第二个双点号(
start..end..step
),用来指定扩展的步长。- 多个简写形式连用,会有循环处理的效果。
变量扩展
- Bash 将美元符号
$
开头的词元视为变量,将其扩展成变量值。- 变量名除了放在美元符号后面,也可以放在
${}
里面。${!string*}
或${!string@}
返回所有匹配给定字符串string
的变量名。子命令扩展
$(...)
可以扩展成另一个命令的运行结果,该命令的所有输出都会作为返回值。$(...)
可以嵌套,比如$(ls $(pwd))
。算术扩展
$((...))
可以扩展成整数运算的结果;字符类
[[:class:]]
表示一个字符类,扩展成某一类特定字符之中的一个。常用的字符类如下。
[[:alnum:]]
:匹配任意英文字母与数字[[:alpha:]]
:匹配任意英文字母[[:blank:]]
:空格和 Tab 键。[[:cntrl:]]
:ASCII 码 0-31 的不可打印字符。[[:digit:]]
:匹配任意数字 0-9。[[:graph:]]
:A-Z、a-z、0-9 和标点符号。[[:lower:]]
:匹配任意小写字母 a-z。[[:print:]]
:ASCII 码 32-127 的可打印字符。[[:punct:]]
:标点符号(除了 A-Z、a-z、0-9 的可打印字符)。[[:space:]]
:空格、Tab、LF(10)、VT(11)、FF(12)、CR(13)。[[:upper:]]
:匹配任意大写字母 A-Z。[[:xdigit:]]
:16进制字符(A-F、a-f、0-9)。
通配符使用注意点
- 通配符是先解释,再执行。 Bash 接收到命令以后,发现里面有通配符,会进行通配符扩展,然后再执行命令。
- 文件名扩展在不匹配时,会原样输出。
- 只适用于单层路径。
?
或*
这样的通配符,不能匹配路径分隔符(/
)。- 文件名可以使用通配符。Bash 允许文件名使用通配符,即文件名包括特殊字符。这时引用文件名,需要把文件名放在单引号或双引号里面。
$ touch 'fo*' $ ls fo*
上面代码创建了一个
fo*
文件,这时*
就是文件名的一部分。