shell的作用及常见的种类

 

介于操作系统内核与用户之间,负责接收用户输入的命令指令并进行解释,即命令解释器
Bsh 
实现了最基本的命令解释功能,同时作为脚本程序语言
Csh 
因使用C语言风格而得名
Ksh 
由AT&T贝尔实验室的David Korm开发完成,兼具Bsh的语法和Csh 的交互性
Bash 
是Bsh的升级代替品,是GNU项目的成员,目前大多Linux版本都使用其作为默认shell
Zsh 更多地基于交互式操作进行设计的shell程序,集成了Bash、Ksh、等多种shell的优点

Shell环境的切换

查看当前linux系统中能够使用的shell程序的列表
[root@localhost ~]# cat /etc/shells

确认shell程序中存在的部分链接文件
[root@localhost ~]# ls -l /bin/*sh

切换至tcsh程序的shell环境 ,并验证是否还能使用help内部指令和外部命令ls
[root@localhost ~]# ksh
# help cd
ksh: help: not found  [没有那个文件或目录]
# ls -l anaconda-ks.cfg
-rw------- 1 root root 1286 10-17 19:46 anaconda-ks.cfg
# exit       //返回原来的Bash环境 

使用teacher用户登录系统,并将自己的登录shell更改为tcsh
[teacher@localhost ~]$ grep "teacher" /etc/passwd
teacher:X:505:505::/home/teacher:/bin/bash
[teacher@localhost ~]$ chsh
Changing shell for teacher.
Password:
New shell [/bin/bash]: /bin/tcsh
Shell changed.
[teacher@localhost ~]$ grep teacher /etc/passwd
teacher:X:505:505::/home/teacher:/bin/tcsh 

由root用户使用usermod命令将teacher用户的登录shell重新修改为“/bin/bash”
[root@localhost ~]# usermod -s /bin/bash teacher
[root@localhost ~]# grep "teacher" /etc/passwd

Bash常用功能

1. 命令历史功能history

可通过编辑文件/etc/profile文件设置历史命令的保存条数(全局)

用户宿主目录中的 ./bash_profile (优先级高)

history -c 清楚命令历史

2. 命令别名

alias 列出所有的名别名

unalias [命令别名] 取消指定的命令别名

unalias -a 取消所有当前环境中设置的命令别名

3. 标准输入输出重定向

Ø 标准输入 默认设备是键盘。文件编号为0

Ø 标准输出 默认设备显示器,文件编号 1

Ø 标准错误 显示器 2

输出重定向 “>” “ >>”

输入重定向 “<” “<<”

错误重定向 “2>” “2>>”

输出,错误输出 可以使用 “>” “2>”重向不同文件。 使用 “&>”重定向同一文件

4. 管道操作

将前面命令的输出作为后边命令的输入

cut 分割通过管道输入的每一行,

-d 使用的分割符合 ,

-f 指定只显示分割出的行

使用“!wh”调用历史命令中最近一次以“wh”开头的命令并执行。
[root@localhost ~]# which fdisk
/sbin/fdisk
[root@localhost ~]# pwd
[root@localhost ~]# !wh

查看用户最后执行的三条历史命令记录
[root@localhost ~]# history | tail -3 

通过“!序号”的形式执行用户历史命令列表中的第830条命令
[root@localhost ~]# !830

将所有用户记录历史命令的条数设置为200
[root@localhost ~]# vi /etc/profile

将用户jerry的历史命令记录的条数设置为5,重新选择后确认效果
[jerry@localhost ~]$ vi ~/.bash_profile
export HISTSIZE=5
[jerry@localhost ~]$ history | wc –l

 

使用teacher用户登录,执行“history –c” 命令已清空自己的命令历史记录。
[teacher@localhost ~]$ history | tail -2
   18  cd
   19  history | tail -2
[teacher@localhost ~]$ history -c
[teacher@localhost ~]$ history
1        history

 

 

 查看已设置的所有命令别名
