当前位置: 首页 > 工具软件 > bash-guide > 使用案例 >

Bash基础

佘单鹗
2023-12-01

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 PS2:第二提示符,以此类推。

  $PWD:当前工作目录。

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

特殊参数描述
0, 1, 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](可选)
}

参考文档

  1. Advanced Bash-Scripting Guide
 类似资料: