您的位置:首页 > 运维架构 > Shell

Bash基础

2015-10-03 18:10 393 查看

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文件存在
-ffile是一个普通文件
-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 f2f1和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。

  PS1:第一提示符,PS1:第一提示符,PS2:第二提示符,以此类推。

  $PWD:当前工作目录。

  $RANDOM:产生随机整数。注意:它是Bash的内建函数,而不是常量。

特殊参数描述
0,0,1,2...|位置参数,2...|位置参数,0表示脚本名,$1表示第一个参数,以此类推
$#命令行或者位置参数的个数
∗|所有的位置参数,被作为一个字符串,* |所有的位置参数,被作为一个字符串,* 必须被 “” 引用
@|与@| 与 * 同义,但是每个参数都是一个独立的 “” 引用的字串,$@ 也必须被 “” 引用
$!在后台运行的最后的工作的进程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函数
-xexport

循环

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](可选)
}


参考文档

Advanced Bash-Scripting Guide
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: