Bash基础

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。

  PS1PS2:第二提示符,以此类推。

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

参考文档

  1. Advanced Bash-Scripting Guide
原文地址:https://www.cnblogs.com/corfox/p/5415001.html