shell变量

参考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 用户登录名
MAIL 指向一个需要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 寻找库的路径,以冒号分隔

 


定义数组

为单个元素赋值 name[index]=value

为整个数组赋值 name=(value1 value2... valuen) 各个元素以空格分离。或name=([0]=value0 [3]=value3 [5]=value5)

访问单个值 ${name[index]}

访问整个数组 ${name[*]}或${name[@]} 可以处理包含空格的数组元素,推荐使用。



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的系统的串

MAIL

如果该参数被设置为某个邮件文件的名称,而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个字符。



你可能感兴趣的:(shell变量)