首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

Shell学习札记(二)

2012-09-24 
Shell学习笔记(二)Shell变量基础????? 在Linux预设情况下,使用“大写字母”来设定的变量一般为系统预定义的

Shell学习笔记(二)

Shell变量基础

????? 在Linux预设情况下,使用“大写字母”来设定的变量一般为系统预定义的变量。Bash中有很多预定义的环境变量。系统通过预定义的环境变量来定义shell的环境。

?

【env】命令显示目前系统中主要的预定义变量内容
【set】命令将环境变量和用户自定义变量显示出来
【echo $变量名】命令显示指定的变量

?

????? 在Linux中可以使用【export】命令将用户自定义变量变成环境变量。在启动Shell的时候,系统会给shell分配一块内存,用来存储系统环境变量。【export】命令将用户自定义变量移动到该内存中。当进入子shell时,子shell将父shell的系统环境变量读入到子shell内存中。
????? 为什么要使用export将自定义变量声明成系统环境变量?例如执行某程序需要用到s1和s2两个脚本,但这时s2需要用到s1中声明的变量这时就需要将自定义变量声明成系统环境变量(当整个程序结束后,声明的所有变量包括export的变量也就失效了)
????? 如果直接声明自定义变量仅可以通过【set】查看得到,如果将其通过export声明为系统环境变量则可以在【env】中看到在shell中所有变量的声明和改变仅在当前生命周期有效。
????? 例如自定义变量name,在当前的shell中可以读取,但是通过执行bash进入子shell却发现读取不到在父shell中设置的变量,这是因为name是父shell中的自定义变量,并不是系统的环境变量,如果开始的时候就将该变量通过export声明为系统环境变量,那么再通过bash命令进入子shell的时候还是可以获取到该变量的。

[root@jianshi-21 ~]# name="Zhang san"[root@jianshi-21 ~]# echo $nameZhang san[root@jianshi-21 ~]# bash[root@jianshi-21 ~]# echo $name[root@jianshi-21 ~]# exitexit[root@jianshi-21 ~]# export name[root@jianshi-21 ~]# bash[root@jianshi-21 ~]# echo $nameZhang san[root@jianshi-21 ~]#
?

