参考http://www.360doc.com/content/13/1014/19/7377734_321441270.shtml
变量定义得格式:
name=value //=字符串变量赋值,其值一般都用引号,可以不用引号(前提是字符串不成句,不能有空格),变量名中,不能有“中杠-",中杠会被识别为减号,必须改成"下杠_",变量引用要带$(read和赋值=和export,引用变量,不带$),字符串变量在if条件里,最好用" "引起来;类似单引号,反斜线"\" 也能屏蔽所有特殊字符.但一次只能屏蔽一个字符;"" 引号中间没有任何字符,表示回车;
env //查看环境变量
set //查看局部变量和环境变量
export $name //将局部变量导入为环境变量。
1、取字符串 ${变量名:位置起点} 或 ${变量名:位置起点:长度}
2、取部分位置参数 ${@:起点}或${@:起点:个数} 其中$@表示所有参数,如$0命令本身、$1....
3、计算字符串长度 ${#变量名}
4、替换或删除部分字符串 ${变量名/样式/替换字符串} 如果变量中有符合样式的字符串,则使用替换字符串替换,只替换第一个符合样式的字符串
${变量名//样式/替换字符串} 如果变量中有符合样式的字符串,则使用替换字符串替换,替换全部符合样式的字符串5、把符合样式的字符串删除 ${变量名/样式/} 删除符合样式的第一个字符串
${变量名/样式/} 删除符合样式的所有字符串
7、取变量名称列表 ${!开头字符串@}或${!开头字符串*} 把所有以指定字符串开头的变量名列出,各变量之间按空格分开
8、取数组索引列表 ${!数组变量[@]}或${!数组变量[*]} 把数组变量所有的索引列出,各索引值之间用空格符分开
符号 | 内容 |
* | 万用字符,代表一个或多个字符(或数字) |
? | 万用字符,代表一个字母 |
# | 批注,这个最常被使用在 script 当中,视为说明! |
/ | 跳脱符号,将『特殊字符或万用字符』还原成一般字符 |
| | 分隔两个管线命令的界定 ; |
; | 连续性命令的界定(注意!与管线命令并不相同) |
~ | 使用者的家目录 |
$ | 亦即是变量之前需要加的变量取代值 |
& | 将指令变成背景下工作 |
! | 逻辑运算意义上的『非』 not 的意思! |
/ | 路径分隔的符号 |
>, >> | 输出导向,分别是『取代』与『累加』 |
' | 单引号,不具有变量置换的功能 |
" | 具有变量置换的功能! |
` ` | 两个『 ` 』中间为可以先执行的指令! |
( ) | 在中间为子 shell 的起始与结束 |
[ ] | 在中间为字符的组合 |
{ } | 在中间为命令区块的组合! |
1。系统变量
变量名 | 含义 |
---|---|
$# | 命令行参数的个数,使用时加引号 |
$n | $1表示第一个参数,$2表示第二个参数,以此类推 |
$0 |
当前程序的名称 |
$? | 前一个命令或许或函数的返回码 |
$* | 以“参数1 参数2 。。。”形式保存所有参数 |
$@ | 以“参数1”“参数2”。。。形式保存所有参数,使用时加引号 |
$$ | 本程序的(进程ID号)PID |
$! | 上一个命令的PID |
|
2。环境变量
当shell程序启动时,都自动设置一组变量,这组变量就是环境变量。shell中的所有命令都可以使用这些参数,例如之前博客中提到的LOGNAME变量。环境变量可以在~/.bash_profile或者~/.bashrc中设置,
下面列举了常见的环境变量:
变量名 | 含义 |
---|---|
PATH |
命令搜索路径,以冒号为分隔符。注意与DOS下不同的是当前目录不在系统路径里 |
HOME | 用户home目录的路径名,是cd命令的默认参数 |
COLUMNS | 定义了命令编辑模式下可使用命令行的长度 |
EDITOR | 默认的行编辑器 |
VISUAL | 默认的可视编辑器 |
FCEDIT | 命令fc使用的编辑器 |
HISTFILE | 命令历史文件 |
HISTSIZE | 命令历史文件中最多可包含的命令条数(默认1000条) |
HISTFILESIZE | 命令历史文件中包含的最大行数 |
IFS | 定义shell使用的分隔符 |
LOGNAME | 用户登录名 |
指向一个需要shell监视其修改时间的文件。当该文件修改后,shell将发消息You have mail给用户 | |
MAILCHECK | shell检查MAIL文件的周期,单位是秒 |
MAILPATH | 功能与MAIL类似,但可以用一组文件,以冒号分隔,每个文件后可跟一个问号和一条发向用户的消息 |
SHELL | shell的路径名 |
TERM | 终端类型 |
TMOUT | shell自动退出的时间,单位为秒,若设为0则禁止shell自动退出 |
PROMPT_COMMAND | 指定在主命令提示符前应执行的命令 |
PS1 | 主命令提示符 |
PS2 | 二级命令提示符,命令执行过程中要求输入数据时用 |
PS3 | selcet的命令提示符 |
PS4 | 调试命令提示符 |
MANPATH | 寻找手册页的路径,以冒号分隔 |
LD_LIBRARY_PATH | 寻找库的路径,以冒号分隔 |
|
定义数组
13.10.5 环境变量
环境变量可用在创建它们的shell和从该shell派生的任意子shell或进程中。它们通常被称为全局变量,以区别于局部变量。通常,环境变量应该大写。环境变量是已经用export内置命令导出的变量。
变量被创建时所处的shell被称为父shell。如果父shell又启动了一个shell,这个新的shell被称作子shell。环境变量将传递给从创建它们的shell里启动的任意子进程。它们从父亲传递给儿子再到孙子等,但是不可向其他方向传递。比如,一个子进程可以创建环境变量,但不能将它传回给它的父进程,只能传给它的子进程 15。有一些环境变量,比如HOME、LOGNAME、PATH和SHELL,在用户登录之前就已经被/bin/login程序设置好了。通常,环境变量定义并保存在用户主目录下的.bash_profile文件中。请参见表13-14中列出的环境变量。
表13-14 bash环境变量
变 量 名 |
含 义 |
_(下划线) |
上一条命令的最后一个参数 |
BASH |
展开为调用bash实例时使用的全路径名 |
BASH_ENV |
和ENV一样,但只可在bash 2.0或更高版本中设置 16 |
BASH_VERSINFO |
使用2.0以上版本的bash时,展开为版本信息 16 |
BASH_VERSION |
展开为当前bash实例的版本号 |
CDPATH |
cd命令的搜索路径。它是以冒号分隔的目录列表,shell通过它来搜索cd命令指定的目标目录。例如.:~:/usr |
COLUMNS |
设置该变量就给shell编辑模式和选择的命令定义了编辑窗口的宽度 |
DIRSTACK |
在2.0或以上版本的bash中,代表目录栈的当前内容 |
EDITOR |
内置编辑器emacs、gmacs或vi的路径名 |
ENV |
每一个新的bash shell(包括脚本)启动时执行的环境文件。通常赋予这个变量的文件名是.bashrc。ENV的值被解释为路径名前,shell先要对其进行参量扩展,命令替换和算术扩展 |
EUID |
展开为在shell启动时被初始化的当前用户的有效ID |
FCEDIT |
fc命令的默认编辑器名 |
FIGNORE |
执行文件名补全时可忽略的以冒号分隔的后缀列表。以FIGNORE中任一项为后缀的文件名被从匹配的文件名列表中排除。例如值为.o:~ |
FORMAT |
用来格式化在命令管道上的time关键字的输出 |
GLOBIGNORE |
在文件名扩展(称为globbing)时被忽略的文件列表 |
GROUPS |
当前用户所属的组 |
HISTCMD |
当前命令的历史编号或在历史清单中的序号。如果HISTCMD被复位,即使它随后就会重置,也将失去它的特殊属性 |
HISTCONTROL |
如果设置了ignorespace值,以一个空格符开头的行将不会进入历史清单。如果设置了ignoredups值,那和前一个历史行匹配的行不会进入。值ignoreboth结合了这两个选项。如果被复位,或设置成除了上面所说的任意其他值时,所有被解释器所读的行都将保存到历史清单中 |
HISTFILE |
指定保存命令行历史的文件。默认值是~/.bash_history。如果被复位,交互式shell退出时将不保存命令行历史 |
(续表)
变 量 名 |
含 义 |
HISTFILESIZE |
历史文件能包含的最大行数。当给这个变量赋值后,如果有必要,历史文件将被截尾,以使包含的行数不超过这个数。默认值是500 |
HISTSIZE |
记录在命令行历史文件中的命令数。默认是500 |
HOME |
主目录。未指定目录时,cd命令将转向该目录 |
HOSTFILE |
包含一个格式和/etc/hosts一样的文件的名称,当shell需要补全一个主机名时将读取该文件。文件可以交互式更改。下一次试图补全主机名时,bash将新文件的内容添加到已经存在的数据库中 |
HOSTTYPE |
自动设置正在运行bash的机器的类型。默认值是由系统决定的 |
IFS |
内部字段分隔符,一般是空格符、制表符和换行符,用于由命令替换,循环结构中的表和读取的输入产生的词的字段划分 |
IGNOREEOF |
控制shell接收到单独一个EOF字符作为输入时的行为。如果设置,它的值就是shell退出前在一个输入行的最前面键入的连续EOF字符的个数。如果变量存在但没有一个数字值,或没有值,那么默认值是10。如果它不存在,EOF意味着给shell的输入的终止。它只在交互式shell中有效 |
INPUTRC |
readline启动文件的文件名,取代默认的~/.inputrc |
LANG |
用来为没有以LC_开头的变量明确选取的种类确定locale类 |
LC_ALL |
忽略LANG和任何其他LC_变量的值 |
LC_COLLATE |
确定对路径名扩展的结果进行排序时的整理顺序,以及匹配文件名与模式时的范围表达式,等价类和整理序列的行为 |
LC_MESSAGES |
确定用于转换前面有一个$的双引号串的locale |
LINENO |
每次shell在一个脚本或函数中替换代表当前连续行号(从1开始)的十进制数时,都将引用该参数 |
MACHTYPE |
包含一个描述正在运行bash的系统的串 |
|
如果该参数被设置为某个邮件文件的名称,而MAILPATH未被设置,当邮件到达MAIL指定的文件时,shell会通知用户 |
MAIL_WARNING |
如果设置了该变量,当bash发现用于检查邮件的文件在上次检查后又被访问了,将打印消息“The mail in [filename where mail is stored] has been read” |
MAILCHECK |
这个参数定义shell将隔多长时间(以秒为单位)检查一次由参数MAILPATH或MAILFILE指定的文件,看看是否有邮件到达。默认值是600秒(10分钟)。如果将它设为0,shell每次输出主提示符之前都会去检查邮件 |
MAILPATH |
由冒号分隔的文件名列表。如果设置了这个参数,只要有邮件到达任何一个由它指定的文件,shell都会通知用户。每个文件名后面都可以跟一个百分号和一条消息,当文件修改时间发生变化时,shell会显示这条消息。默认的消息是:You have mail |
(续表)
变 量 名 |
含 义 |
OLDPWD |
前一个工作目录 |
OPTARG |
上一个由getopts内置命令处理的选项参数的值 |
OPTERR |
如果设置成1,显示来自getopts内置命令的错误信息 |
OPTIND |
下一个由getopts内置命令处理的参数的序号 |
OSTYPE |
自动设置成一个串,该串描述正在运行bash的操作系统。默认值由系统决定 |
PATH |
命令搜索路径。一个由冒号分隔的目录列表,shell用它来搜索命令。默认路径由系统决定,并且由安装bash的管理员设置。一个普通值为 /usr/gnu/bin:/usr/local/bin:/usr/ucb:/usr/bin: |
PIPESTATUS |
一个数组,包含一列最近在管道执行的前台作业的进程退出状态值 |
PPID |
父进程的进程ID |
PROMPT_COMMAND |
赋给这个变量的命令将在主提示符显示前执行 |
PS1 |
主提示符串,默认值是$ |
PS2 |
次提示符串,默认值是> |
PS3 |
与select命令一起使用的选择提示符串,默认值是#? |
PS4 |
当开启追踪时使用的调试提示符串,默认值是+。追踪可以用set –x开启 |
PWD |
当前工作目录。由cd设置 |
RANDOM |
每次引用该变量,就产生一个随机整数。随机数序列可以通过给RANDOM赋值来初始化。如果RANDOM被复位,即使随后再设置,它也将失去特定的属性 |
REPLY |
当没有给read提供参数时设置 |
SECONDS |
每次SECONDS被引用,将返回调用shell以来的秒数。如果给SECONDS赋一个值,以后引用返回的值将是赋值以来的秒数加上所赋的值。如果SECONDS被复位,即使随后再设置,它也将失去特定的属性 |
SHELL |
当调用shell时,它扫描环境变量以寻找该名字。shell给PATH、PS1、PS2、MAILCHECK和IFS设置默认值。HOME和MAIL由login(1)设置 |
SHELLOPTS |
包含一列开启的shell选项,比如braceexpand、hashall、monitor等 |
SHLVL |
每启动一个bash实例时将其加1 |
TMOUT |
设置退出前等待输入的秒数 |
UID |
展开为当前用户的用户ID,在shell启动时初始化 |
设置环境变量 如果想设置环境变量,就要在给变量赋值之后或设置变量时使用export命令(参见表13-15)。带-x选项的declare内置命令也可完成同样的功能(输出变量时不要在变量名前面加$)。
表13-15 export命令和它的选项
选 项 |
值 |
-- |
标志着选项末尾,余下的参数被视为变量 |
-f |
名-值对被看作函数,而不是变量 |
-n |
将一个全局(导出)变量转换成局部变量。之后该变量将不能被导出到子进程中 |
-p |
显示所有的全局变量 |
格式
export变量=值
变量=值; export变量
declare –x 变量=值
13.10.7 显示变量值
echo命令 内置echo命令将它的参数显示到标准输出上。echo加-e选项,允许使用大量控制输出外观的转义序列。表13-16列出了echo选项和转义序列。
表13-16 echo选项和转义序列
选 项 |
含 义 |
-e |
允许解释下面列出的转义序列 |
-E |
禁止解释这些转义字符,即使在那些默认解释它们的系统上(bash 2.x) 17 |
-n |
删除输出结果中行尾的换行符 |
转义序列 |
|
/a |
报警(铃) |
/b |
退格 |
/c |
不带换行符打印一行 |
/f |
换页 |
/n |
换行 |
/r |
回车 |
/t |
制表符 |
/v |
纵向制表符 |
// |
反斜杠 |
/nnn |
ASCII码是nnn(八进制)的字符 |
当使用转义序列时,不要忘记用-e开头。
printf命令 printf 18的GNU版本可以用来编排打印输出的格式。它以和C printf函数相同的方式打印格式串。格式由一个串组成,它包含描述打印输出结果的格式指令。格式指令由带格式符(diouxXfeEgGcs)的%指定,%f代表一个浮点数,%d则代表一个(十进制)整数。
要得到printf格式符的完整清单以及如何使用它们,可以在命令行键入:printf --help。键入printf --version就可以知道使用的printf是什么版本。如果使用的是bash 2.x,内置printf命令所用的格式和/usr/bin下的printf可执行程序完全一样。
格式
printf格式[参数…]
范例13-58
printf "%10.2f%5d/n" 10.5 25
表13-17 printf命令的格式符
格 式 符 |
值 |
/" |
双引号 |
/0NNN |
一个八进制字符,这里NNN代表0~3位 |
// |
反斜杠 |
/a |
报警或蜂鸣 |
/b |
退格 |
/c |
不产生更多的输出 |
/f |
换页 |
/n |
换行 |
/r |
回车 |
(续表)
格 式 说 明 |
值 |
/t |
水平制表符 |
/v |
垂直制表符 |
/xNNN |
十六进制字符,这里NNN是1~3位 |
%% |
单个百分号 |
%b |
字符串参数,也对/转义字符进行解释 |
范例13-59
1 $ printf --version
printf (GNU sh-utils) 1.16
2 $ type printf
printf is a shell builtin
3 $ printf "The number is %.2f/n" 100
The number is 100.00
4 $ printf "%-20s%-15s%10.2f/n" "Jody" "Savage" 28
Jody Savage 28.00
5 $ printf "|%-20s|%-15s|%10.2f|/n" "Jody" "Savage" 28
Jody |Savage | 28.00|
6 $ printf "%s's average was %.1f%%./n" "Jody" $(( (80+70+90)/3 ))
Jody's average was 80.0%.
说明
1. 显示printf命令的GNU版本。
2. 如果使用的是bash 2.x,printf是一个内置命令。
3. 按照说明符%.2f指定的格式,参数100以保留两位小数的浮点数形式输出。与C函数不同的是,这里不需要用逗号来分隔参数。
4. 格式串指明将进行3个变换:第一个是%-20s(一个左对齐,长度为20的字符串),接着是%-15s(一个左对齐,长度为15的字符串),最后一个则是%10.2f(一个右对齐,长度为10的浮点数,其中的一个字符是句点,最后两个字符是小数点右边的两个数)。参数按对应%号的顺序被格式化,因此字符串Jody对应第一个%,字符串Savage对应第二个%,数字28则对应最后一个%号。
5. 该行和第4行一样,唯一的区别是增加了竖杠以说明串是左对齐还是右对齐的。
6. printf命令格式化字符串Jody和算术扩展的结果(请参见13.13节,“算术扩展”)。需要两个百分号(%%)才能输出一个百分号(%)。
13.10.8 变量扩展修饰符
我们可以用一些专用修饰符来测试和修改变量。修饰符首先提供一个简单的条件测试,用来检查某个变量是否已经被设置,然后根据测试结果给变量赋一个值。请参见表13-18列出的变量修饰符。
表13-18 变量修饰符
修 饰 符 |
值 |
${variable:-word} |
如果变量variable已被设置且非空,则代入它的值。否则,代入word |
${variable:=word} |
已被设置且值非空,就代入它的值。否则,将variable的值设为word。始终代入variable的值。位置参量不能用这种方式赋值 |
${variable:+word} |
如果变量variable已被设置且值非空,代入word。否则,什么都不代入(代入空值) |
${variable:?word} |
如果变量variable已被设置且值非空,就代入它的值。否则,输出word并且从shell退出。如果省略了word,就会显示信息:parameter null or not set |
${variable:offset} |
获得变量variable值中位置从offset开始的子串,偏移为从0到串的末尾 19 |
${variable:offset:length} |
获得变量variable值中位置从offset开始长度为length的子串 |
和冒号配合使用时,修饰符(-、=、+、?)检查变量是否尚未赋值或值为空。不加冒号时,值为空的变量也被认为已设置。
范例13-60
(临时替换默认值)
1 $ fruit=peach
2 $ echo ${fruit:–plum}
peach
3 $ echo ${newfruit:–apple}
apple
4 $ echo $newfruit
5 $ echo $EDITOR # More realistic example
6 $ echo ${EDITOR:-/bin/vi}
/bin/vi
7 $ echo $EDITOR
8 $ name=
$ echo ${name-Joe}
9 $ echo ${name:-Joe}
Joe
说明
1. 将变量fruit的值设为peach。
2. 这个专用修饰符将检查变量fruit是否已被设置。如果fruit已被设置,就显示它。否则,用plum替换fruit,并显示该值。
3. 变量newfruit未曾被设置。值apple将暂时替换newfruit。
4. 上一行的设置是暂时的,因此,变量newfruit仍未被设置。
5. 环境变量EDITOR尚未被设置。
6. 修饰符:-将/bin/vi替换为EDITOR。
7. EDITOR未曾被设置过,因此什么都不会打印。
8. 变量name被设为空值。因为修饰符前面没有冒号,变量即使为空也被认为是设置过的,所以没有把新的值Joe赋给变量name。
9. 冒号使得修饰符检查变量是否未设置或为空。只要是这两种情况之一,就用值Joe替换name。
范例13-61
(永久替换默认值)
1 $ name=
2 $ echo ${name:=Peter}
Peter
3 $ echo $name
Peter
4 $ echo ${EDITOR:=/bin/vi}
/bin/vi
5 $ echo $EDITOR
/bin/vi
说明
1. 赋给变量name一个空值。
2. 用修饰符:=将检查变量name是否尚未被设置。如果已经被设置过了,就不会被改变。如果尚未设置或值为空,就将等号右边的值赋给它。由于之前已将变量name设置为空,所以现在要把Peter赋给它。这个设置是持久的。
3. 变量name的值还是Peter。
4. 把变量EDITOR设置为/bin/vi。
5. 显示变量EDITOR的值。
范例13-62
(临时替换值)
1 $ foo=grapes
2 $ echo ${foo:+pears}
pears
3 $ echo $foo
grapes
$
说明
1. 将变量foo的值设置为grapes。
2. 专用修饰符:=将检查变量name是否已被设置。如果已经被设置过,就用pears暂时替换foo。否则,返回空。
3. 变量foo的值还是原来的值。
范例13-63
(基于默认值创建错误信息)
1 $ echo ${namex:?"namex is undefined"}
namex: namex is undefined
2 $ echo ${y?}
y: parameter null or not set
说明
1. 修饰赋:?检查变量是否已被设置。如果尚未设置该变量,就把问号右边的信息打印在标准错误输出上。如果此时是在执行脚本,就退出脚本。
2. 如果问号后面没有提供报错信息,shell就向标准错误输出发送默认的消息。
范例13-64
(创建子串 20)
1 $ var=notebook
2 $ echo ${var:0:4}
note
3 $ echo ${var:4:4}
book
4 $ echo ${var:0:2}
no
说明
1. 给变量赋值notebook。
2. var的子串从偏移0(notebook中的n)开始,长度为4个字符,在e处结束。
3. var的子串从偏移4(notebook中的b)开始,长度为4个字符,在k处结束。
4. var的子串从偏移0(notebook中的n)开始,长度为2个字符,在o处结束。
13.10.9 子串的变量扩展
模式匹配变量用来在串首或串尾截掉串的某一特定部分。这些操作符最常见的用法是从路径头或尾删除路径名元素。如表13-19所示。
表13-19 变量扩展子串
表 达 式 |
功 能 |
${变量%模式} |
将变量值的尾部与模式进行最小匹配,并将匹配到的部分删除 |
${变量%%模式} |
将变量值的尾部与模式进行最大匹配,并将匹配到的部分删除 |
${变量#模式} |
将变量值的头部与模式进行最小匹配,并将匹配到的部分删除 |
${变量##模式} |
将变量值的头部与模式进行最大匹配,并将匹配到的部分删除 |
${#变量} |
替换为变量中的字符个数。如果是*或@,长度则是位置参量的个数 |
范例13-65
1 $ pathname="/usr/bin/local/bin"
2 $ echo ${pathname%/bin*}
/usr/bin/local
说明
1. 给局部变量pathname赋值/usr/bin/local/bin。
2. %删除路径名尾部包含模式/bin,后跟零个或多个字符的最小部分。即删除/bin。
范例13-66
1 $ pathname="usr/bin/local/bin"
2 $ echo ${pathname%%/bin*}
/usr
说明
1. 给局部变量pathname赋值/usr/bin/local/bin。
2. %%删除路径名尾部包含模式/bin,后跟零个或多个字符的最大部分。即删除/bin/local/bin。
范例13-67
1 $ pathname=/home/lilliput/jake/.bashrc
2 $ echo ${pathname#/home}
/lilliput/jake/.bashrc
说明
1. 给局部变量pathname赋值/home/liliput/jake/.bashrc。
2. #删除路径名头部包含模式/home的最小部分。路径变量开头的/home被删除。
范例13-68
1 $ pathname=/home/lilliput/jake/.bashrc
2 $ echo ${pathname##*/}
.bashrc
说明
1. 给局部变量pathname赋值/home/liliput/jake/.bashrc。
2. ##删除路径名的头部包含零个或多个字符,直到并包括最后一个斜杠的最大部分。即从路径变量中删除/home/liliput/jake/。
范例13-69
1 $ name="Ebenezer Scrooge"
2 $ echo ${#name}
16
说明
1. 给变量name赋值Ebenezer Scrooge。
2. ${#variable}语法显示赋给变量name的字符串中字符的个数。字符串Ebenezer Scrooge中有16个字符。