Shell学习笔记(二)

Poem 2012-08-29

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 $name
Zhang san
[root@jianshi-21 ~]# bash
[root@jianshi-21 ~]# echo $name

[root@jianshi-21 ~]# exit
exit
[root@jianshi-21 ~]# export name
[root@jianshi-21 ~]# bash
[root@jianshi-21 ~]# echo $name
Zhang san
[root@jianshi-21 ~]#
 

Bash下变量设定的规则:

  1. 变量与变量内容以“=”来连接,等号两边不能出现空格。
  2. 变量名只能是英文字母与数字,但是数字不能是开头字符。
  3. 若有空格符可以使用双引号【”】或单引号【’】来将变量内容结合起来,但是要注意,双引号内的特殊字符可以保持原有的变量特性,但是单引号内的特殊字符只能是一般的字符。
  4. 必要时可以使用转义字符【\】来将特殊符号转义为一般的符号。(*?<>&![]|\’”`(){}等)
  5. 在一串指令中,如果还需要由其他的指令提供信息可以使用【`】来连接。
  6. 若该变量为扩展变量内容时,则需要双引号和$变量名。例如:【PATH=”$PATH”:/home】
  7. 如果变量需要在其他子程序中使用,可以使用【export】命令将变量变成环境变量,如果只输入【export】命令,则显示系统所有的环境变量。
  8. 取消变量的方法为:【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]# locale
LANG=en_US.UTF-8
LC_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]# locale
LANG=zh_CN.UTF-8
LC_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/i18n
LANG="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 name
Zhang san
[root@jianshi-21 fs]# echo $name
Zhang san
[root@jianshi-21 fs]# read -p "Please input your name:" name
Please input your name:Zhang san
[root@jianshi-21 fs]# echo $name
Zhang san
[root@jianshi-21 fs]#
 
[root@jianshi-21 fs]# read -t 10 -p "Please input your name:" name
Please input your name:Li si
[root@jianshi-21 fs]# echo $name
Li si
[root@jianshi-21 fs]# read -t 1 -p "Please input your name:" name
Please input your name:[root@jianshi-21 fs]# echo $name
Li 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 $sum
1+2+3
[root@jianshi-21 fs]# declare -i sum=1+2+3
[root@jianshi-21 fs]# echo $sum
6
[root@jianshi-21 fs]# bash
[root@jianshi-21 fs]# echo $sum

[root@jianshi-21 fs]# exit
exit
[root@jianshi-21 fs]# echo $sum
6
[root@jianshi-21 fs]# declare -x sum
[root@jianshi-21 fs]# bash
[root@jianshi-21 fs]# echo $sum
6
[root@jianshi-21 fs]# exit
exit
[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]# alias
alias 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]# alias
alias 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]# alias
alias 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]# dir
autofs4  cramfs    ext3  freevxfs  hfsplus  jffs2  msdos  nfs_common  nls    udf
cifs     exportfs  fat   hfs       jbd      lockd  nfs    nfsd        smbfs  vfat
[root@jianshi-21 fs]# which dir
/usr/bin/dir
[root@jianshi-21 fs]# type -a dir
dir 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]# !whi
which dir
/usr/bin/dir
[root@jianshi-21 fs]#
 

相关推荐