1、#!/bin/sh第一某些 UNIX和SHELL工具1 四、使用文献lsls F用附加字符来标示列出来条目文献类型。ls d 只显示目录名字,不显示它内容。mkdir p /dir1/file1 如果父目录不存在,创立父目录catcat n file1输出每一行带编号cat b file1输出空白行不编号wc 参数: -l记录行数 -w记录单词数-m记录字符数linux中没有-c记录字符数 linux中有cpcp src1 srcN dest拷贝各种文献cp i file1 file2交互模式,覆盖会提问cp r dir1 dir2拷贝目录mvmv src1 srcN dest移动各种文献mv
2、 i file1 file2交互模式,覆盖会提问rmrm i file1交互模式,覆盖会提问2 五、输入与输出1、输出到终端echoecho str输出strecho命令使用转义序列(在ksh中有效,bash中无效)(该转义序列也可用于printf)n打印换行t打印tab字符c背面不默认跟随换行,打印一种字符串echo “Your fruit basket contains:napple orange pear”printfprintf命令要在字符串后输出换行,必要在所要打印字符串后明确指定n转义序列,而echo命令会自动打印出换行。e.g.echo “Is that a mango?”等于p
3、rintf “Is that a mango?n”printf 基本语法printf format argumentsformat格式序列形式如下:%-m.nx%标示格式序列开始,x指明格式序列类型,下表给出了x也许得值字母描述字母描述s字符串o八进制数c字符e指数浮点数d十进制整数f固定浮点数x十六进制数g紧密浮点数依照x值不同,整数m和n有不同解释。普通,m是域最小长度,而n是域最大长度。如果你指定一种实数,n就被作为应当用到精度,连字符 表在左边对齐一种域。默认状况下,所有域都是在右边对齐.e.g.printf “%-16st%-16sn” “Name” “User Name”表达左对其
4、,输出被分隔为两列,每16个字符长度被空格分隔开。2、输出重定向cmd file可以将命令列表输出重定向e.g. date ;uptime ;who ; mylogcmd file追加到文献cmd | tee file将输出从定向到文献和屏幕,使用tee 命令e.g.date | tee now输出到屏幕同步写入文献now3、输入重定向cmd filecmd delimitershell将操作符 file1 fileexec nfile其中n为文献描述符e.g.exec 4file.out把文献file.out和文献描述符4关联起来注意:exec 1file.out则所有输出都将被放到file
5、.out中,在终端屏幕上将什么也看不见普通输入/输出重定向将指定命令cmd输出重定向到指定文献cmd n filecmd n filee.g.ls 1file将ls命令原则输出到file.重定向原则输出和原则错误到单独文献cmd 1 file1 2file2由于文献描述符1可以被省略,上面命令可以简化为 cmd file1 2file2cmd 1file1 2file2cmd file1 2file2重定向原则输出和原则错误到同一种文献cmd 1file 2&1等于cmd file 2&cmd 1file 2&1等于cmd file 2&打印消息到原则输出echo str 1&2等于echo
6、str &2printf format args 1&2等于printf format args &2 重定向一种文献描述符输出到另一种文献描述符格式为: n&mn和m都是文献描述符,exec n&m关联所有n输出到m重定向输入来自另一种文献描述符格式为: n&mn和m都是文献描述符exec n-3 六、操作文献属性命名管道mkfifo file在这里,file是给于该管道文献名。SUID 和 SGIDSUID 当你执行一种设立了SUID位程序时,你就继承了该程序属主权限,而没有设立SUID位程序在执行时只拥有执行该程序顾客权限。SGID设立了SGID位程序将以程序属主所属顾客组权限来执行。如
7、果一种目录设立了SGID位,任何加到该目录下新文献自动继承该目录组,来代替生成文献顾客组。SUID 和 SGID 位以字母s和S来表达。如果文献SUID或SGID权限被激活,SUID位就在文献属主执行权限位。e.g.ls l /usr/bin/passwd-r-sr-xr-x 1 root bin19031Feb713:47/usr/bin/passwd*如果大写字母S代替了小写字母s,则表达该文献属主执行位没有被激活。粘滞位如果目录粘滞位被设立,则只有当你是如下顾客时,文献才干被删除:设立粘滞位目录属组要被删除文献属组超级顾客root粘滞位以字母t和T表达。如果大写字母代替了小写字母s,则表
8、达该文献属主执行位没有被激活。chmode.g.chmod go-w,a+x a.oute.g.chmod R o+r pub变化pub目录及其子目录下所有文献权限使用8进制办法设立SUID和SGID位时,把这些位数值放在原则权限位前面,SUID和SGI分别取数字4和2。e.g.chmod 2444 *4 七、进程切换前台进程到后台bge.g.bg %2切换2号任务进程到后台切换后台进程到前台fge.g.fg %2切换2号后台任务进程到前台保持后台进程 nohupe.g.nohup ls &等待后台进程结束wait此命令会等待所指定任务或者进程执行完毕。wait命令有3种形式:无选取(缺省)等
9、待所有进程结束,通过进程IDe.g.wait 15060等待15060进程结束通过百分号%作为前缀任务号e.g.wait %2等待2号任务显示后台任务 jobs该命令显示哪些进程被悬挂,哪些在后台运营。e.g.jobs3 + Runningfirst_one &2 Stopped (SIGTSTP)second_one 1 Stopped (SIGTTIN)third_one &任务3正在运营;任务2是一种前台进程,被Ctrl+Z进行悬挂;任务1是一种后台进程,正在等待键盘输入列出所有运营进程 psUID 进程所有者;PID 进程标记符;PPID 父进程标记符;C 进程CPU占用率STIME进
10、程开始时间;CMD开始进程命令关闭进程 kille.g.kill %1关闭任务号为1进程subshell概念当你运营一种shell脚本时候,除了脚本中命令之外,另一种shell解释器拷贝也会产生。设个新shell被称为subshell。覆盖当迈进程 exec 该命令可以用一种新进程来覆盖当迈进程。使用时要务必小心!可以exec来彻底更改你shell解释器而不需要此外产生subshell。 e.g. exec csh第二某些 SHELL编程5 八、变量标量变量一次只能被赋予一种值变量名只能包括字母、数字和下划线 _ 。只能以字母或下划线作为开始。变量值可以存储或分派任何值到变量中。带空格变量值需
11、要用单引号或双引号引起来。 E.g. ¥ FRUIT=”apple orange plum”访问变量要获取变量值,只要在变量名之前加上美元符号$作为前缀即可建立数组变量办法一: 直接给一种索引赋值,格式为nameindex=valuee.g.$ FRUIT0=apple;FRUIT1=banana ;FRUIT2=orange办法二:在 ksh中为set A name value1 value2 valueNe.g. $ set A band derri terry mike gene在bash中为name=(value1 valueN)e.g. $ band=(derri terry mik
12、e gene)在bash中设定多重数组元素,需要在赋值之前建立一种数组索引:e.g. $ myarray=(0=derri 3=gene 2=mike 1=terry)数组索引不必安装顺序注意:索引必要是一种整数如果一种数组变量名和一种已经被定义了标量变量名重名,那么标量变量值就变成了数组变量中索引0值。访问数组值办法为:$nameindexe.g.$echo $FRUIT2使用 $name* 和 $name可以访问数组中所有项目$name*以为实际有几种索引就与否几项$name以为实际有几种索引项加上空格分开项目e.g. $ FRUIT=(apple banana “orange passi
13、on”)$name*以为有3项$name以为有4项只读变量 readonly变量可以通过readonly命令被标记为只读.可用来标记数组或标量变量为只读e.g.$ FRUIT=kiwi;readonly FRUIT删除变量 unset格式:unset namee.g.$ unset FRUIT只读变量是无法被删除,它将始终保持到shell退出为止。输出环境变量办法一:name=value ;export name办法二:export name=valueshell 变量是在shell初始化时被设定并内部运用变量。附录:惯用shell变量$PWD指出当前工作目录$UID指出当前顾客数字顾客标示符
14、$SHLVL每次bash打开一种历程就自动加1,这个变量作用在于拟定内建exit命令与否关闭了当前会话。$REPLY若不给定参数,会让read命令读到输入最后一行$RANDOM产生0到32767随机数$SECONDS返回shell启动秒数。$IFSshell使用该变量IFS值把一种字符串分隔为单独词。IFS默认设立是空格和tab键.e.g. dirs() OLDIFS=”$IFS”IFS=:for I in $_DIR_STACKdoecho “$I c”doneechoIFS=”$OLDIFS”$PATH搜索途径$HOME当前顾客主目录。附录:特殊变量$?上一条命令退出状态保存在变量$?中,
15、为0表达到功,非0表达失败可以用变化量来检测一条命令与否执行成功。e.g.if $?eq 0 ;thenecho “Command was successful.”;elseecho “An error was encountered.”exitfi$-专用变量$-是一种包括所有shell选项列表。检查$-与否包括字母i是判断shell是运营在交互模式下还是非交互模式下最简便办法。e.g.case $- in*i*) PS1=”uname n$ “PATH=”$PATH:$HOM#/bin”Export PS1 PATH;Esac$PS3变化脚本运营提示符e.g PS3=”New prompt
16、” ;export PS3;注意shell变量PS3把空格也作为最后一种字符。6 九、置换元字符*匹配0到各种任意字符匹配一种前缀cmd prefix*匹配一种后缀cmd*suffix匹配前缀和后缀cmd prefix*suffix元字符?匹配1个任意字符如果shell不能发现任何文献名可以匹配包括一种?元字符表达式,shell就会把?看作文献名中字符。由于这个因素,如果一种shell脚本使用匹配文献名作为参数,则需要验证文献与否存在,以免出错。匹配字符集合 cmd char匹配字符范畴e.g. ls ch00-9.doc;ls a-zA-Z*取消一种集合,即不涉及一种集合 !cmd !cha
17、re.g.$ ls !a*列出不以a开头文献名高档变量置换有两大类高档变量置换:1、 当一种变量获得一种值时,发生动作2、 当一种变量失去一种值时,发生动作名称语法描述缺省值置换$param:-word如param值为空或未赋值,word取代param,但param值不变缺省值赋值$param:=word如param值为空或未赋值,word被赋给param空值错误$param:?msg如param值为空或未赋值,将msg信息输出到STDERR,并退出shell有值置换$param:+word如param有值,word取代param值,但param值不变e.g.FRUIT=$MYFRUIT:-A
18、PPLE命令置换 (用反引号 )commandshell执行命令集合,然后将命令输出成果置换。注意使用是反引号e.g.UP=date ;uptimee.g.grep id un /etc/passwd算式置换$(exp)exp为一种数学表达式,可以使用/ * - + ()。返回值不是四舍五入;在小数点后任何值都会被丢弃。e.g. $ echo $( (5+3*2)-4)/2 )注意 最前面2个左括号中不可有空格,最背面2个有括号中也不可有空格。7 十、引用关闭对特殊字符含义解析解决被称为引用需要引用解决元字符如下:* ? “ $ ;& ( ) | !#使用反斜线 使用反斜线 可以使一种特殊字符
19、被引用e.g.echo A: is my floppy drive使用单引号 在字符串先后使用单引号,可以使整个字符串被引用单引号必要成对浮现e.g.echo ;(update?) Y|N使用双引号 “禁止除了$和以外所有元字符。因而可以引用变量。双引号中反斜线可以起作用,只在下面4个符号之前起作用 $ “ 引用解决换行以在下一行中继续e.g. echo 12345 67890输出为 e.g. echo Line 1 Line 2输出为 Line1 Line2引用解决正则表达式通配符e.g.grep 0-90-9*$ report2 report7注意:象find等命令,通配符必要使用单引号、
20、双引号或反斜线进行引用解决,这样通配符才干传递给find而不会被shell将其扩展开。8 十一、流控制if语句if语法代码返回0表达真,而非0为假。语法如下:if list1thenlist2elif list3thenlist4elselist5fi也可写成一行:if list1 ;then list2 ;elif list3 ;then list4 ;else list5 ;fi ;常用错误在单行形式中 then语句前面忽视了分号使用test文献测试语法:test option file 或 option file option为下表中一种选项, file 是一种文献或目录名字选项描述-b
21、 file当file存在并且是块文献时返回真-c file当file存在并且是字符文献时返回真-d pathname当pathname存在并且是目录时返回真-e pathname当由pathname指定文献或目录存在时返回真-f file当file存在并且是正规文献时返回真-g pathname当由pathname指定文献或目录存在并且设立了SGID位时返回真-h file当file存在并且是符号联接时返回真-k pathname当由pathname指定文献或目录存在并且设立了粘滞位时返回真-p file当file存在并且是命名管道时返回真-r pathname当由pathname指定文献或目
22、录存在并且可读时返回真-s file当file存在并且是文献大小不不大于0时返回真-u pathname当由pathname指定文献或目录存在并且设立了SUID位时返回真-w pathname当由pathname指定文献或目录存在并且可写时返回真-x pathname当由pathname指定文献或目录存在并且可执行时返回真-o pathname当由pathname指定文献或目录存在并且被当迈进程有效顾客ID所指定顾客所拥有时返回真字符串比较检查字符串与否为空 n -z语法:test -z str 或 -z str str 是要检测字符串。当str长度为0时返回真。语法:test -n str
23、或 -n str str 是要检测字符串。当str长度为非0时返回真。e.g.if -z “$FRUIT_BASKET” ;thenecho “Your fruit basket is empty”elseecho “Your fruit basket contains :$FRUIT_BASKET”fi注意:str必要被引号括起来,否则str会被shell变量置换,而无法交给test。因此这里为 -z “$FRUIT_BASKET”字符串相等语法:test str1=str2或 str1 = str2 e.g.if “$portmap” = “YES” ;then if X$portmap
24、=X“YES” ;then 注意上述2个例子都可以防止由于$portmap为空而报字符串不等语法:test str1 != str2或 str1 != str2 e.g.if “$portmap” != “YES” ;then if X$portmap !=X“YES” ;then 注意上述2个例子都可以防止由于$portmap为空而报错数字比较语法:test int1 op int2或 int1 op int2 int1和int2可以是任何正整数或负整数,op为下表中一种操作符。如果int1或int2是一种字符串而不是整数,它就被作为0来对付。操作符描述int1 eq int2如果int1等
25、于int2,返回真。 也可用 = 符号int1 ne int2如果int1不等于int2,返回真int1 lt int2如果int1不大于int2,返回真int1 le int2如果int1不大于等于int2,返回真int1 gt int2如果int1不不大于int2,返回真int1 ge int2如果int1不不大于等于int2,返回真上一条命令退出状态保存在变量$?中,为0表达到功,非0表达失败可以用变化量来检测一条命令与否执行成功:e.g.if $?eq 0 ;thenecho “Command was successful.”;elseecho “An error was encoun
26、tered.”exitfi复合表达式用内建操作符创立复合表达式语法: test expr1 op expr2或 expr1 op expr2 expr1 和 expr2 是任何有效test表达式,op为-a 或 -o。expr1 a exprt2表达 expr1 和 expr2都为真时返回真expr1 o exprt2表达 expr1 或 expr2都为真时返回真用条件操作符创立复合表达式语法: test expr1 op test expr2或 expr1 op expr2 expr1 和 expr2 是任何有效test表达式,op为 & 或 |。&表达 expr1 和 expr2都为真时返
27、回真|表达 expr1 或 expr2都为真时返回真使用条件操作符能提高效率,推荐使用。否定一种表达式语法: test !expr 或者 !expr expr是任何有效test表达式case语句语法如下:case word in pattern1)list1; pattern2)list2;patternN)listN;esac或case word in pattern1) list1;patternN) listN;esace.g.case $- in*i*) PS1=”uname n$ “PATH=”$PATH:$HOM#/bin”Export PS1 PATH;Esac专用变量$-是一种
28、包括所有shell选项列表。检查$-与否包括字母I是判断shell是运营在交互模式下还是非交互模式下最简便办法。9 十二、循环while循环while循环语法while cmddolistdone或while cmd ;do list ;done这里,cmd表达一种单一命令(普通是test表达式),而list表达一种或各种命令列表。执行环节:1、执行cmd。2、如cmd退出状态为非0,则退出循环。3、如cmd退出状态为0,则执行list。4、当list结束时,回到第一步应用:while合法顾客输入RESPONSE=while -z “$RESPONSE” ;doecho “Enter the
29、name of a directory where your files are located:”read RESPONSEif !d “RESPONSE” ;thenecho “ERROR:please enter a directory pathname. “RESPONSE=Fidone应用:输入重定向和while结合,从文献中一次读出一行语法如下:while read LINEdo:# manipulate file heredone filewhile和子shell间变量传递 ?当while循环结束时,循环内变量不被保存。解决办法是当进入循环时重定向STDIN指针,然后在结束时恢复
30、STDIN。语法如下:exec n&0 filewhile read LINEdo:# manipulate file heredoneexec 0&n n&-这里,n是一种不不大于2整数,file是你想要读取文献名。e.g. 构造一种cat命令shell版本,如下所示:#!/bin/shif “$#” ge 1 ;thenfor FILR in $do exec 4&0 “$FILE”while read LINE ;do echo $ LINE ;doneexec 0&4 4&2exit 1fiexit 0检查变元数目与否与规定数目匹配 $#应用举例#!/bin/shUSAGE=”Usag
31、e:basename $0 -c|-t file|directory”If $# -lt 2 ;thenecho “$USAGE”exit 1ficase “$1” in-t) TARGS=”-tvf $2” ;-c) TARGS=”-cvf $2.tar $2” ;*) echo “$USAGE”exit 0;esactar $TARGS$*和$区别为shell脚本指定变元被存在两个特殊变量$*和$中。这两个变量之间差别在于如何存储变元: $*不保存引用,而$则保存。getopts命令getopts语法格式如下:getopts option-string var这里option-string
32、是一种字符串,它涉及了getopts所应当考虑所有单个选项字符。var是该选项应当被设立变量名字。推荐,var处用一种名为OPTION变量。getopts对命令行中给出选项进行解析环节如下:1 getopts检查所有命令行参数,查找以 字符开头参数。2 当发现一种以 字符开头参数时,它比较 之后紧接着字符与给定 option-string中所有字符。3 如果发现该字符在 option-string中有匹配,则把该选项字符赋予变量var;否则,var值设立为?字符。4 重复 13,直到命令行中给出所有选项都被检查完。5 当完毕后,getopts返回一种非0退出码。此外,它将变量OPTIND值设立
33、为最后一种参数下标。getopts可以指出哪些选项规定附带参数通过在选项背面附加一种冒号 :字符来实现。在这种状况下,解析一种选项后,附带参数就会设立为变量OPTARG值。getopts举例脚本如下:#!/bin/shUSAGE=Usage:basename $0 -v -f filename -o filename;VERBOSE=falsewhile getopts f:o:v OPTION:docase $OPTION inf) INFILE=$OPTARG;o) OUTFILE=$OPTARG;v) VERBOSE=true;?) echo $USAGE exit 1 ;esacdoneshift echo $OPTIND -1|bcif -z $1 & -z $
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100