shell的作用及常见的种类
介于操作系统内核与用户之间,负责接收用户输入的命令指令并进行解释,即命令解释器 Bsh 实现了最基本的命令解释功能,同时作为脚本程序语言 Csh 因使用C语言风格而得名 Ksh 由AT&T贝尔实验室的David Korm开发完成,兼具Bsh的语法和Csh 的交互性Bash 是Bsh的升级代替品,是GNU项目的成员,目前大多Linux版本都使用其作为默认shellZsh 更多地基于交互式操作进行设计的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)
set 通过不带任何参数的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 $HISTSIZE24
[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