本次记录bash shell基础知识及bash变量功能,bash操作环境的配置内容,涉及解释什么是shell?、bash变量的定义和引用、怎样读入与设定bash的环境配置文件等。
Shell的基本概念
1. Shell是什么?
Linux系统由3个重要部分组成:
w 内核(kernel)
w Shell
w 应用程序
内核真正在控制着计算机系统上的各种硬件与软件。功能包括进程管理、内存管理、设备管理、文件系统管理等等。
内核相当抽象,使用者不易和它直接通信,因此需要一个良好的接口,使得操作时更方便,而Shell就是一个连接系统核心与操作者之间的沟通接口。Shell用来负责接收使用者输入的指令,然后把指令解译成内核能够理解的形式,传给内核执行工作,并且将结果传回到默认输出设备。
简单言之,我们可以通过Shell程序来操作各种应用程序,让这些应用程序调用内核来运行所需的工作。
不只是Linux有Shell,其他操作系统也有,如DOS的COMMAND.COM、Windows和Mac OS的GUI图形界面接口都Shell的一种,只不过Shell表现方式不一样而已。
只要能够操作应用程序的接口都能够称为Shell。狭义的Shell指的是CLI方式的软件,如bash、csh、zsh等。广义的Shell则包括GUI界面的软件。
2. Shell的简单历史
第一个重要的Shell是Bourne Shell。如此命名是为了纪念此Shell的发明者Steven Bourne,简称sh。
第一个广为流行使用的Shell是由柏克莱大学的Bill Joy设计依附于BSD版的UNIX系统中的Shell,因为此语法有点类似C语言,所以才得名为C Shell,简称csh。
Linux distribution默认使用这个版本称为”Bourne Again Shell”(简称bash),这个Shell是Bourne Shell的增强版本,也是基于GNU的架构下发展出来的。
查看Linux系统可以使用的Shell:
[root@www ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
Bash shell是一种命令解释器,通过对程序做语法分析后,确定哪些是指令,哪些是参数,哪些是数据,并交给内核处理完成。
3. Bash shell的功能
1) 命令记忆能力(history)
2) 命令与文件补全功能
3) 命令别名设置功能(alias)
4) 工业控制(job control)能力
5) 程序设计的能力(程序脚本)
Bash Shell的变量功能
1. 什么是变量?变量类型有哪些?
变量就是存储可变数据的内存空间(名称空间)。
bash环境有哪几种变量:
一、按照其作用范围及功能划分
1) 环境变量
其作用范围为当前shell进程及其子进程
2) 本地变量
其作用范围为当前shell进程
3) 局部变量
其作用范围仅为当前shell进程中只有特定程序可以访问的(通常为函数)
4) 位置参数变量
在向脚本传递参数时,引用此变量来获取参数
5) 特殊变量
Bash内建的,用来保存特殊的相关值
二、根据变量定义方式不同划分:
1) 内建变量
无须定义,可直接调用
2) 自定义变量
使用者自己命名,由bash自动分配空间
三、bash变量值类型有数值型、字符型两种。
数值:整数型、浮点数型
字符:ASCII
四、语言对变量类型的支持不同:强类型和弱类型
bash变量属于弱类型,一般来说无须事先声明就可以调用。由于弱类型中变量类型不严格区分,除非使用内置命令declare特别指定变量的形态。bash Shell默认把任何存储在变量中的值,皆视为以字符组成的“字符串”。
设定变量值后,该变量值只在当前的Shell环境中有效。也就是说,每一个Shell环境都会维护一份它们自己的变量空间,彼此互不影响。
2. 变量的命名与定义
a. 变量名称,可使用英文字母、数字及下划线组成,但须字母开头,不可用数字,注意区分字母大小写。
变量命名时最好赋予意义,使得日后维护程序代码,较容易了解其用途。
b. 定义变量,或者说变量赋值,方法比较简单。
格式:变量名称=值
如:myname=tom
如果变量值为字符串的话,用双引号或单引号括起来。
Mystr=“Hello world!”或‘Hello world!’
3. 变量的设置规则
变量值指得是变量名称所代表的内存空间中所存储的内容。
取变量值的方法,是在变量名称前加$,即:
$变量名称 或 ${变量名称}
接着,用echo命令把变量的值显示出来
myname=allen
echo $myname
echo ${myname}
请注意变量在设置时,还需符合某些规定:
(1) 变量内容若有空格符可使用双引号“”或单引号‘’将变量内容结合起来
双引号内的特殊字符如$等,可以保有原本的特性。
var=”lang is $LANG”
echo $var
lang is en_US
单引号内的特殊字符则仅为一般字符(纯文本)形成一个所见即所得的字符串
var=’lang is $LANG’
echo $var
lang is $LANG
(2) 若变量的后面接有其他英文单词或下划线,须用{}隔开$和变量名称,否则bash shell 无法正确判断变量。
yourname=ken
echo hi, ${yourname}Mmmm…
要是不用{},变成echo hi, $yournameMmmm…,bash shell会以为要取用的是yournameMmmm变量的内容,但该变量并未定义过,故其内容为空。
(3) $放在变量名称之前,表示要取变量值,但如果要显示$这个符号,得使用转义字符”\”将其变成一般字符。
n=0
echo \$n 或 echo ‘$n’
$n
(4) 若需引用其他命令,可使用反单引号 `COMMAND` 或 $(COMMAND)
vesion=$(uname -r)
echo $version
2.6.32-573.el6.x86_64
(5) 若该变量为了增加变量内容时,则可用$变量名称或${变量}累加内容
PATH=”$PATH”:/home/bin
(6) 若该变量需要在其他子进程执行,export可以向后面的shell传递变量的值
export myname
4. 取消与清空变量
(1) 取消变量就是把变量由变量空间中释放。
取消变量的方法:使用unset
unset 变量名称
unset �Cv 变量名称
选项-v表示要取消的是变量
unset �Cf 函数名称
选项-f表示要取消的是函数
(2) 清空变量
unset不但把变量的内容取消,而且让变量不存在。而清空变量是把变量的内容删除,其值为null,但该变量仍然存在(内存空间)。
变量名称=
5. 变量的有效范围
变量一旦设定之后,仅在各自的shell环境中有效,它无法影响其他shell环境中的变量。
环境变量=全局变量
自定义变量=局部变量
如果使父进程中定义的变量可以被子进程引用的话,可使用export VAR_NAME命令。
当子shell产生时,它会继承父shell的环境变量等条件,因此,只要变量成为环境变量,就能为子shell取用。
如果希望shell script在现行shell环境中执行,可使用 . Script_FILE或source Script_FILE。
Linux环境变量能提升使用者shell体验。很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息。
1) 什么是环境变量
bash shell用一个称作环境变量(environment variables)的特性来存储有关shell会话和工作环境的信息。
在bash shell中环境变量分为两类:全局变量和局部变量
2) 全局环境变量
全局环境变量不仅对shell会话可见,对所有shell创建的子进程也可见。
系统环境变量一律使用全部大写字母以区别于普通用户的环境变量。
查看当前全局环境变量,可用env或printenv命令
[root@www ~]# env
HOSTNAME=www.contoso.com <--这台主机的主机名
SELINUX_ROLE_REQUESTED=
TERM=xterm <--这个终端使用的环境是什么类型
SHELL=/bin/bash <--目前环境shell类型
HISTSIZE=1000 <--记录命令历史条数
SSH_CLIENT=172.16.10.100 50761 2222
SELINUX_USE_CURRENT_RANGE=
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/0
USER=root <--目前环境中的使用者名称
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root <--该用户所取用的mailbox位置
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin <--执行文件命令查找路径
PWD=/root <--目前用户所在的目录
LANG=zh_CN.UTF-8 <--语系
SELINUX_LEVEL_REQUESTED=
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root <--该用户的家目录
LOGNAME=root <--登录主机的用户名称
QTLIB=/usr/lib64/qt-3.3/lib
CVS_RSH=ssh
SSH_CONNECTION=172.16.10.100 50761 172.16.10.101 2222
LESSOPEN=||/usr/bin/lesspipe.sh %s
DISPLAY=localhost:10.0
G_BROKEN_FILENAMES=1
_=/bin/env
3) 局部环境变量
它只能在定义它们的进程中可见。
查看所有变量(含环境变量与自定义变量),可用set命令
Bash Shell的操作环境
我们在登录Linux主机的时候,屏幕会出现一些说明文件,比如版本之类的信息,还有用户一些信息或欢迎文字。此外我们习惯的环境变量、命令别名等是否可以登录就主动帮我们设置好了。此外这些设置值又分为系统全局设置值与个人喜好设置值。
1. 路径与命令查找顺序
基本上命令运行的顺序可以这样看:
1. 以相对/绝对路径执行命令,例如“/bin/ls”或“./ls”;
2. 由alias找到命令来执行;
3. 由bash内置的(builtin)命令来执行;
4. 通过$PATH这个变量的顺序找到的第一个命令执行。
如果想要了解命令查找的顺序,其实通过type �Ca COMMAND也可以查询得到。
2. bash的登录与欢迎信息
1) /etc/issue配置文件
其内容显示在本地tty1-tty6没有登录的情况下login提示符之前的信息。
issue内的各代码意义:
\d: 显示本地端日期
\t: 显示本地端时间
\l: 显示第几个终端机接口
\m: 显示硬件的等级(i386/i486/i586/i686…)
\n: 显示主机网络名称
\o: 显示domain name
\r: 显示操作系统发行版本(相当于uname -r)
\s: 操作系统名称
\v: 操作系统版本
CentOS release 6.7 (Final) (Terminal: \l)
Date: \d \t
The Server Kernel is \r on an \m
Welcome to Product Enviroment...
1) /etc/issue.net配置文件
此文件是提供给telnet远程登录程序用的。
2) /etc/motd配置文件
其内容显示在本地tty1-tty6用户成功登录系统之后的信息。
/etc/motd即messageoftoday(布告栏信息),每次用户登录时,/etc/motd文件的内容会显示在用户的终端。系统管理员可以在文件中编辑系统活动消息,例如:管理员通知用户系统何时进行软件或硬件的升级、何时进行系统维护等。
3. bash的环境配置文件
因为系统中有一些环境配置文件的存在,让bash在启动时直接读取这些配置文件,以规划好bash的操作环境。而这些配置文件可分为系统全局配置文件以及用户自定义配置文件。
当用户登录Linux系统启动一个bash shell时,默认情况下bash会在几个配置文件中查找指令。bash检查的配置文件取决于启动bash shell方式。
启动bash shell有3种方式:
1) 登录时当做默认登录shell
2) 作为非登录shell的交互式shell
3) 作为运行脚本的非交互shell
a. 登录shell
当用户通过tty1-tty6登录Linux系统时,bash shell会作为login shell启动。login shell会从4个不同的配置文件里读取命令。其处理次序:
/etc/profile 系统默认的bash shell的主配置文件,系统上每个用户登录时都会执行此文件
~/.bash_profile或~/.bash_login或~/.profile 提供用户专属的配置文件来定义用户专有的环境变量。大多数Linux发行版只用这3个配置文件中的一个,而读取的顺序则是依照上面的顺序。
/etc/profile.d/*.sh 规定了bash操作接口的颜色、语系、一些命令别名等。
b. 交互式shell
如果用户的bash shell不是登录系统时启动的,称为交互式shell。
处理次序:
~/.bashrc 会去用户家目录检查 .bashrc是否存在
此文件有两个作用:一是查看/etc目录下的共用bashrc文件,二是为用户提供了一个定制自己的命令别名和私有脚本函数的地方。
通用的/etc/bashrc启动文件会被系统上每个启动交互式shell会话的用户执行。它帮我们定义出下面的数据:
1) 依据不同的UID规定umask的值;
2) 依据不同的UID规定提示符(就是PS1变量);
3) 调用/etc/profile.d/*.sh的设置
万一没有~/.bashrc文件,无法调用/etc/bashrc来规定PS1变量,如果想要将命令提示符调回来,那么可以复制/etc/skel/.bashrc到用户主文件夹内。
4. 读入环境配置文件的命令
一般环境配置文件修改过后,需注销再登录后该设置才会生效。
能不能直接读取配置文件而不注销登录呢?
利用source或 . 都可以将配置文件的内容读进目前的shell环境中。
本文出自 “Craft Life” 博客,请务必保留此出处http://allenh.blog.51cto.com/481430/1697648