Shell可以使用文件名扩展字符,可直接使用shell内置命令。可使用数据流,提供通配符(*,?,[ ])、输入输出重定向、管道线等机制,shell程序可在后台执行命令,shell也是一种高级程序设计语言。Shell有sh、csh、ksh、bash等,这里介绍bash
Shell中#为注释符,如#!/bin/bash表示脚本解释语言为bash
Shell脚本的执行方式:
1) 输入重定向方式:让shell从指定脚本读入命令行,即 bash < 脚本名
2) 脚本名作为bash参数,可进行程序调试:形式为$bash 脚本名 [参数]
3) 将shell脚本的权限设置为可执行,后可在提示符下直接执行:
c
h
m
o
d
a
+
x
a
a
后
chmod a+x aa后
chmoda+xaa后PATH=$PATH . 后 $ aa即可执行脚本aa
格式:history [option] [arg…]
使用:如不带任何参数,history命令会显示历史命令清单(带有历史事件号);如果后面带一个正整数n,则显示历史表的最后n行命令;如果后面带一个文件名,则作为历史文件名。(重复过去的命令,也可以使用键盘的上下方向键对应查阅前一条或后一条命令)
常用选项:-a(在历史文件中添加“新“历史命令行)、-n(读取尚未读入的命令行并添加到当前历史清单中)、-r(读取历史文件内容,并将其作为当前历史命令)、-w(把当前的历史写入到历史文件中,覆盖原有内容)、-c(删除历史清单中的所有项)
执行历史命令是命令替换方式之一,以字符“!“开头。举例:!!(重复上一条命令,即”!-1“)、!n(重新执行第n条历史命令)、!-n(重新执行倒数第n条历史命令)、!string(重新执行以字符串string开头的最近的历史命令行)、!?string?(重新执行最近的其中包含字符串string的那条历史命令)、!#(到现在为止所输入的整个命令行)
历史文件中能保留的命令个数有限,默认是500。可利用HISTSIZE变量重新设定该值。通过HISTFILE赋值可改变存放历史命令的文件。例如HISTSIZE=300 HISTFILE=“/home/mengqc/.myhistory“
方法:输入目录名或者文件名的开头部分时,然后按Tab键,Linux会自动补全剩余部分。如果输入过程中不知道后面的字符且系统也无法唯一确定名称的情况下,可以先按Esc键,再按?键,shell会列出匹配项。按Esc+?键的操作可以用连按两次Tab键来替代。
4 别名格式:alias [name[=vlaue]]…,name时用户定义的别名名称,value是别名代替的内容(常用单引号括起来)。
取消别名:unalias name…,可以用unalias -a删除别名表中所有的别名
5 特殊字符 5.1 通配符一般通配符
(1)*—匹配任意字符的0次或多次出现(文件名前的圆点(.)和路径名中的斜线符(/)必须显式匹配)
(2)?—匹配任意一个字符
(3)[字符组]—匹配该字符组限定的任何一个字符,如f[abcd]可匹配fa、fb、fc、fd,但不能匹配f1、fa1、fab。f[abcde]与f[a-e]相同
(4)!—如f[!1-9]匹配的是除f[1-9]之外的fa、fb等
模式表达式
(1)(模式表)——匹配给定模式表中0次或多次出现的“模式“。如file(.c | .o),匹配file、file.c、file.c.o等等文件
(2)+(模式表)——匹配给定模式表中一次或多次出现的“模式“。如file*(.c | .o),匹配file.c
、file.o、file.c.o等等文件,但不匹配file
(3)?(模式表)——匹配给定模式表中一次或0次出现的“模式“。如file*(.c | .o),只匹配file.c、file.o、file文件
(4)@(模式表)——匹配给定模式表中仅一次出现的“模式“。如file*(.c | .o),只匹配file.c、file.o文件
(5)@(模式表)——除了给定模式之外,可匹配其他任何东西
5.2 引号双引号
由双引号括起来的字符(除“KaTeX parse error: Can't use function ')' in math mode at position 14: “、倒引号(`)和反斜线(̲)̲之外),均作为普通字符,这里““表示变量替换,即用预先指定的变量值代替KaTeX parse error: Can't use function ')' in math mode at position 22: …号(`)表示命令替换。反斜线(̲)̲仅当其后字符是”“ ”`“ “”” ”“或者换行符之一时,反斜线符才是转义字符
单引号
由单引号括起来的字符都作为普通字符
倒引号
倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令,并以它的标准输出结果取代整个倒引号部分。
反斜线符
转义字符,能将特殊字符转化成普通字符。未用单引号引起的反斜线符和换行符组合,作为续行符使用
1)输入重定向符
输入重定向符(<)的作用是:把命令(或可执行程序)的标准输入重新定向到指定文件。输入重定向的一般形式为:命令<文件名
2)输出重定向符
输出重定向符(>)的作用是:把命令(或可执行程序)的标准输出重新定向到指定文件。输出重定向的一般形式为:命令>文件名
3)输出附加定向符
输出附加定向符(>>)的作用是:把命令(或可执行程序)的标准输出附加到指定文件的后面,而文件原本的内容不被破坏。输出附加定向的一般形式为:命令>>文件名
4)即时文件定向符
即时文件由重新定向符(<<)、一对标记符以及若干输入行组成,可将shell程序的输入行重新定向到一个命令,形式为:
命令 [参数] << 标记符
输入行
…
标记符是能够明显识别的符号,如!!、%、“等,通常第一个标记符标记输入行开始,第二个标记符作为即时文件的结束标记(或者遇到文件末尾也可以结束即时文件)
5)与文件描述字相关的重定向
在Linux系统中,每一个“打开”的文件都有系统赋予的一个文件描述字,它是一个小整数(可以直接用这个描述字来引用对应文件)。通过:命令 $>file 这个可以将命令的标准输出和标准错误输出都放到同一个文件file中。
Shell处理重定向时是从左到右进行的,与重新定向有关的文件描述字是0-9,共10个文件描述字。用户可以随意定义且使用的是3-9。0、1、2分别对应标准输入、标准输出、标准错误输出。例如“2&> 1”表示把标准错误输出重定向到标准输出。
1)注释
Shell中以#作为注释符,一般shell脚本开头的第一行“#!”后面跟的字符串是所使用的shell的绝对路径名,说明脚本的解释程序
2)管道线
管道线是由竖杠(|)隔开的若干命令组成的序列。在管道线中,每个命令执行时都有一个独立的进程。前一个命令的输出正是下一个命令的输入。管道线中有一类命令称为过滤器,过滤器首先读取输入,然后将输入以某种简单方式进行变换(相当于过滤),再将处理结果输出。如grep、sort、tail、wc命令等就是过滤器。例如 ls | grep m?.c | wc -l 这个命令,显示的是当前目录中文件是以m打头,后随一个字符的所有C语言文件的数目
3)后台命令
即在要执行的命令的最后输入&符,即可告诉shell在后台运行该命令。而shell则马上显示主提示符以提醒用户可以输入新的命令。通常规定,后台进程的调度优先级都低于前台进程的优先级。所以仅当CPU空闲时,才调度后台进程运行。
多条命令在一行中出现,可以顺序执行,也可以在相邻命令件存在逻辑关系。
1) 顺序执行
多行命令可以通过分号间隔写成一行,皆为顺序执行。即
pwd
ls -l
与pwd; ls -l; 是等价的
2) 逻辑与
格式:命令1 && 命令2,这里后一个命令是否能执行取决于前一个命令执行成功与否。&&的优先级低于&
3) 逻辑或
格式:命令1 || 命令2,这里则是先执行命令1,若成功则不执行命令2;若失败则会执行命令2。 ||的优先级低于|
Shell中的组合命令有两种方式:用花括号{}和圆括号()括起来的。使用{}时,左括号后应该有一个空格,右括号前应有一个分号。{}中的命令表必须用分号或者换行符终止。使用()时则没有上述约束。
二者的区别在于:用{}括起来的成组命令只在本shell内执行命令表,不产生新的进程;而用()括起来的数字哎新的子shell内执行,要建立新的子进程。所以,在()内等命令不会改变父shell的变量值及工作目录等
Shell有两类变量:环境变量与临时变量。环境变量是永久性变量,其值不会因shell脚本执行结束而消失;临时变量是在shell程序内部定义的,适用范围仅限于定义它的程序。
6.1 自定义变量命名方式与C语言的定义一致,shell中是用变量来存放字符串,一般形式为:变量名=字符串。Shell中引用变量的值是要在变量名前加一个 符 。 如 变 量 的 值 要 出 现 在 一 字 符 串 的 结 尾 , 可 直 接 引 用 ( 即 符。如变量的值要出现在一字符串的结尾,可直接引用(即 符。如变量的值要出现在一字符串的结尾,可直接引用(即变量名);若要出现在开头或者中间,为区分开来,采用 变 量 名 的 形 式 。 ⋅ ‘ 命 令 ‘ 等 价 于 {变量名}的形式。·`命令`等价于 变量名的形式。⋅‘命令‘等价于(命令),例如 d i r = ‘ p w d ‘ 等 价 于 dir=`pwd`等价于 dir=‘pwd‘等价于dir=$(pwd),都是显示当前工作目录并赋值给变量dir
6.2 数组Bash仅提供一维数组,且未限定数组大小。数组的声明形式:declare -a 数组名,赋值方式为:数组名[下标]=值,读取某一数组元素值:${数组名[下标]},使用或@作为下标则会以数组中所有元素取代[]或[@]。利用unset命令可以取消数组某个元素或者整个数组的定义,例如unset array[2]或者unset array[*]
6.3 变量引用说明1)$变量名,这是说明该变量的值
2)${变量名},这也是说明该变量的值,{}是为了与后面的字符串区分开来
3) 变 量 名 [ ∗ ] 与 {变量名[*]}与 变量名[∗]与{变量名[@]},都表示数组中所有非空元素的值,每个元素的值用空格分开。
4)“ 变 量 名 [ ∗ ] ” 与 “ 变 量 名 [ @ ] ” , 区 别 在 于 : 对 于 “ {变量名[*]}”与“{变量名[@]}”,区别在于:对于“ 变量名[∗]”与“变量名[@]”,区别在于:对于“{变量名[*]}”,其被扩展成一个词(字符串),该词是以空格分开的各个数组元素组成;对于“${变量名[@]}”,其被扩展成多个词,每个数组元素是一个词。
5) 变 量 名 : − w o r d 、 {变量名:-word}、 变量名:−word、{变量名:=word}、 变 量 名 : + w o r d 、 {变量名:+word}、 变量名:+word、{变量名:?word}
6)KaTeX parse error: Expected '}', got '#' at position 5: {变量名#̲pattern}与{变量名##pattern},其中pattern是表示匹配模式,它可以是包含任何字符序列、变量或者命令替换即通配符的串,带#是去掉变量中与pattern匹配最少的部分,带##则是去掉变量中与pattern匹配最多的部分。例如,$echo P W D 的 值 为 / e t c / h h h , 使 用 PWD的值为/etc/hhh,使用 PWD的值为/etc/hhh,使用echo KaTeX parse error: Expected '}', got '#' at position 5: {PWD#̲*/}则输出为etc/hhh,…echo ${PWD##*/}则输出为hhh
7)KaTeX parse error: Expected '}', got 'EOF' at end of input: {变量名%pattern}与{变量名%%pattern},如pattern与变量值的末尾匹配,那变量值去掉匹配部分的结果即是表达式的值。一个%去掉的是最少匹配部分,两个%是去掉最多匹配部分。例如: F = F . o . c , 使 用 F=F.o.c,使用 F=F.o.c,使用echo KaTeX parse error: Expected '}', got 'EOF' at end of input: …F%.*}后输出为F.o,使用echo ${F%%.*}后输出为F
8)KaTeX parse error: Expected '}', got '#' at position 2: {#̲@}和{#*},值分别对应 @ 和 @和 @和*返回的参数的个数
9)${#变量名[i]},其值是数组第i个元素值的长度(字符个数)
10)KaTeX parse error: Expected '}', got '#' at position 2: {#̲变量名[@]}和{#变量名[*]},其值都是数组中已经设置的元素的个数
6.4 输入输出命令1)read命令
可从键盘上读取数据并赋给指定变量。即:read 变量1[变量2…]。输入数据时,数据间以空格或者制表符作为分隔符。赋值时如变量个数与输入个数相同则对应赋值;如变量个数小于输入数据个数,则从左到右赋值时,最后一个变量被赋予剩余所有的数据;如变量个数大于数据个数,则多余变量赋予空值
2)echo命令
显示其后的变量值或者字符串,各参数间以空格隔开,以换行符终止。如果echo命令的选项带有-e,那么其后参数可以有如下转义字符,用以输出控制或印出无法显示的字符。a(响铃报警)、b(退一个字符位置)、c(出现在参数最后,光标不换行)、e(转义字符)、f(换页)、n(显示换行)、r(回车)、t(水平制表符)、v(垂直制表符)、(印出反斜线)、m(以0开头的1位、2位或s3位八进制数,表示一个ASCII码字符)、xm(1位、2位或s3位八进制数,表示一个ASCII码字符)、
如果位置变量是由两个或者更多数字构成的,那么必须用一个{}把他们括起来。位置变量不能直接赋值,只能通过命令行上对应位置的实参传值。位置参数即引用时在前面加$,如$1。可以用set命令给位置参数赋值或者重新赋值(除了$0外,因为它的值始终是命令名)。可以用shift命令移动位置参数,即每执行一次shift命令,命令行上的实参向左移一位,对应位置参数($1-$9)右移一位($0因为命令名,故不会移位)。Shift后可带一个整数作为参数,指明要移动的位数。
6.6 预定义的特殊变量这些变量是shell依据实际情况来赋值,用户无法重新设置。如KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲(表示命令行上的参数个数(即可…?(上一条命令执行后的返回值,执行成功返回0值,否则返回非0值)、$ ( 表 示 当 前 进 程 的 进 程 号 ) 、 (表示当前进程的进程号)、 (表示当前进程的进程号)、!(表示上一个后台进程的进程号)、 − ( 由 当 前 s h e l l 设 置 的 执 行 标 志 名 组 成 的 字 符 串 ) 、 -(由当前shell设置的执行标志名组成的字符串)、 −(由当前shell设置的执行标志名组成的字符串)、(命令行中实际给出的所有实参字符串)、 @ ( 命 令 行 中 实 际 给 出 的 所 有 实 参 字 符 串 ) 。 注 意 “ @(命令行中实际给出的所有实参字符串)。注意“ @(命令行中实际给出的所有实参字符串)。注意““与“$@ “不同,详见前述说明
6.7 环境变量所有的linux进程都有各自独立且不用于程序本身的环境。要查看当前环境的环境变量,在bash、sh、ksh中可以用env命令,在csh中则要使用printenv或者不带参数的setenv,在sh和ksh中还可以使用不带参数的set命令
1) HOME——用户主目录的全路径名,一般是/home/注册名。可以通过cd $HOME回到主目录。
2) LOFGNAME——注册名,系统与用户交互的字符串
3) MAIL——系统信箱的路径,一般其值为:/var/spool/mai/注册名
4) PATH——shell从中查找命令的目录列表,例如PATH= P A T H : PATH: PATH:HOME/bin可以实现在当前的命令查找路径下添加一个目录$HOME/bin
5) PS1——shell主提示符。这是在shell准备接受命令时显示的字符串,定义了用户主提示符是怎样构成的。其常用转义字符有d(以“星期 月 日“格式显示日期)、h(主机名,到第一个”.“为止)、H(主机名)、s(所用shell名称)、t(以24小时制的”时 分 秒“显示的当前时间)、T(以12小时制的”时 分 秒“显示的当前时间)、@(以12小时制的am/pm形式显示的当前时间)、u(当前用户名)、v(bash的版本号)、w(当前工作目录)、$(如果有些的UID为0,那它就是一个#,否则就是$)
6) PWD——当前工作目录路径
7) SHELL——当前使用的shell的存在目录
8) TERM——终端类型
环境变量的引用是在变量名前加一个$,删除环境变量使用的是unset命令
当注册进入系统后,shell会读取一些称为脚本的环境文件并执行其中的命令。如bash中的环境文件有”bash_profile” ”.bashrc” “.bash_logout”文件等
为了使子进程能继承父进程中定义的变量,需用export命令将这些变量送入进程转出区。一般形式为:expoet [命令名]。利用不带参数的export命令可以显示本进程利用export命令所输入的全部变量及其值。
Set命令的功能:显示目前所定义的全部变量,包括局部变量和公用变量;设定位置参数的值;改变执行shell脚本时的选项设定。可用“set -标志“设置标志,“set +标志“关闭标志。
X标志:该标志设定后,使得shell对以后各命令行在完成参数替换且执行该行命令之前,先显示该行的内容;
Y标志:该标志设定后,使得shell对以后各命令行先在屏幕上显示该行的内容,再执行该语句,并显示相应结果
其他标志:-a(自动标记被修改或者创建的变量);-e(当一个简单命令非零状态终止时,立即退出shell);-f(禁止路径名扩展);-h(记住命令的位置);-k(把全部以赋值语句形式出现的参数放在命令环境中);-n(读命令但不执行)
参数置换变量是变量赋值的另一种形式,一般形式是:变量2= 变 量 1 o p 字 符 串 , o p 为 操 作 符 , 如 : − 、 : + 、 : = 、 : ? 等 对 于 变 量 2 = {变量1 op 字符串},op为操作符,如:-、:+、:=、:?等 对于变量2= 变量1op字符串,op为操作符,如:−、:+、:=、:?等对于变量2={变量1:-字符串},如果变量1的值为空,则变量2的值等于给定的字符串;否则,变量2的值等于变量1的值,变量1的值保持不变。对于变量2= 变 量 1 : = 字 符 串 , 如 变 量 1 的 值 为 空 , 则 变 量 2 和 变 量 1 的 值 都 取 给 定 字 符 串 的 值 ; 否 则 变 量 2 的 值 取 变 量 1 的 值 , 而 变 量 1 保 持 不 变 。 对 于 变 量 2 = {变量1:=字符串},如变量1的值为空,则变量2和变量1的值都取给定字符串的值;否则变量2的值取变量1的值,而变量1保持不变。对于变量2= 变量1:=字符串,如变量1的值为空,则变量2和变量1的值都取给定字符串的值;否则变量2的值取变量1的值,而变量1保持不变。对于变量2={变量1:+字符串},如变量1的值为空,则变量2和变量1的值都为空;否则变量2的值取给定字符串的值,而变量1保持不变。对于变量2=${变量1:?字符串},如变量1的值为空,则按以下格式显示:shell 脚本名:变量1:字符串,并从当前shell退出,变量2保持原来的值;否则变量2的值取变量1的值,而变量1保持不变。在上述四种格式的参数置换中,除使用操作符“:=“的格式外,其余格式中的变量1可以是位置参数。
8 算术运算Bash中执行整数算术运算的命令是let,语法格式为:let arg…。Arg是单独的算术表达式。还提供方幂运算符**。Let命令的替代表达形式是:let “算术表达式“等价于((算术表达式))。算术表达式和运算符类似C语言的表达式规则和运算符规范。
9 控制结构 9.1 if语句格式:
if 测试条件
then 命令1
else 命令2
fi
其中else部分还可以用elif代替
常用三种形式:
1) 用test命令
2) 用一对方括号将测试条件括起来。即“test 测试条件“等价于”[测试条件]“
3) 第三种是[[条件表达式]]
文件测试
-r 文件名(测试文件是否存在且用户可读)、-w 文件名(测试文件是否存在且用户可写)、-x 文件名(测试文件是否存在且用户可执行)、-f 文件名(测试文件是否存在且为普通文件)、-d 文件名(测试文件是否存在且为目录文件)、-p 文件名(测试文件是否存在且为命名的FIFO文件)、-b 文件名(测试文件是否存在且为块设备文件)、-c 文件名(测试文件是否存在且为字符设备文件)、-s 文件名(测试文件是否存在且文件长度大于0)、-t 文件名(测试文件是否被打开且其文件描述字与终端设备相关)
字符测试
-z string(测试字符串string长度是否为0)、-n string(测试字符串string长度是否大于0)、string(测试string是否为空)、str1 = str2(测试两字符串是否相等)、str1 != str2(测试两字符串是否不等)、str1 < str2(测试按字典顺序,str1是否在str2之前)、str1 > str2(测试按字典顺序,str1是否在str2之后)
数值运算
n1 -eq n2(两数是否相等)、n1 -ne n2(两数是否不等)、n1 -lt n2(n1是否小于n2)、n1 -le n2(n1是否小于或等于n2)、n1 -gt n2(n1是否大于n2)、n1 -ge n2(n1是否大于于或等于n2)
逻辑运算
!(逻辑非NOT)、-a(逻辑与AND)、-o(逻辑或OR)、()(圆括号,括号中常为表达式)
特殊条件测试
:(不做任何事,退出值为0)、true(真,退出值为0)、false(假,退出值为255)
Case语句
格式为:
case 字符串 in
模式字符串1)命令
命令;;
模式字符串2)命令
命令;;
模式字符串n)命令
命令;;
esac
用法:字符串与模式字符串匹配后执行命令,每个模式字符串后的命令数不限,但最后一条需要以两个分号(;;)结尾。模式字符串中可用通配符,有多个模式时要以竖线(|)分隔开。case为语句的开始,esac为语句的结束。Case语句的退出值为最后执行的命令的退出值,若没执行命令,则退出值为0
While语句
格式(测试条件为真时进入循环体,直至条件假时终止循环):
while 测试条件
do
命令表
done
until语句
格式(测试条件为假时进入循环体,直至条件真时终止循环):
until 测试条件
do
命令表
done
for语句
格式:
单行形式:for 变量 [in 值表]; do 命令表; done
多行形式(值表可以时文件正则表达式,如m*.c):
for 变量 [in 值表]
do
命令表
done
for((e1;e2;e3)); do 命令表; done
或者
for((e1;e2;e3))
do
命令表
done
这与C语言的for语句类似,先计算算术表达式e1,再计算e2,e2不为0时执行命令表,同时计算e3;这里重复“计算e2,e2不为0时执行命令表,同时计算e3”的操作,知道e2为0时才退出循环
Break和continue命令
格式:
break [n] 表示要跳出n层循环
continue命令是跳过循环体内在它之后的语句,回到本层循环的开头,进行下一次循环。
格式:continue [n]表示从包含continue的最内层循环往外跳到第n层循环。循环数是由内往外编号
Exit命令
退出正常执行的脚本,并设定退出值,格式:exit [n]
Select语句
用于菜单设计,自动完成接受用户输入的整个过程,包括显示一组菜单项及读入用户的选择。格式为:
select identifier[in word…]
do
命令表
done
1) shell函数
格式定义:
[function]函数名()
{
命令表
}
先定义后使用,直接使用函数名调用函数,shell脚本和函数之间的参数传递可用位置参数和变量直接传递。利用return可以立即退出函数和设定退出值:即return [n]
2)内置命令
通过set -o monitor使得shell实施作业管理。直接job命令可列出当前未完成的作业。kill命令可向指定进程发送TERM(终止)信号或者指定信号,其中TERM信号15可正常终止,信号9是立即终止;信号可由信号号码(sig)或信号名(signame)指定,利用kill -l可以列出全部信号名。这里,bg命令可以把前台作业切换成后台作业,格式为bg [job…],例如bg %1;fg命令把后台作业变成前台作业,格式:fg [job…],这job为进程ID号或作业号,例如fg %1
命令eval格式:eval [arg…],利用别的命令行作为自己的参数,进行相应的变量替换或者命令替换,并将替换结果合成一个新命令行,读取并执
命令exec格式:exec [arg…],执行由参数arg指定的命令,并不创建新进程,允许由输入输出重定向参数
命令hash格式:hash [-r] [name…],无-r时该命令会显示记住的由name指定的每个命令在搜索路径中的位置,有-r时会使shell忘掉所有记忆的位置
命令readonly格式:readonly [name…],不带参数时会列出所有只读变量的清单,带参数时是指定对应的变量只读而不能再通过赋值改变其值
命令trap格式:trap arg [n]…,这里是指shell在收到信号n之后会读取并执行命令arg。作用:为其他信号另外指定处理方式,如果arg是空串则说明信号n会被shell和它引用的命令忽略;单纯的trap命令会显示与每个信号相关的命令表
命令type格式:type [name…],说明命令name是如何被解释的
命令unset格式:unset [name…], 删除由name指定的变量或者函数,注意这里有以下变量是不受unset作用的:PATH、PS1、PS2、MAILCHECK和IFS
命令umask格式:umask [-S] [mask], 将用户文件创建的掩码设置为mask的值,若mask为八进制则对应置位,否则mask应是符号方式。这命令可以用来设置文件权限
命令wait格式:wait [n],等待由n(进程ID)指定的进程终止,并报告终止状态。该命令返回码始终为0
Shell脚本编写要注意其执行权限、执行脚本环境的设置,脚本本身正确性。
环境设置说明:不能直接在其他shell下直接运行bash脚本。解决办法是在脚本第一行写:#!/bin/bash。在PATH环境变量中没有包括“.”(当前工作目录),解决办法:PATH=$PATH:.
避免脚本文件名字与已存在的命令的名字相同。避免脚本错误则要注意语法正确,可以用set打开-x或者启动shell时打开-x选项,将shell设置成跟踪模式,程序中也可以用echo和print命令提示来辅助调试