[root@localhost ~]# alias

 

 

使用预设的别名“ll”实现“ls -l”命令的功能
[root@localhost ~]# ll install.log

 

 

设置一个命令别名dir,以便执行“ls –ld –color=tty”的命令,并进行确认。
[root@localhost ~]# alias dir='/bin/ls -ld --color=tty'
[root@localhost ~]# alias dir
alias dir='/bin/ls -ld --color=tty'
[root@localhost ~]# dir install.log
-rw-r--r-- 1 root root 36318 10-17 19:46 install.log

 

 

取消上一步设置的dir命令别名。
[root@localhost ~]# unalias dir
[root@localhost ~]# alias dir
-bash: alias: dir: not found

 

 

取消用户当前环境中已设置的所有命令别名。
[root@localhost ~]# unalias -a
[root@localhost ~]# alias       //将查不到任何别名信息

 

 

查看teacher用户的身份信息,并将输出结果保存到文件“idtch.txt”中。
[root@localhost ~]# id teacher > idtch.txt
[root@localhost ~]# cat idtch.txt

 

 

查看jerry用户的身份信息,并追加到文件“idtch.txt”中,不覆盖文件的原有内容。
[root@localhost ~]# id jerry >> idtch.txt 
[root@localhost ~]# cat idtch.txt 

 

 

在文件“pw.txt”中保存初始密码“123456”,并使用该文件为jerry用户设置密码。
[root@localhost ~]# vi pw.txt
123456
[root@localhost ~]# passwd --stdin jerry < pw.txt

 

 

尝试使用help命令查看ls命令的帮助信息时,由于ls并非内部命令,系统将会报错,通过“2>”操作符可以将报错信息重定向到指定的文件中。
[root@localhost ~]# help ls 2> err.log
[root@localhost ~]# cat err.log

 

 

使用ls命令查看“/etc/password”文件(并不存在)和“/etc/passwd”文件的属性时,输出结果将同时包含标准输出和错误输出。测试进行分别重定向、合并重定向的结果。
[root@localhost ~]# ls -l /etc/password /etc/passwd > std.txt 2> err.log
[root@localhost ~]# cat std.txt
-rw-r--r-- 1 root root 2135 10-17 23:21 /etc/passwd
[root@localhost ~]# cat err.log
ls: /etc/password: 没有那个文件或目录
[root@localhost ~]# ls -l /etc/password /etc/passwd &> out.log
[root@localhost ~]# cat out.log
ls: /etc/password: 没有那个文件或目录
-rw-r--r-- 1 root root 2135 10-17 23:21 /etc/passwd

 

 

过滤出“/etc/inittab”文件中不以“#”号开头的行,并再次过滤出非空行,将结果重定向保存为“inittab.txt”文件。
[root@localhost ~]# grep -v "^#" /etc/inittab | grep -v "^$" > inittab.txt
[root@localhost ~]# cat inittab.txt

 

 

找出系统中使用Bash作为登录shell、名称以“ha”开头的用户账号,并只显示出用户名、登录shell两个字段的内容。
[root@localhost ~]# grep "bash" /etc/passwd | grep "^ha" | cut -d ":" -f 1,7

 

 

查看当前系统的总内存空间、剩余可用内存空间(MB),去除其他无关信息。
[root@localhost ~]# free -m | head -2
             total       used       free     shared    buffers     cached
Mem:          1010        467        542          0         32        381
[root@localhost ~]# free -m | grep "Mem" | awk '{print $2,$4}'
1010 542

 

 

 

 

用户自定义变量

 

1. 定义新的变量

 

变量名=变量值

 

 

2. 查看和引用变量的值

echo $变量名 echo回显 $调用变量

3. 为变量赋值的常用方法

"双引号允许使用$来引用其他变量

 

 

'单引号: 不允许引用其他变量,$或其他任何符号将作为普通字符看待

