内建变量
这些会预想bash脚本的行为
/bin/bash bash的二进制程序文件的路径

$BASH_ENV 这个环境变量会指向一个bash的启动文件,当一个脚本被调用的时候,这个启动文件将会被读取

$BASH_SUBSHELL 用来提示子shell的层次,bash3.0以后才被引用过来

$BASH_VERSINFO[n]

这是一个含有6个元素的数组, 它包含了所安装的Bash的版本信息. 这与下边的$BASH_VERSION很相像

$BASH_VERSION

    安装在系统上的Bash版本号

echo $BASH_VERSION
3.00.14(1)-release
             
$FUNCNAME 当前函数名的调用!
如:test123 ()
{
echo "$FUNCNAME now executing"
}
$GLOBIGNORE
一个文件名的模式匹配列表

$GROUPS
前用户所属的组
$HOME

    用户的home目录, 一般是/home/username
$HOSTNAME

    hostname放在一个初始化脚本中, 在系统启动的时候分配一个系统名字
$HOSTTYPE

    主机类型

    就像$MACHTYPE, 用来识别系统硬件.
$IFS

    内部域分隔符

    这个变量用来决定Bash在解释字符串时如何识别域, 或者单词边界.
$LC_CTYPE

    这个内部变量用来控制通配(globbing)和模式匹配中的字符串解释.
$MACHTYPE

    机器类型

    标识系统的硬件.

    bash$ echo $MACHTYPE
    i686

$OLDPWD

    之前的工作目录("OLD-print-working-directory", 就是之前你所在的目录)
$OSTYPE

    操作系统类型

    bash$ echo $OSTYPE
    linux

$PATH

    可执行文件的搜索路径, 一般为/usr/bin/, /usr/X11R6/bin/, /usr/local/bin, 等等.

$PPID

    进程的$PPID就是这个进程的父进程的进程ID(pid). [1]

    和pidof命令比较一下.
$PROMPT_COMMAND

    这个变量保存了在主提示符$PS1显示之前需要执行的命令.
$PS1

    这是主提示符, 可以在命令行中见到它.
$PS2

    第二提示符, 当你需要额外输入的时候, 你就会看到它. 默认显示">".
$PS3

    第三提示符, 它在一个select循环中显示(参见例子 10-29).
$PS4

    第四提示符, 当你使用-x选项来调用脚本时, 这个提示符会出现在每行输出的开头. 默认显示"+".
$PWD
    工作目录(你当前所在的目录)

$* 以一个单字符显示所有向脚本传递的参数,与位置变量不同,此选项参数可以超9个

$$ 脚本运行的当前进程ID号

$! 后台运行最后一个进程的ID号

$@ 与$#相同,但是使用是加引号,并在引号中返回每个参数

$- 显示shell使用的当前选项,与set命令功能相同

$?  显示最后命令的推出状态。0表示没有错误,其他任何值表明有错误

操作字符串
匹配字符串开头的子串长度

expr match "$string" '$substring'

    $substring是一个正则表达式.
expr "$string" : '$substring'

    $substring是一个正则表达式.

      1 stringZ=abcABC123ABCabc
      2 #       |------|
      3
      4 echo `expr match "$stringZ" 'abc[A-Z]*.2'`   # 8
      5 echo `expr "$stringZ" : 'abc[A-Z]*.2'`       # 8

索引

expr index $string $substring

    在字符串$string中所匹配到的$substring第一次所出现的位置.

      1 stringZ=abcABC123ABCabc
      2 echo `expr index "$stringZ" C12`             # 6
      3                                              # C 字符的位置.
      4
      5 echo `expr index "$stringZ" 1c`              # 3
      6 # 'c' (in #3 position) matches before '1'.

 提取字串
[root@centos129 tmp]# echo ${string:0}
abcABC123ABCabc
[root@centos129 tmp]# echo ${string:1}
bcABC123ABCabc
[root@centos129 tmp]# echo ${string:2}
cABC123ABCabc
[root@centos129 tmp]# echo ${string:7:4}
23AB (提取字串长度为4)
从结尾开始提取字串比如
echo ${stringZ:(-4)}                         # Cabc
echo ${stringZ: -4}                          # Cabc
# 这样, 它就可以工作了.
# 使用圆括号或者添加一个空格可以"转义"这个位置参数.

[root@centos129 tmp]# echo `expr substr $string 1 2`
ab
提取第一个字符串开头包括第一个字符串后面的2个字符
[root@centos129 tmp]# echo `expr substr $string 1 3`
abc
提取第一个字符串开头包括第一个字符串后面的3个字符
[root@centos129 tmp]# echo `expr substr $string 2 3`
bcA
[root@centos129 tmp]# echo `expr substr $string 2 6`
bcABC1
cho `expr match "$stringZ" '\(.[b-c]*[A-Z]..[0-9]\)'`   # abcABC1
  5 echo `expr "$stringZ" : '\(.[b-c]*[A-Z]..[0-9]\)'`       # abcABC1
  6 echo `expr "$stringZ" : '\(.......\)'`                   # abcABC1
从$string的结尾提取
  1 stringZ=abcABC123ABCabc
  2 #                ======
  3
  4 echo `expr match "$stringZ" '.*\([A-C][A-C][A-C][a-c]*\)'`    # ABCabc
  5 echo `expr "$stringZ" : '.*\(......\)'`                       # ABCabc

字串消除
从字符串的开头位置揭掉最短匹配的子字符串
stringZ=abcABC123ABCabc
echo ${stringZ#a*C}      # 123ABCabc
截掉'a'到'C'之间最短的匹配字符串.
echo ${stringZ##a*C}     # abc
# 截掉'a'到'C'之间最长的匹配字符串.



从$string的结尾位置截掉最长匹配的$substring.

stringZ=abcABC123ABCabc

echo ${stringZ%b*c}      # abcABC123ABCa
# 从$stringZ的结尾位置截掉'b'到'c'之间最短的匹配.

echo ${stringZ%%b*c}     # a
# 从$stringZ的结尾位置截掉'b'到'c'之间最长的匹配.