Bash基础
基本命与操作符
#
注释,用于一行行首(#!
除外)或本行空白的后边。
;
命令分隔符,可以在一行中写多个命令。
;;
终止case选项。
.
等价于source命令,这是一个bash内建命令。
.
作为文件名的前缀时,则该文件为隐藏文件。作为目录名的一部分.
表示当前目录,..
表示上一级目录。用于字符匹配中,作为正则表达式的一部分,用来匹配任何单个字符。
“
部分引用,”STRING”阻止了一部分特殊字符。
'
全引用,’STRING’阻止了全部特殊字符。
,
逗号连接了一系列算术操作,虽然里面的内容都被运行了,当只有最后一项被返回。
转义字符
/
文件名路径分隔符,或用来作除法。
`后置引用,命令替换。
:
空命令
!
取反操作符。
*
万能匹配符,用于文件名匹配或正则表达式中。注意:*
在正则表达式匹配中与文件名匹配中是不同的。数学运算。**
幂运算。
?
测试操作,或在正则表达式中匹配任意单个字符。
$
变量替换,或在正则表达式中作为行结束符。
$$
变量的间接引用。
^
正则表达式中表示行首。
${}
参数替换。
$*, $@
位置参数。
$?
退状态变量。
$$
进程ID变量,保存了运行脚本进程ID。
()
命令组。注意:在()中的命令列表将作为一个子shell来运行。
{xxx, yyy, ...}
大括号扩展。
{}
代码块,又称为内部组。事实上,这个结构创建了一个匿名函数,但是与函数不同的是,在其中声明的变量,对于脚本其它部分的代码来说还是可见的。
{};
路径名
[]
test
[[]]
test
[]
数组元素,或正则表达式中作为字符匹配的一个范围。
(())
算术扩展和赋值,以及允许C风格的变量处理机制。
> &> >> >&
重定向。
<,>
正则表达式中的单词边界。
|
管线。
>|
强制重定向。
+,-,*,/,**,%
算术操作符
||
逻辑或
&&
逻辑与
!
逻辑非
<<
左移一位
<<=n
左移n位
>>
右移一位
>>=n
右移n位
&
按位与
&=
按位与赋值
|
按位或
|=
按位或赋值
~
按位非
^, XOR
按位异或
^=
异或赋值
&
后台运行命令。
整数比较
操作符 | 描述 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-ge | 大于等于 |
-lt | 小于 |
-le | 小于等于 |
< | 小于(需要双括号) |
<= | 小于等于(需要双括号) |
> | 大于(需要双括号) |
= |
大于等于(需要双括号) |
字符串比较
操作符 | 描述 |
---|---|
= | 等于 |
== | 等于 |
!= | 不等于 |
< | 小于,ASCII值 |
> | 大于,ASCII值 |
-z | 字符串为null |
-n | 字符串不为null |
文件测试操作
操作符 | 描述 |
---|---|
-e | 文件存在 |
-f | file是一个普通文件 |
-s | 文件长度是0 |
-d | 文件是个目录 |
-b | 文件是个块设备 |
-c | 文件是个字符设备 |
-p | 文件是个管道 |
-h | 文件是个符号链接 |
-L | 文件是个符号链接 |
-S | 文件是个Socket |
-t | 关联到一个终端设备的文件描述符,可以用来测试一个给定脚本中的stdin[-t0]或[-t1]是一个终端 |
-r | 文件具有读权限 |
-w | 文件具有写权限 |
-X | 文件具有执行权限 |
-g | ? |
-u | ? |
-k | ? |
-O | 是否为文件的拥有者 |
-G | 文件组id是否与文件拥有者的组id相同 |
-N | 从文件最后一次打开到现在,是否被修改 |
f1 -nt f2 | 文件f1是否比f2新 |
f1 -ot f2 | 文件f1是否比f2旧 |
f1 -ef f2 | f1和f2是否都硬连接到一个文件 |
! | 取反上面的测试结果 |
Bash内建变量
$BASH:Bash可执行文件的路径/bin/bash。
$BASH_ENV:该变量指向一个Bash启动文件,这个启动文件将在调用一个脚本时被读取。
$BASH_VERSION:Bash版本号,如:4.3.11(1)-release
$BASH_VERSINFO:Bash版本信息,是一个6元素的数组。内容分别是主版本号、次版本号、Patch次数、Build version、release status、Architecture。
$DIRSTACH:目录栈中栈顶的值。
$EDITOR:调用默认编辑器。
$EUID:有效用户ID号。
$FUNCNAME:当前函数的名字。
$GROUPS:当前用户所属的组。
$HOME:用户的home目录。
$HOSTNAME:系统名字
$HOSTTYPE:系统类型,如i686
$IFS:内部域分割符。
$LINENO:记录shell脚本中该变量所在的行号。
$MACHTYPE:系统类型。
$OLDPWD:所在的之前的目录。
$OSTYPE:操作系统类型。
$PATH:系统搜索路径。
$PIPESTATUS:保存管道的退出状态。
$PPID:当前进程的父进程的进程ID。
$PWD:当前工作目录。
$RANDOM:产生随机整数。注意:它是Bash的内建函数,而不是常量。
特殊参数 | 描述 |
---|---|
$# | 命令行或者位置参数的个数 |
$! | 在后台运行的最后的工作的进程ID |
$_ | 保存之前执行的命令的最后一个参数 |
$? | 函数或脚本的退出状态 |
$$ | 脚本自身的进程ID |
字符串操作
字符串长度
${#string}
expr length $string
expr "$string":'.*'
提取子字符串
${string:position}
${string:position:length}
删除子字符串
#从string的左边删除第一个匹配的substring
${string#substring}
#从string的左边删除最后一个匹配的substring
${string##substring}
子串替换
#使用replacement替换第一个匹配的substring
${string/substring/replacement}
#使用replacement替换所有匹配的substring
${string//substring/replacement}
参数替换
${parameter}
#如果参数没有设置具体值,就使用默认值
${parameter-default},${parameter:-default}
${parameter=default},${parameter:=default}
#如果paramerter被设置了,那就使用alt_value,否则就使用null字符串
${parameter+alt_value},${parameter:+alt_value}
#如果parameter被设置了,那就使用设置的值,否则print err_msg
${parameter?err_msg}, ${parameter:?err_msg}
declare或者typeset内建命令允许指定变量的具体类型,两个命令是等价的。参数选项如下:
declare/typeset参数选项 | 描述 |
---|---|
-r | 只读 |
-i | 整型 |
-a | 数组 |
-f | 函数 |
-x | export |
循环
for arg in [list]
do
command(s)
...
done
#C风格
for ((initialization; condition; change))
do
command(s)
...
done
while [condition]
do
command(S)
...
done
#C风格
while ((condition))
do
command(s)
...
done
until [condition-is-true]
do
command(s)
...
done
#同样也有循环控制命令
break
continue
break N #跳出N重循环
continue N #跳过本层N次循环
#测试与分支
case "$variable" in
"condition1")
command(s)
...
;;
"condition2")
command(s)
...
;;
...
esac
select variable [in list]
do
command(s)
...
break
done
函数
function function_name
{
command(s)
...
[return](可选)
}
function_name()
{
command(s)
...
[return](可选)
}
参考文档