、反撇号:允许执行特定命令的输出结果赋给变量  

read命令: 结合 –p 选项使用,告知用户应该输入的内容等相关事项

 

4.改变变量的作用范围

 

 

局部变量  对用户自定义的变量,默认情况下只能在shell环境中使用

 

全局变量  export可以同时指定多个变量名作为参数,可以同时指定变量名并赋值

 

5.清除自定义变量

 

 

unset [变量名]

 

6.数值变量的运算

 

expr 变量1 运算符 变量2 运算符 [运算符 变量3] ………….

加法

减法

\* 乘法

除法

取余

 

 

环境变量

 

 

linux系统预先定义好的一类变量(配置文件 /etc/profile文件及用户宿主目录中的 .bash_profile)

 

 

se通过不带任何参数的set命令查看系统中所有的shell变量

$USER / $LOGNAME 当前用户的登录名

$UID 当前用户的UID号

$SHELL 当前用户使用的shell

$HOME 当前用户的宿主目录

$PWD 当前用户的工作目录

$PATH 当前用户的命令搜索路径

$PS1 $PS2 当前用户的主提示符和辅助提示符

 

位置变量

 

 

 

方便命令行给程序提供操作参数除第一个字段、命令或脚本名称以外,其余参数从左到右依次赋值给变量位置参数序号 1——9

 

$0 所执行的命令或脚本程序的名称

预定义变量
是由Bash程序预先定义好的一些特殊变量

$#
 命令行中位置参数的数量

$* 所有位置参数的内容

$? 命令行执行后返回的状态,用于判断上一个命令是否正确,0正确

$$ 当前的进程号

$0 当前的进程名

$! 后台运行的最后一个进程的进程号

 

 

 新建立一个名为“DAY”的变量,初始内容设置为“sunday”。
[root@localhost ~]# DAY=Sunday

 

 

 查看变量DAY的内容,比较使用“$”符号与不使用“$”符号的区别。
[root@localhost ~]# echo DAY
[root@localhost ~]# echo $DAY

在变量DAY的内容后紧跟“MorningBus”字符串并在一起显示。
[root@localhost ~]# echo $DAYMorningBus    //错误引用
[root@localhost ~]# echo ${DAY}MorningBus

确认变量DAY的内容,并使用双引号为TODAY变量赋值‘Today is $DAY’。
[root@localhost ~]# echo $DAY
sunday
[root@localhost ~]# TODAY="Today is $DAY"
[root@localhost ~]# echo $TODAY
确认变量DAY的内容,并使用单引号为TODAY变量赋值‘Today is $DAY’。
[root@localhost ~]# echo $DAY
sunday
[root@localhost ~]# TODAY='Today is $DAY'
[root@localhost ~]# echo $TODAY
Today is $DAY

 

 

统计当前登录到本地终端(tty1~tty6)中的用户数量,并将结果保存到变量UserNum中。
[root@localhost ~]# UserNum=`w | grep "tty" | wc -1`
[root@localhost ~]#echo $UserNum

 

 

用一行命令找出安装了fdisk程序的软件包名称(需要先确定fdisk程序的文件位置)。
[root@localhost ~]# rpm -qf `which fdisk`
util-linux-2.13-0.56.el5

 

 

通过find命令找出系统中hackli用户留下的文件或目录,并使用rm命令将其删除。
[root@localhost ~]# rm -rf `find /home -user hackli`

 

 

还是使用一行命令,将上一个例子的输出结果保存到变量FdiskPKG中。
[root@localhost ~]# FdiskPKG=$(rpm -qf $(which fdisk))
[root@localhost ~]# echo $FdiskPKG 
util-linux-2.13-0.56.el5

 

 

从键盘输入一整行数据,赋值给变量HELO,并确认HELO变量的内容。
[root@localhost ~]# read HELO
good morning ,teacher!     
[root@localhost ~]# echo $HELO 
good morning ,teacher!

 

 

