shell领域内,变量的作用不言而喻。

内置变量,是不需要在程序中声明,就自动存在的,随时可以访问。

  Shell 的环境变量分为 set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。

SHELL

[root@hadoop1 shells]# echo $SHELL

/bin/bash

BASH 显示bash的完整路径名

[root@hadoop1 shells]# echo $BASH

/bin/bash

BASH_VERSION bash的版本

[root@hadoop1 shells]# echo $BASH_VERSION

4.1.2(1)-release

HISTCMD 在历史指令中的排列编号 [root@hadoop1 shells]# echo $HISTCMD

1045

HISTCONTROL 控制指令是否存入历史脚本文件中。

[root@hadoop1 shells]# echo $HISTCONTROL

ignoredups

HISTFILE 设定历史脚本文件的路径文件名

[root@hadoop1 shells]# echo $HISTFILE

/root/.bash_history

HISTFILESIZE 设定历史脚本文件存储指令的最大行数。 [root@hadoop1 shells]# echo $HISTFILESIZE

1000

HISTIGNORE 不存入历史脚本文件的指令样式
HOME 定用户的家目录位置

[root@hadoop1 shells]# echo $HOME

/root

HOSTNAME 显示主机名

[root@hadoop1 shells]# echo $HOSTNAME

hadoop1

HOSTTYPE 显示主机形态。 [root@hadoop1 shells]# echo $HOSTTYPE

i386

MACHTYPE 描述主机形态的GNU格式 [root@hadoop1 shells]# echo $MACHTYPE

i386-redhat-linux-gnu

MAIL 显示当前用户邮件目录 [root@hadoop1 shells]# echo $MAIL

/var/spool/mail/root

MAILCHECK 每隔多久就检查一次邮件

[root@hadoop1 shells]# echo $MAILCHECK

60

PATH 命令的搜寻路径

[root@hadoop1 shells]# echo $PATH

/usr/lib/qt-3.3/bin:/usr/local/sbin:.....

PPID 父进程的进程编号。

[root@hadoop1 shells]# echo $PPID

2850

RANDOM 随机函数

[root@hadoop1 shells]# echo $RANDOM

29446

REPLY select和read没有设定读取变量时,默认的变量名称为REPLY。
UID 用户ID

[root@hadoop1 shells]# echo $UID

0

USER 用户名

[root@hadoop1 shells]# echo $USER    

root

LOGNAME 登录用户的用户名

[root@hadoop1 shells]# echo $LOGNAME

root

PS1

PS2

提示符

[root@hadoop1 shells]# echo $PS1

[\u@\h \W]\$

[root@hadoop1 shells]# echo $PS2

>

TERM 终端类型

[root@hadoop1 shells]# echo $TERM

vt100

PWD 当前目录

[root@hadoop1 shells]# echo $PWD 

/u02/shells

LANG 设置当前语系的名称

[root@hadoop1 shells]# echo $LANG

en_US

[root@hadoop1 shells]# echo $LANGUAGE

en_US

SECONDS 显示当前shell的启动的时间
TMOUT 若该变量的值大于0的话,则bash会在等待TMOUT秒后还没有任何操作就会自动结束当前的bash shell.


函数范围变量


$1~$n

位置参数

传入程序或函数式的参数,第一个参数$1,第二参数$2


$0 执行程序的名称

$*

代表所有的位置参数,并且视为一个字符串。

$@

代表所有的位置参数,但$@代表各位置参数组成的串行。

$#

位置参数的个数。

$?

上一条命令执行结束后的传回值。通常0代表执行成功,非0代表执行有误。

$$

目前bash shell的进程编号。

$_

a. script执行时,bash的绝对路径。

b. 上一个命令执行时,最后一个位置参数,如上一个命令是:test.sh ABC 123 xyz,则$_的值为’xyz’。

c. 检查邮件时,$_的值为邮件文件名。


特殊的IFS

 Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符.IFS包含系列空白字符

$ echo $IFS  
  
$ echo "$IFS" | od -b  
0000000 040 011 012 012  
0000004

表格 B-4. 参数替换和扩展

表达式 含义
${var} 变量var的值, 与$var相同


${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:-DEFAULT} 如果var没有被声明或其值为空, 那么就以$DEFAULT作为其值 *


${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *


${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER} 如 果var被设置了, 那么其值就是$OTHER, 否则就为null字符串(修改现有值)


${var?ERR_MSG} 如果var没 被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG} 如果var没 被设置, 那么就打印$ERR_MSG *


${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量


表格 B-5. 字符串操作

表达式 含义
${#string} $string的长度


${string:position} $string中, 从位置$position开始提取子串
${string:position:length} $string中, 从位置$position开始提取长度为$length的子串


${string#substring} 从 变量$string的开头, 删除最短匹配$substring的子串
${string##substring} 从 变量$string的开头, 删除最长匹配$substring的子串
${string%substring} 从 变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} 从 变量$string的结尾, 删除最长匹配$substring的子串


${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement} 使 用$replacement, 代替所有匹配的$substring
${string/#substring/replacement} 如 果$string前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement} 如果$string后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring




expr match "$string" '$substring' 匹配$string开头的$substring* 的长度
expr "$string" : '$substring' 匹 配$string开头的$substring* 的长度
expr index "$string" $substring $string中匹配到的$substring的第一个字符出现的位置
expr substr $string $position $length $string中 从位置$position开始提取长度为$length的子串
expr match "$string" '\($substring\)' $string的 开头位置提取$substring*
expr "$string" : '\($substring\)' $string的 开头位置提取$substring*
expr match "$string" '.*\($substring\)' $string的 结尾提取$substring*
expr "$string" : '.*\($substring\)' $string的 结尾提取$substring*

http://allenh.blog.51cto.com/481430/1695810

http://blog.csdn.net/gaoming655/article/details/7238695