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 $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下变量设定的规则:
- 变量与变量内容以“=”来连接,等号两边不能出现空格。
- 变量名只能是英文字母与数字,但是数字不能是开头字符。
- 若有空格符可以使用双引号【”】或单引号【’】来将变量内容结合起来,但是要注意,双引号内的特殊字符可以保持原有的变量特性,但是单引号内的特殊字符只能是一般的字符。
- 必要时可以使用转义字符【\】来将特殊符号转义为一般的符号。(*?<>&![]|\’”`(){}等)
- 在一串指令中,如果还需要由其他的指令提供信息可以使用【`】来连接。
- 若该变量为扩展变量内容时,则需要双引号和$变量名。例如:【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]# 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]#