从键盘输入一整行数据,依次赋值给变量G1、G2,并确认G1、G2变量的内容。
[root@localhost ~]# read G1 G2
good morning,teacher!
[root@localhost ~]# echo $G1
good
[root@localhost ~]# echo $G2
morning,teacher!

 

 

从键盘读入一个数值变量,并给出相应的提示信息。
[root@localhost ~]# read -p "please input a number:" YourNum
please input a number:501
[root@localhost ~]# echo $YourNum 
501

 

 

在当前shell环境中定义一个变量FILESVR,开启一个新的子shell进程(Bash或Zsh等),处于子shell环境中时将无法使用变量FILESVR的内容。
[root@localhost ~]# FILESVR=filesvr.benet.com
[root@localhost ~]# zsh
[root@localhost ~]# echo $FILESVR 

[root@localhost ~]# exit
[root@localhost ~]# echo $FILESVR 
filesvr.benet.com

 

 

确认变量FILESVR的内容,并将其设置为全局变量,在子shell、当前shell环境中进行验证。
[root@localhost ~]# echo $FILESVR
filesvr.benet.com
[root@localhost ~]# export FILESVR 
[root@localhost ~]# zsh
[root@localhost ~]# echo $FILESVR    //在子shell环境中也可以使用该变量
filesvr.benet.com
[root@localhost ~]# exit
[root@localhost ~]# echo $FILESVR    //返回原shell环境中仍然能使用该变量

定义两个变量MONTH、YEAR,并将其设置为全局变量。

[root@localhost ~]# export MONTH=May YEAR=2009
[root@localhost ~]# echo $MONTH $YEAR

清除已设置的变量DAY、MONTH、YEAR。
[root@localhost ~]# unset DAY MONTH YEAR
[root@localhost ~]# ECHO $DAY $MONTH $YEAR

置变量X、Y的值分别为34、12,依次计算变量X、Y的加减乘除及取模运算结果。
[root@localhost ~]#  expr $X + $Y
46
[root@localhost ~]# expr $X - $Y
22
[root@localhost ~]# expr $X \* $Y
408
[root@localhost ~]# expr $X / $Y
2
[root@localhost ~]# expr $X % $Y
10

 

 

 计算变量X的值与数值“123”的和,并将计算结果重新赋值给变量X。
[root@localhost ~]# echo $X
34
[root@localhost ~]# X=`expr $X + 123`
[root@localhost ~]# echo $X
157

 

 

分页查看系统环境中设置的shell变量。
[root@localhost ~]# set | less

以分号分隔,显示当前用户的用户名、宿主目录、登录shell。
[root@localhost ~]# echo "$USER:HOME:SHELL"

确认当前的命令搜索路径,并将“/opt/bin”目录添加到现有的搜索路径中去。
[root@localhost ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# PATH="/opt/bin:PATH"
[root@localhost ~]# echo $PATH
/opt/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

 

在当前用户环境中,将用于限制历史命令条数的环境变量HISTSIZE的值改为24.
[root@localhost ~]# history | wc -l
229
[root@localhost ~]# export HISTSIZE=24
[root@localhost ~]# echo $HISTSIZE
24
[root@localhost ~]# history | wc -l
24 

编辑“~/.bash_profile”文件,修改PATH的设置,以便用户在下次登录后能够使用“/opt/bin”目录作为默认搜索路径。
[root@localhost ~]# vi ~/.bash_profile

验证预定义变量$0、$$、$?的作用。
[root@localhost ~]# bash              //开启一个新的进程
[root@localhost ~]# echo $0 $$         //显示当前的进程名称、PID号
bash 2040
[root@localhost ~]# exitt              //执行一个错误命令
bash: exxit: command not found        
[root@localhost ~]# echo $?           //返回值非0,表示上一条命令执行失败
127
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $?           //返回值为0,表示上一条命令执行成功
0