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给用户
MAILCHECKshell检查MAIL文件的周期,单位是秒
MAILPATH功能与MAIL类似,但可以用一组文件,以冒号分隔,每个文件后可跟一个问号和一条发向用户的消息
SHELLshell的路径名
TERM终端类型
TMOUTshell自动退出的时间,单位为秒,若设为0则禁止shell自动退出
PROMPT_COMMAND指定在主命令提示符前应执行的命令
PS1主命令提示符
PS2二级命令提示符,命令执行过程中要求输入数据时用
PS3selcet的命令提示符
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个字符。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值