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系统中发挥着巨大的作用!


本文标签: 命令 文件 执行 用户 系统