Linux 学习作业:认识bash shell

时间:2021-05-06 22:12:24

本次记录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。

6. Linux环境变量

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个配置文件中的一个,而读取的顺序则是依照上面的顺序。

Linux 学习作业:认识bash shell

/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