Bash下变量设定的规则:

    变量与变量内容以“=”来连接,等号两边不能出现空格。变量名只能是英文字母与数字,但是数字不能是开头字符。若有空格符可以使用双引号【”】或单引号【’】来将变量内容结合起来,但是要注意,双引号内的特殊字符可以保持原有的变量特性,但是单引号内的特殊字符只能是一般的字符。必要时可以使用转义字符【\】来将特殊符号转义为一般的符号。(*?<>&![]|\’”`(){}等)在一串指令中,如果还需要由其他的指令提供信息可以使用【`】来连接。若该变量为扩展变量内容时,则需要双引号和$变量名。例如:【PATH=”$PATH”:/home】如果变量需要在其他子程序中使用,可以使用【export】命令将变量变成环境变量,如果只输入【export】命令,则显示系统所有的环境变量。取消变量的方法为:【unset 变量名称】
[root@jianshi-21 ~]# path="/lib/modules/`uname -r`/kernel/fs"[root@jianshi-21 ~]# cd $path[root@jianshi-21 fs]# pwd/lib/modules/2.6.9-89.ELsmp/kernel/fs[root@jianshi-21 fs]#
?

Linux语系配置

????? 在Linux系统中执行【locale -a】命令可以显示系统支持的所有的语系,如果需要改变系统支持的语系可以修改【/etc/sysconfig/i18n】文件的内容。

?

[root@jianshi-21 fs]# localeLANG=en_US.UTF-8LC_CTYPE="en_US.UTF-8"LC_NUMERIC="en_US.UTF-8"LC_TIME="en_US.UTF-8"LC_COLLATE="en_US.UTF-8"LC_MONETARY="en_US.UTF-8"LC_MESSAGES="en_US.UTF-8"LC_PAPER="en_US.UTF-8"LC_NAME="en_US.UTF-8"LC_ADDRESS="en_US.UTF-8"LC_TELEPHONE="en_US.UTF-8"LC_MEASUREMENT="en_US.UTF-8"LC_IDENTIFICATION="en_US.UTF-8"LC_ALL=[root@jianshi-21 fs]#
?

????? 可以通过在shell中设置LANG变量来更改当前的语系,但是当shell结束时设置的语系也就失效了,可以通过配置文件更改默认的语系。

[root@jianshi-21 fs]# LANG=zh_CN.UTF-8[root@jianshi-21 fs]# localeLANG=zh_CN.UTF-8LC_CTYPE="zh_CN.UTF-8"LC_NUMERIC="zh_CN.UTF-8"LC_TIME="zh_CN.UTF-8"LC_COLLATE="zh_CN.UTF-8"LC_MONETARY="zh_CN.UTF-8"LC_MESSAGES="zh_CN.UTF-8"LC_PAPER="zh_CN.UTF-8"LC_NAME="zh_CN.UTF-8"LC_ADDRESS="zh_CN.UTF-8"LC_TELEPHONE="zh_CN.UTF-8"LC_MEASUREMENT="zh_CN.UTF-8"LC_IDENTIFICATION="zh_CN.UTF-8"LC_ALL=[root@jianshi-21 fs]#
?
[root@jianshi-21 fs]# cat /etc/sysconfig/i18nLANG="en_US.UTF-8"SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en"SYSFONT="latarcyrheb-sun16"[root@jianshi-21 fs]#
?

变量的声明与读取

?

read命令

????? read [ -p ][ -r ][ -s ][-u[ n ] ][VariableName?Prompt][VariableName...]

描述:

????? read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量,用 IFS(内部字段分隔符)变量中的字符作为分隔符。VariableName 参数指定 shell 变量的名称,shell 变量获取输入行一个字段的值。由VariableName 参数指定的第一个 shell 变量指定给每一个字段的值,由 VariableName 参数指定的第二个 shell 变量指定给第二个字段的值,以此类推,直到最后一个字段。如果标准输入行的字段比相应的由 VariableName 参数指定的 shell 变量的个数多,把全部余下的字段的值赋给指定的最后的 shell 变量。如果比 shell 变量的个数少,则剩余的 shell 变量被设置为空字符串。

注意: 如果省略了 VariableName 参数,变量 REPLY 用作缺省变量名。由 read 命令设置的 shell 变量影响当前 shell 执行环境。

标志

-p 用 |& (管道,& 的记号名称)读取由 Korn shell 运行的进程的输出作为输入。注:-p 标志的文件结束符引起该进程的清除,因此产生另外一个进程。-r 指定读取命令把一个 \ (反斜杠) 处理为输入行的一部分,而不把它作为一个控制字符。-s 把输入作为一个命令保存在 Korn shell 的历史记录文件中。-u [ n ] 读取一位数的文件描述符号码 n 作为输入。文件描述符可以用 ksh exec 内置命令打开。n 的缺省值是 0,表示的是键盘。值 2 表示标准错误。

参数

VariableName?Prompt 指定一个变量的名称和一个要使用的提示符。当 Korn shell 是交互式时,它将把提示符写到标准错误,并执行输入。Prompt 包含多于一个的字,必须用单引号或双引号括起来。VariableName... 指定一个或多个由空格分隔的变量名。

退出状态,这个命令返回下列出口值:

0 成功完成。>0 检测到文件结束符或一个错误发生。
[root@jianshi-21 fs]# read nameZhang san[root@jianshi-21 fs]# echo $nameZhang san[root@jianshi-21 fs]# read -p "Please input your name:" namePlease input your name:Zhang san[root@jianshi-21 fs]# echo $nameZhang san[root@jianshi-21 fs]#
?
[root@jianshi-21 fs]# read -t 10 -p "Please input your name:" namePlease input your name:Li si[root@jianshi-21 fs]# echo $nameLi si[root@jianshi-21 fs]# read -t 1 -p "Please input your name:" namePlease input your name:[root@jianshi-21 fs]# echo $nameLi si[root@jianshi-21 fs]#
?

declare/typeset命令

????? declare [+/-][arxi][变量名称=设置值] 或 declare -f

补充说明:declare为shell指令,在第一种语法中可用来声明变量并设置变量的属性([rix]即为变量的属性),在第二种语法中可用来显示shell函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。

?

参数:

+/-  "-"可用来指定变量的属性,"+"则是取消变量所设的属性。 -f  仅显示函数。 r  将变量设置为只读。 x  指定的变量会成为环境变量,可供shell以外的程序来使用(仅限于子shell)。 i  [设置值]可以是数值,字符串或运算式。-a?? 声明的变量为数组
[root@jianshi-21 fs]# sum=1+2+3[root@jianshi-21 fs]# echo $sum1+2+3[root@jianshi-21 fs]# declare -i sum=1+2+3[root@jianshi-21 fs]# echo $sum6[root@jianshi-21 fs]# bash[root@jianshi-21 fs]# echo $sum[root@jianshi-21 fs]# exitexit[root@jianshi-21 fs]# echo $sum6[root@jianshi-21 fs]# declare -x sum[root@jianshi-21 fs]# bash[root@jianshi-21 fs]# echo $sum6[root@jianshi-21 fs]# exitexit[root@jianshi-21 fs]# unset sum[root@jianshi-21 fs]# echo $sum[root@jianshi-21 fs]#
?

数组

[root@jianshi-21 fs]# a[1]=dong[root@jianshi-21 fs]# a[2]=li[root@jianshi-21 fs]# a[3]=wei[root@jianshi-21 fs]# echo ${a[1]}${a[2]}${a[3]}dongliwei[root@jianshi-21 fs]#
?

别名

在Linux系统中设置别名使用【alias】命令,取消别名使用【unalias】命令。

?

[root@jianshi-21 fs]# aliasalias cp='cp -i'alias l.='ls -d .* --color=tty'alias ll='ls -l --color=tty'alias ls='ls --color=tty'alias mv='mv -i'alias rm='rm -i'alias vi='vim'alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'[root@jianshi-21 fs]#
?

?

[root@jianshi-21 fs]# alias lm='ls -al | more'[root@jianshi-21 fs]# aliasalias cp='cp -i'alias l.='ls -d .* --color=tty'alias ll='ls -l --color=tty'alias lm='ls -al | more'alias ls='ls --color=tty'alias mv='mv -i'alias rm='rm -i'alias vi='vim'alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'[root@jianshi-21 fs]#
?
[root@jianshi-21 fs]# unalias lm[root@jianshi-21 fs]# aliasalias cp='cp -i'alias l.='ls -d .* --color=tty'alias ll='ls -l --color=tty'alias ls='ls --color=tty'alias mv='mv -i'alias rm='rm -i'alias vi='vim'alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'[root@jianshi-21 fs]#
?
[root@jianshi-21 fs]# dirautofs4  cramfs    ext3  freevxfs  hfsplus  jffs2  msdos  nfs_common  nls    udfcifs     exportfs  fat   hfs       jbd      lockd  nfs    nfsd        smbfs  vfat[root@jianshi-21 fs]# which dir/usr/bin/dir[root@jianshi-21 fs]# type -a dirdir is /usr/bin/dir[root@jianshi-21 fs]#
?

历史命令

【history -n】命令显示最后执行的几个命令,例如history 10显示最后10个执行的命令
history [-crw]
??? -c? 将当前shell中的所有历史命令全部清除
??? -r? 将histfile中的内容读到shell的命令记忆中
??? -w? 将当前历史记忆内容写入到histfile中
【!number】执行第几个指令
【!command】执行以command开头的命令
【!!】执行上一个指令
直接输入【history】可以将当前shell中所有的历史执行命令显示出来

?

[root@jianshi-21 fs]# history    1  ls    2  cd ..    3  ls    4  useradd zhangsan    5  passwd zhangsan    6  exit    7  ls    ......
?
[root@jianshi-21 fs]# history    1  ls    2  cd ..    3  ls    4  useradd zhangsan    5  passwd zhangsan    6  exit    7  ls    ......    146  unalias lm    147  alias    148  dir    149  which dir    150  type -a dir    151  history[root@jianshi-21 fs]#[root@jianshi-21 fs]# !whiwhich dir/usr/bin/dir[root@jianshi-21 fs]#
?

?

热点排行