admin 管理员组文章数量: 887839
2023年12月17日发(作者:属性与生活2女友攻略)
shell
UNIX命令解释器
Shell-UNIX命令解释器
问题引入:
DOS系统的命令由command负责执行,并且对重复性或多个命令运行可写成批处理文件,只要执行这个批处理文件就等於执行这些命令。UNIX系统如何处理?
Shell: shell是一种命令语言,同时又是一种程序设计语言。
UNIX系统利用shell命令解释器(command-language interpreter) ,完成用户输入命令的执行,是用户与系统交互的界面,是命令与kernel之间的接口。
shell接收用户输入的命令,对命令作出解释,然后发送给kernel执行之。
shell的另一个重要特性就是它自身是一个解释型的程序设计语言。
shell程序( 脚本)相当于dos的批处理文件,可简单到只有一条命令,也可以包括大量循环、条件语句、数学运算、控制结构的程序,完成复杂的管理任务。
shell命令和UNIX程序的区别1
shell命令和UNIX程序都是系统的实用程序,但两者又有区别:
UNIX系统规定用户键入任何命令,均被 shell所解释。
UNIX命令包括两种类型:
一种命令是shell内建的命令集。包含在kernal内部(就象DOS的内部命令)。如命
令pwd、history 。
另一种是存在于文件系统中某个目录下的实用或应用程序(utilities and application
programs)。如命令cp、rm等。
系统管理员应该掌握命令的类型区别。
一旦注册用户登录到系统后, shell就被系统装入内存,并一直运行到用户退出系统之止;而一般UNIX命令仅当被调用时,才由系统装入内存执行
shell命令和UNIX程序的区别2
shell 执行命令时:
step 1、 shell 首先检查输入命令是内部命令,执行之。
step 2、 对非内部命令,检查是否是一个程序。shell在搜索路径里寻找该程序。直到找到可执行程序文件,执行之。
shell的内部命令或应用程序将被分解为系统调用并传给Linux内核。
如果键入的命令:
(1)不是一个内部命令
(2)在路径里没有找到程序
(3)程序不具备可执行的权限文件
将会显示一条错误信息。终止进程。
shell语言特点
shell允许通过编程来完成复杂的功能处理,但其作为语言与高级语言相比较具有不同的特点:
(1) shell是解释性的,多数高级语言是编译性的;
(2) shell语言与高级语言处理的对象不同;
(3) shell与系统有密切的关系;
(4) shell易编写、调试、灵活性较强,但速度低;
(5) shell作为命令级语言,命令组合功能很强。
Shell种类
UNIX操作系统具有多种 Shells种类,彼此不兼容。其中应用较多的有三种:
Bourne shell (bash)
为 AT&T UNIX 环境而开发。是Solaris、Linux的缺省shell。
超级用户的提示符#,普通用户的提示符$
工作路径 /usr/bin/sh
Korn shell (ksh)
Bourne shell的一个超级。它增加了别名、历史记录以及命令行编辑等功能。
超级用户的提示符#,普通用户的提示符$
工作路径 /usr/bin/ksh
C shell (csh)
C shell的语法类似于C语言。
超级用户的提示符#,普通用户的提示符%
工作路径 /usr/bin/csh
bash的特点
(1)自动补全功能
对于要输入的命令很长,仅需输入开始的部分命令字符,再按一个Tab键,bash就会在可能的命令类中找寻匹配的命令,找到的话就会自动补齐。用户输入的字符越多,bash搜寻匹配的命令就越容易找到。
(2)命令行编辑程序
bash的命令行编辑是在提示符下,可对未执行的命令字符任意地修改,即使拼错了也不需要重新输入整个命令,只需在执行命令前使用左右方向键移动光标,用backspace键或del键删除字符来编辑打错的命令,利用编辑功能纠正错误。
(3)命令历史(command history)
所谓的命令历史就是把曾经输入过的命令记录起来,方便查询与再使用。bash利用上、下键就可以显示和选择以前输入过的命令。
shell的启动
1.系统在用户登录时启动shell
系统引导过程中,需要调用login进程,负责验证用户身份,验证后把控制权交给 shell程序。shell根据环境文件建立系统范围内的工作环境和该用户自己的工作环境,最后显示命令提示符(#、$、%)。
在/etc/passwd文件中指定要启动的 shell,如下所示:
root:x:0:0 : root:/root:/bin/bash
jobn:x:701: 10 : Certer starf:/home/john:/bin/csh
2.命令行状态下的交互shell启动
在系统中可能有多种版本的shell存在,可通过相应的命令来启动,如:
$ bsh
$ ksh
$ csh
3.执行用户命令时启动 shell
由系统生成新的子shell来执行该命令。
管道与命令表
管道:
一个命令的标准输出是另一个命令的标准输入,不经过任何中间文件;
管道操作符:用符号“|”表示。
例: ps –ef | grep ftp
命令表:
由命令分隔符连接的命令序列。命令分隔符如下:
;表示按顺序执行命令;
command1;command2;command3
&& 表示根据条件(true),执行其后的命令;
command1 &&command2
|| 表示根据条件(false),执行其后的命令;
command1 || command2
管道与命令表
例: $ ls –l /etc/rc
$ who|wc –l
$ ps
等价于 $ ls –l /etc/rc ; who|wc –l ; ps
例: $ copy || echo UNIX has no such command!
UNIX has no such command!
$
例: $ who l grep liu || echo Liu is not logged in
Liu is not logged in
$
例: $ who l grep root && mail john < letter
root tty1 may 11 17:30
$
后台执行命令 &
使用权限 : 所有使用者
使用方式 : command &
说明 : 系统在运行时,一条命令由一个进程执行。只有前一条命令的进程执行结束,才调度运行下一条命令进程。后台执行命令则无须当前命令运行结束,shell程序就开始执行新的命令(异步执行)。
例:
$ cc prog.c &
[1] 307
$ ls
dir1 dir2 dir3 dir4 dir5
[1] Done cc prog.c
$
反引号 ‘ ‘
使用权限 : 所有使用者
使用方式 : ‘command ‘
说明 : 反引号内的字符作为命令执行。
例:
$ each The current time is ‘ date ‘
The current time is May 15 17:43:23 2002
例:
$ each The current path is ‘ pwd ‘
The current path is /home/liu例:
$ each The current path is pwd
The current path is pwd
反引号 ’ ’
使用权限 : 所有使用者
使用方式 : ’command ’
说明 : 禁止单引号内的任何语法分析。
例:
$ each The current time is ‘ date ‘
The current time is May 15 17:43:23 2002
例:
$ each ’ The current time is ‘ date ‘ ’
The current time is ‘ date ‘
转义符
使用权限 : 所有使用者
使用方式 : char
说明 : 禁止转义符后的单个字符进行语法分析。
例:
$ each The current time is ‘ date ‘
The current time is ‘ date ‘
例:
$ each The current time is ‘ date ‘
>bsah: unexpected EOF while looking for ’ ‘ ’
>bsah: syntax error
$
标准输入、输出和错误处理文件
shell 解释执行一条UNIX命令的时,同时启动了系统的监控程序,用于跟踪和监视该命令的输入、输出和执行情况。这种监督机制通过系统的3种“标准文件” 执行的。它们分别用不同的文件描述字表示。
(1)标准输入文件:
描述命令获得输入数据。用文件描述字0表示,一般指键盘输入 。
(2)标准输出文件:
描述接收命令的输出。用文件描述字1表示,一般为屏幕输出信息。
(3)标准错误处理文件:
接受命令产生的任何错误信息。用文件描述字2表示,一般回显于屏幕输出信息。
输入、输出重定向
1.使用改向符进行标准输入重定向
<输入改向
<<追加输入改向
2.使用改向符进行标准输入重定向
>输出改向
>>追加输出改向
3。标准错误输出的改向(>、>>)
格式为:
command 2>file
command 2>>file
输入、输出重定向
例1:将myfle1作为sort的输入。
$ sort<myflle1
例2:将date的输出转向到myfile2文件中。
$ date>myfile2
例3:将Is-l的输出追加到myfile3文件中。
$ Is -l> > myfile3
例4:将myprogram错误输出改向到err_file文件。
$ myprogram 2 >err_file
例5;将标准输出和错误输出改向oult文件。
$ am myprogr>out 2>>out
Shell变量
shell变量分为两大类:
标准的bash变量
UNIX系统定义和提供,用于设置系统的运行l环境 。
用户可以引用和修改。
变量显示与引用: echo $变量名
用户定义的shell变量
注册用户根据需要自行定义。
变量名=值
变量显示与引用: echo $变量名
标准的bash变量
UNIX的执行环境由shell标准变量定义、维护和管理。
标准变量名由大写字母和数字组成。用户可重新设置之。
$HOME 设置用户的注册目录,也就是用户登录、开始工作的目录。
~ 同$HOME
$SHELL 设置用户的shell类型,值为/bin/bsh使用的是 bash shell。
$TERM 该变量用来定义终端的类型,如 VT100。
$USER 该变量用来标记当前的用户注册名。
$PATH 定义查找命令的目录列表,目录名之间用冒号隔开。
$PWD 定义用户在文件系统目录中的位置。
$? 定义命令退出码。
$# 定义shell实用程序调用时参数的个数。
$PS1 定义 shell的主提示符。
$PS2 定义第二个提示符。
$SHELL
$SHELL变量保存了注册shell的全路径名称。该名字定义在文件/etc/passwd的最后一个字段。
例:
$ echo $SHELL
/bin/bash
$
这说明当前正在使用的shell是hash shell。
$TERM
$ TERM变量用于标识用户的终端类型。
终端性能定义在文件etc/termcap中,它规定各种终端的控制代码及换码顺序。不同终端类型的参数都定义在该文件中。
终端类型的定义可以在文件.bash_profile中。
例: TERM=vtl00
全屏幕模式运行的程序需要$ TERM变量信息。
例:
$ echo $TERM
vtl00
$USER
$USER包含注册用户名。
通过该值可以知道当前注册的用户是谁,与whoami命令的功能是一样的。
例:
$ echo$USER
ken
$ whoami
ken
$ mail $USER < letterl
$ mail “ whoami” < letter2
$
可以通过mail命令来验证,发现这两封信都成功收到。
$PATH
$PATH用来定义查找程序的目录列表。目录名之间用冒号隔开。
若程序所在的目录不包含在PATH中,只有进入该目录才可以执行该程序,否则,将报告该命令找不到,导致执行失败。
如果程序在PATH中,在文件系统的任何地方都可执行该实用程序。
$PATH参数的设置在隐含文件.bash_profile中。
例: $ echo$PATH
/bin:/sbin:/usr/sbin:/root/bin:/home/liu
有两种办法修改PATH:
(1)通过这个文件,修改变量$PATH的值。
(2)使用命令将目录添加到PATH变量中。
$ PATH=$PATH :NEWPATH
($PATH变量表示当前路径,NEWPATH是新添加的路径参数。)
当用户注销时,方法(2)的设置将失效,再次登录时需要重新设置。因此,对于
一些常用路径的设置,都应放在文件.bash_profile中。
$PWD
$PWD用来定义用户在系统中的当前位置。与pwd命令输出结果一致。
例: 例:
$echo $PWD $echo $PWD
/home/liu /home/liu
$cd .. $ PWD = /home/zhao
$ echo $PWD $ echo $PWD
/home /home/zhao
$ pwd $
/home
$
$?
当UNIX程序运行时,有成功、不成功两种执行结果。
系统用$?(退出码)变量的值来标记程序执行的情况:
成功执行时,$?的值被置为0。
否则,根据错误的不同情况,置$?变量为非0值。
例
$ ls filel
file l: No such file or directory
$ echo$?
2
$
例
$ who| grep root
root tty0 Jun 22 4:55
$ echo$?
0
$
$#
shell解释一条命令时,认为采用空格和制表符隔开的都是参数序列,
并且可以用变量$#的数字序列来表示这些参数,以满足编程的需要。
命令本身用$0来表示,第一个参数用$1表示,依此类推,一直到$9。
例:编制一个用来检验上述情况的shell文本report,其内容如下所示:
echo $0
echo $1
echo $3
echo $#
在运行该文本之前,需先将该文件的属性改为可执行。
$ ./report I like UNIX very much
report
I
UNIX
5
$
$PS1和$PS2
Shell 提供两个系统提示符变量$PS1和$PS2 ,并且允许用户自主设置。
(1) $PS1
$PS1定义shell的主提示符,决定主提示符的式样。
当该变量未被定义时,缺省主提示符是$。
通过变量$PS1赋值实现,用户个性化工作环境的设置,
例: $ PSI=“Liu is Working!’’
Liu is Working! echo $PS1
Liu is Working!
Liu is Working!
(2) $PS2
$PS2定义shell的第二提示符,缺省值是“>”,
第二提示符一般用在shell需要进一步地显示某种信息,位于主提示符之后
特殊字符定义提示符
使用方法:
PS1=“特殊字符” PS2=“特殊字符”
字符 含义
! 显示该命令的历史记录编号。
# 显示当前命令的命令编号。
$ 显示$符作为提示符,如果用户是root的话,则显示#号。
显示反斜杠。
d 显示当前日期。
h 显示主机名。
n 换行显示。
nnn 显示nnn的八进制值。
s 显示当前运行的shell名字。
t 显示当前时间。
u 显示当前用户的用户名。
W 显示当前工作目录的名字。
w 显示当前工作目录的路径。
系统提示符
特殊字符能组合成很多种有用的提示符方案
例:
$ PS1=“t”
提示符显示当前的时间: 02:16:15
$ PS1=t
提示符变成: t
$ PS1=“t ”
提示符为: 02:16:30
alias
使用权限 : 所有使用者
使用方式 : alias 别名=‘命令序列’
说明 : 为命令起缩写的别名,减少键盘交互式输入的工作量。
例:
$ cd /usr/X11/lib/X11/fvwm/sample-configs
为这个长命令建立一个名为goconfg的别名
$ alias goconfg=‘cd /usr/X11/lib/X11/fvwm/sample-configs’
$ goconfg 除非退出bash,键入goconfg将和原来的长命令有同样的作用。
alias
将认为有用的别名,写入你的.profile文件中提高工作效率:
alias ll=‘ls -l’
alias out=‘shutdown -h +10 “We will close system after 10
min”’
alias ls=‘ls -F’
alias vi=‘vim’
alias
利用DOS命令的字符,实现UNIX命令调用,貌似在UNIX环境下使用DOS命令:
alias dir='ls'
alias copy='cp'
alias rename='mv'
alias md='mkdir'
alias rd='rmdir'
alias del='rm'
set
使用权限 : 所有使用者
使用方式 : set
说明 : 显示系统的当前设置。
$ set
BASH=/bin/bash
BASH_VERSION=1.14.7(1) COLUMNS=80
ENV=/lroot/.bashrc
EUID=0
HISTFILE=/root/.bash_history
HISTFILESIZE=l000
HISTS1ZE=l000
HOME=/root
HOSTNAME=computer-No1
HOSTTYPE=i386
LINES=25
LOGNAME==root
PS 1=I like unix>
PS2==>
PWD=/root
TERM=vt100
UID=0
USER=root
USERNAME=root
_=set
$
read
使用权限 : 所有使用者
使用方式 : read var_name
说明 : 交互式输入,实现变量赋值。
例:
$ read name
Liu
$ echo $name
Liu
$ read hello
Hi liu how are you
$ echo $ hello
Hi liu how are you
测试命令 test
使用权限 : 所有使用者
使用方式 : test [file opt] filename
text expression
说明 : shell程序中常用的文件信息、字符串条件测试。
系统将测试结果存入变量 $? 中。
$?==0 表示true
$?!=0 表示false 参数: (文件测试)
-b 文件存在,且是块文件
-c 文件存在,且是字符文件
-d 文件存在,且是目录文件
-f 文件存在,且是普通文件
-g 文件存在,且设置组许可
-r 文件存在,且是可读文件
-u 文件存在,且设置SUID文件
-w 文件存在,且是可写文件
-x 文件存在,且是可执行文件
测试命令 test
例 : Shell文本Report文件
#!/bin/bsh
if test –r file1
then
echo $?
cat file1
else
echo “file1 can’t readable or file1 doesn’t exist”
fi
$ ./report
0
This is file1.
$
if条件分支结构
语法结构
if test-condition
then
command
command
else
command
command
fi
注: if条件分支可以嵌套
if条件分支结构
例 Shell文本Report文件:
#!/bin/bsh
if test $PATH=/home/liu
fi
$ pwd
/home/liu
$ ./report
the current path is /home/liu
$ cd ..
$ ./report
the current path is not /home/liu
$
then
echo”the current path is /home/liu”
else
echo”the current path is not /home/liu”
if条件分支结构
例 Shell文本Report文件:
#!/bin/bsh
read mpath
if test $PATH=$mpath
then
echo”the current path is $mpath”
else
echo”the current path is not $mpath”
fi
$ pwd
/home/liu
$ ./report
/home/liu
the current path is /home/liu
$ ./report
$
/home/zhao
the current path is not /home/zhao
if判断系统类型
#!/bin/sh
SYSTEM=`uname -s`
if [ $SYSTEM = "Linux" ] ; then
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi
case分支结构
语法结构
case $var in
value1)
commands1
;;
value2)
commands2
;;
value3|4)
commands3
;;
esac
case菜单技术
#!/bin/bsh
#display menu
echo “ please choose in M、D or Q”
echo “ [M]odify the file”
echo “ [D]elete the file”
echo “ [Q]uit the menu”
# get the user command from the standard input
read command
case $command in
M|m) echo –n “Name of file to be modified:”
read filename
vi $filename
;;
# do according to command
D|d) echo –n “Name of file to be deleted:”
read filename
rm $filename
;;
*) echo “quit the program”
;;
esac
case判断系统类型
#!/bin/sh
SYSTEM=`uname -s`
case $SYSTEM in
Linux)
echo "My system is Linux"
echo "Do Linux "
;;
Solaris)
echo "My system is Solaris"
echo "Do Solaris "
;;
FreeBSD)
echo "My system is FreeBSD"
echo "Do FreeBSD "
;;
*)
echo "Unknown system : $SYSTEM"
echo "I don't what "
esac
;;
for 循环
语法结构
for variable in rang
do
command
„„.
command
done
注:适于处理次数已知的循环
for 循环
#!/bin/bsh
# Look through each file in current direction
#Allowing the user to delete the file if required
for file in *
do
echo –n “ [$file ] Delete the file (y/n)?” read yesno
case $yesno in
Y|y) echo –n “the file [$file ] has been deleted!” rm $file
echo
;;
*) echo “Keep the file [$file ] ”
echo
;;
esac
done
修改文件扩展名
如果将扩展名.txt文件改名成.doc文件,不需要逐个文件进行。#!/bin/sh
FILES=`ls /txt/*.txt`
for txt in $FILES ;
do
doc=`echo $txt | sed "s/.txt/.doc/"`
mv $txt $doc
done
这样可以将*.txt档修改成*.doc档。
while 循环
语法结构
while condition
do
command
„„.
command
done
注:适于处理次数未知的循环
while 循环
#!/bin/bsh
# Check whether user liu is logged in
while !(who|grep liu)
do
echo “ liu is not logged in ”
sleep 300 # second
case $yesno in
done
echo “ liu is logged in now!”
shell 编程
Shell命令解释器,不但完成用户键盘输入单一命令的执行,而且可以编写成Shell
Script文本方式的文件执行之。
Shell文件是以行为单位,而每一行由系统命令、注解语句、或是流程控制指令等组成。
Shell将Script文件按行分解,逐行按照语法单元执行。 Script文件具备与高级语言编程相同的效果,
在Script文件中执行命令的方法和在命令行界面环境一样,允许执行命令时设定需要的环境变数。
语法规定:
在Script文件中如果某一行尚未完成,可以在行末加上“” ,下一行的内容将接续到这一行的後面,成为同一行。
当Script中出现"#" 时,再它後面的同一行文字即为注解,Shell 不会对其翻译。
常用的bash命令
alias: 设置bash别名。
bg: 使一个被挂起的进程在后台继续执行。
cd: 改变当前工作目录。
exit: 终止shell。
export: 使变量的值对当前shell的所有子进程都可见 。
fc: 用来编辑历史命令列表里的命令。
fg: 使一个被挂起的进程在前台继续执行。
help: 显示bash内部命令的帮助信息。
kill: 终止某个进程。
pwd: 显示当前工作目录。
unalias: 删除已定义的别名。
了解更详细的情况,参考bash的手册-------- $ man bash。
常用的bash变量
EDITOR, FCEDIT: bsah fc 命令的缺省编辑器。
HISTFILE: 用于贮存历史命令的文件。
HISTSIZE: 历史命令列表的大小。
HOME: 当前用户的用户目录。
PATH: bash寻找可执行文件的搜索路径。
PS1: 命令行的一级提示符。
PS2: 命令行的二级提示符。
PWD: 当前工作目录。
shell文本程序的可执行化
将文本的Shell Script文件设为可执行的Shell Script
对任何操作系统而言,文本文件不具备执行的功能。
Dos系统通过赋予批处理文件(.bat)的类型,使之执行。
UNIX系统采用将Shell Script文件权限设定成可执行,或利用shell的内建机制,使Shell Script文件具备执行的功能
使用下列命令更改权限和执行Shell Script文件:
chmod u+x filename 只有用户自己可以执行,其它人不能执行
chmod ug+x filename 只有用户自己以及同组人可以执行,其它人不能执行
chmod +x filename 所有人都可以执行
shell文本程序的可执行化
要执行一个shell script文件的有多种方法:
方法一 : 将shell script文件权限设为可执行,使用执行引导符./ 。
$ chmod 755 shell-filename 或
$ chmod 711 shell-filename
$ ./shell-filename
方法二 : 使用bash内建指令“source”或“.”。
$ source shell-filename
$ . shell-filename
方法三 : 直接使用sh或bash指令 sh 来执行。
$ sh shell-filename
$ bash shell-filename
小结
作为一个系统管理员必须了解和掌握shell的技术。包括:
shell基本概念和功能
shell变量
shell命令
shell语言控制结构
shell的编程技术。
UNIX系统的管理配置文件都是利用shell语言编写的,通过shell程
序实现对系统的集成、维护、控制、优化和管理。
shell技术在UNIX系统中发挥着巨大的作用!
版权声明:本文标题:UNIXshell命令解释器 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1702809941h431744.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论