收藏 分享(赏)

shell脚本笔记.doc

上传人:HR专家 文档编号:6237867 上传时间:2019-04-03 格式:DOC 页数:27 大小:430KB
下载 相关 举报
shell脚本笔记.doc_第1页
第1页 / 共27页
shell脚本笔记.doc_第2页
第2页 / 共27页
shell脚本笔记.doc_第3页
第3页 / 共27页
shell脚本笔记.doc_第4页
第4页 / 共27页
shell脚本笔记.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

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

2、 src1 srcN dest 移动多个文件mv 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 转义序列,而 ec

3、ho命令会自动打印出换行。e.g. echo “Is that a mango?” 等于 printf “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 就被作为应该用到的精度

4、,连字符 表在左边对齐一个域。默认情况下,所有的域都是在右边对齐的.e.g. printf “%-16st%-16sn” “Name” “User Name”表示左对其,输出被分隔为两列,每 16 个字符长度被空格分隔开。2、输出重定向cmd file可以将命令列表的输出重定向e.g. date ; uptime ; who ; mylogcmd file 追加到文件cmd | tee file 将输出从定向到文件和屏幕,使用 tee 命令e.g. date | tee now 输出到屏幕同时写入文件 now3、输入重定向cmd file1 fileexec nfile其中 n 为文件描述符e

5、.g. exec 4file.out 把文件 file.out 和文件描述符 4 关联起来注意: exec 1file.out 则所有输出都将被放到 file.out 中,在终端屏幕上将什么也看不见普通的输入/输出重定向将指定命令 cmd 的输出重定向到指定的文件cmd n filecmd n filee.g. ls 1file 将 ls 命令的标准输出到 file.重定向标准输出和标准错误到单独的文件cmd 1 file1 2file2因为文件描述符 1 可以被省略,上面的命令可以简化为 cmd file1 2file2cmd 1file1 2file2cmd file1 2file2重定向

6、标准输出和标准错误到同一个文件cmd 1file 2 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 mike gene)在 bash 中设定多重数组元素,需要在赋值之前建立一个数组索引:e.g. $ myarray=(0=derri 3=gene 2=mike 1=terry)数组索引不必安装顺序注意:索引必须

7、是一个整数如果一个数组变量名和一个已经被定义了的标量变量名重名,那么标量变量的值就变成了数组变量中索引 0 的值。访问数组的值方法为: $nameindexe.g. $ echo $FRUIT2使用 $name* 和 $name 可以访问数组中所有的项目$name*认为实际有几个索引就是否几项$name认为实际有几个索引项加上空格分开的项目e.g. $ FRUIT=(apple banana “orange passion”)$name*认为有 3 项$name认为有 4 项只读变量 readonly变量可以通过 readonly 命令被标记为只读.可用来标记数组或标量变量为只读e.g. $

8、FRUIT=kiwi ; readonly FRUIT删除变量 unset格式: unset namee.g. $ unset FRUIT只读变量是无法被删除的,它将一直保持到 shell 退出为止。输出环境变量方法一: name=value ; export name方法二: export name=valueshell 变量是在 shell 初始化时被设定并内部运用的变量。附录:常用 shell 变量$PWD 指出当前工作目录$UID 指出当前用户的数字用户标示符$SHLVL 每次 bash 打开一个历程就自动加 1,这个变量的作用在于确定内建的 exit 命令是否关闭了当前会话。$REP

9、LY 若不给定参数,会让 read 命令读到输入的最后一行$RANDOM 产生 0 到 32767 的随机数$SECONDS 返回 shell 启动的秒数。$IFS shell 使用该变量 IFS 的值把一个字符串分隔为单独的词。IFS 的默认设置是空格和tab 键.e.g. dirs() OLDIFS=”$IFS”IFS=:for I in $_DIR_STACKdoecho “$I c”doneechoIFS=”$OLDIFS”$PATH 搜索路径$HOME 当前用户的主目录。附录:特殊变量$?上一条命令的退出状态保存在变量$?中,为 0 表示成功,非 0 表示失败可以用改变量来检测一条命

10、令是否执行成功。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” ; export PS

11、3;注意 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*取消一个集合,即不包括一个集合 !

12、cmd !chare.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 有值,

13、word 取代 param 的值,但 param 的值不变e.g. FRUIT=$MYFRUIT:-APPLE命令置换 (用反引号 )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 十、引用关闭对特殊字符

14、含义的解析处理被称为引用需要引用处理的元字符如下: * ? “ $ ; (update?) Y|N使用双引号 “禁止除了$和以外的所有元字符。因此可以引用变量。双引号中的反斜线可以起作用,只在下面 4 个符号之前起作用 $ “ 引用处理换行以在下一行中继续e.g. echo 1234567890输出为 1234567890e.g. echo Line 1Line 2输出为 Line1Line2引用处理正则表达式通配符e.g. grep 0-90-9*$ report2 report7注意:象 find 等命令,通配符必须使用单引号、双引号或反斜线进行引用处理,这样通配符才能传递给find 而不

15、会被 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 file 当 fil

16、e 存在并且是块文件时返回真-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 pat

17、hname 当由 pathname 指定的文件或目录存在并且可读时返回真-s file 当 file 存在并且是文件大小大于 0 时返回真-u pathname 当由 pathname 指定的文件或目录存在并且设置了 SUID 位时返回真-w pathname 当由 pathname 指定的文件或目录存在并且可写时返回真-x pathname 当由 pathname 指定的文件或目录存在并且可执行时返回真-o pathname 当由 pathname 指定的文件或目录存在并且被当前进程的有效用户 ID 所指定的用户所拥有时返回真字符串比较检查字符串是否为空 n -z语法: test -z st

18、r 或 -z str str 是要检测的字符串。当 str 长度为 0 时返回真。语法: test -n str 或 -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”字符串的相等语法:

19、test str1=str2 或 str1 = str2 e.g. if “$portmap” = “YES” ; then if X$portmap =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

20、int1 和 int2 可以是任何正整数或负整数,op 为下表中的一个操作符。如果 int1 或 int2 是一个字符串而不是整数,它就被作为 0 来对付。操作符 描述int1 eq int2 如果 int1 等于 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,返回真上一条命令的退出状

21、态保存在变量$?中,为 0 表示成功,非 0 表示失败可以用改变量来检测 一条命令是否执行成功:e.g. if $? eq 0 ; thenecho “Command was successful.”;elseecho “An error was encountered.”exitfi复合表达式用内建的操作符创建复合表达式语法: test expr1 op expr2 或 expr1 op expr2 expr1 和 expr2 是任何有效的 test 表达式,op 为-a 或 -o。expr1 a exprt2 表示 expr1 和 expr2 都为真时返回真expr1 o exprt2 表

22、示 expr1 或 expr2 都为真时返回真用条件操作符创建复合表达式语法: test expr1 op test expr2 或 expr1 op expr2 expr1 和 expr2 是任何有效的 test 表达式,op 为 ;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专用变量$-是一个包含所有 shell

23、 选项的列表。检查$-是否包含字母 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

24、” ;doecho “Enter the 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 thenecho “$USAGE”exit 1ficase “$1” in-t) TARGS=

25、”-tvf $2” ;-c) TARGS=”-cvf $2.tar $2” ;*) echo “$USAGE”exit 0;esactar $TARGS$*和$的区别为 shell 脚本指定的变元被存在两个特殊的变量$*和$中。这两个变量之间的差别在于如何存储变元:$*不保存引用,而$则保存。getopts 命令getopts 语法格式如下:getopts option-string var这里 option-string 是一个字符串,它包括了 getopts 所应该考虑的所有单个选项字符。var 是该选项应该被设置的变量的名字。推荐,var 处用一个名为 OPTION 的变量。getopt

26、s 对命令行中给出的选项进行解析的步骤如下:1 getopts 检查所有的命令行参数,查找以 字符开头的参数。2 当发现一个以 字符开头的参数时,它比较 之后紧接着的字符与给定的 option-string中的所有字符。3 如果发现该字符在 option-string 中有匹配,则把该选项字符赋予变量 var;否则,var 的值设置为?字符。4 重复 13,直到命令行中给出的所有选项都被检查完。5 当完成后,getopts 返回一个非 0 的退出码。另外,它将变量 OPTIND 的值设置为最后一个参数的下标。getopts 能够指出哪些选项要求附带参数通过在选项后面附加一个冒号 :字符来实现的

27、。在这种情况下,解析一个选项后,附带的参数就会设置为变量 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“

28、 thenecho “ERROR: Input file was not specified.“exit 1fiif -z “$INFILE“ ;thenINFILE=“$1“fi:$OUTFILE:=$INFILE.uuif -f “$INFILE“ ; thenif “$VERBOSE“ = “true“; thenecho “uuencoding $ INFILE to $OUTFILE . c“fiuuencode $INFILE $INFILE $OUTFILERET=$?if “$VERBOSE“=“true“;thenMSG=“Failed“if $RET -eq 0;thenM

29、SG=“Done.“fiecho $MSGfifiexit 011 十四、函数一个脚本和一个函数之间最重要的区别在于: 为了运行脚本,一个新的 shell 被开启;而运行函数是在当前的 shell 里面。函数的定义:语法: name()list;name 是函数名,list 是一系列命令在 ksh bash 和 zsh 中还提供另外一种函数定义的形式:function name list;函数调用可以从一个函数中调用另一个函数。带参数调用函数语法: name arg1 agrN这里 name 是函数名,arg1argN 是函数的参数。指定给函数的参数和指定给脚本的参数按照同样的方法在函数体中访

30、问:单个参数分别是$1、$2 等等,而所有参数的标示是$取消函数语法: unset name别名定义别名语法: alias name=”cmd”这里 name 是别名,cmd 是当 name 被指定后真正执行的命令。在别名中,cmd 不能是复合命令或一个列表在别名中,不能操作参数列表($)别名不能在 shell 程序中被正常使用。取消别名语法: unalias name局部变量的定义默认规定,除了与函数参数关联的特别变量,其他所有变量都有全局范围。语法: typeset var1=val1 varN=valN这里 var1varN 是变量名,val1valN 是分配给这些变量的值,这些值是可选

31、的。e.g. typeset fruit1 fruit2=banana通常递归调用需要用到局部变量。下面举个例子,该脚本逆序显示它的参数:e.g. reverse()if $# -gt 0 ; thentypeset arg=”$1”shiftreverse “$”echo “$arg”fireverse “$”函数的返回值当一个 shell 脚本结束时,它能使用 exit 命令通过退出代码返回退出状态。在函数中和 exit 类似的命令是 return 命令。语法: return rc这里 rc 式返回值。通常 0 代表成功,非 0 代表失败。12 十五、文本过滤器head 命令语法: hea

32、d -n lines filestail 命令语法: tail -n lines filesgrep 命令基本语法: grep -option word file这里的 file 是你用来搜索指定单词 word 的文件名,可指定多个文件名。-i 选项 设为大小写无关。-v 选项 不包含某一特定单词的一系列行。e.g. grep v # /etc/hosts 列出/etc/hosts 中不包含#的行-n 选项 在匹配行前面显示行号-l 选项 只显示包含特定单词的所有文件的文件名列表。e.g. grep l delete project/*wc 命令基本语法: wc -option file列出指

33、定文件中的行数、字数及字节数。-l 只计算行数 -w 只计算字数 -c 只计算字节数tee 命令基本语法: tee -option file读取标准输入并写到标准数出和文件中。-a 将输出追加到指定文件的尾部。默认 tee 命令覆盖指定的文件。e.g. cat file1 |tee a file2 |moretr 命令语法: tr set1 set2在这里 set1 中的所有字符都被转化为 set2 中的字符。注意字符和在 tr 中要用反斜杠转换,才能被正确处理。e.g. tr !?”:;(),.tn ttt; perl -i -pe s/pqr/xyz cat ttt 把目前目錄下所有最近三

34、天內修改過的檔案按照大小排出來: ls -l find . -type f -mtime -3 | sort -n +4 把目前目錄底下所有 dos 格式文字檔, 轉成 unix 格式: file find . -type | grep -i text | sed s/: .*/ /tmp/listing; perl -i -pe s/015/ cat /tmp/listing13 十六、用正则表达式过滤文本正则表达式1. 构成正则表达式的基本元素(1) 普通字符:包括大小写字母、数字、空格、下划线(2) 元字符:是在正则表达式中有特殊含义的字符。如下:元字符 . 可代替除换行符之外的任何单个

35、字符元字符 * 可代替零个或多个在它前面出现的字符或正则表达式。*总是匹配尽可能长的字符串元字符chars 可代替 chars 中的任何一个字符,chars 是一串字符序列。你可以用 - 字符号来定义一个字符范围。如果是 chars 中的第一个字符,那么将匹配没有在 chars 中指定的字符。元字符 匹配一行的开头(必须把作为正则表达式的第一个字符)元字符 $ 匹配一行的结尾(必须把$作为正则表达式的最后一个字符)元字符 把 后面的字符照常输出,通常用来转义( 不用特殊含义)一个元字符元字符 n1,n2、 匹配前面字符或正则表达式的最少 n1 次最多 n2 次出现。元字符 () 保存括号中的正

36、则表达式以备后用。以后可以用1 到9 表示前面保存的正则表达式元字符 在一个字的结尾匹配其前的正则表达式元字符 ? 匹配其前正则表达式的 0 次或 1 次出现元字符 + 匹配其前正则表达式的 1 次或多次出现A. 举例e.g. /peach/ 精确匹配字符串 peach,所有包含字符串 peach 的行都会被选择。e.g. /a.c/ 匹配 a+c、a-c、abc、match 、a3c 之类的字符串的行e.g. /a*a/ 匹配 a+c、a-c、abc、match 、a3c、ace、yacc、arctic 这样的字符串的行,他还可匹配这样的行:close the window。虽然 a 并没有

37、出 现,但因为*,它匹配查找零个或多个在它前面出现的字符。* 总是匹配尽可能长的字符串。e.g. /ch.*doc/ 匹配字符串 ch01.doc、ch02.doc、chdoc 之类的字符串。e.g. /tThe/ 匹配 The 和 thee.g. /T/ 匹配除 T 之外的所有字符e.g. /ch00-9*doc/ 匹配 ch01.doc 和 ch02.doc 之类的字符串,但是不匹配 chdoc 和 changedoc 之类的字符串。e.g. /the/ 匹配以 the 开头的行e.g. /friend$/ 匹配以 friend 结尾的行e.g. /t)1/ 匹配 test、taat、 t

38、, t、tbbt 之类的串。 1 在这里代替了 t(3) 一些有用的正则表达式匹配空白行 /$/ 或者 / *$/匹配一整行 /.*$/匹配某字符后的所有字符 /(.*$/ 匹配(后的所有字符匹配某字符前的所有字符 /.*.)/ 匹配)前的所有字符匹配一个或多个空格 /*/匹配 HTML(或 XML)标记集 /*/匹配有效的 URL /a-zA-Za-zA-Z*:wa-zA-Z0-9a-zA-Z0-9.*.*/匹配格式化的美元数 /$0-9*.0-90-9/2. sed 命令sed 是一种对它的输入的每一行进行一系列操作的流式编辑器(1) sed 的语法:sed /pattern/ actio

39、n files这里 files 是一个或多个文件的列表。pattern 是一个正则表达式,action 是下表中说给出的命令操作 描述p 打印行d 删除行s 用一个表达式置换另外一个A. 打印行sed /pattern/p files默认情况下 p 打印行时,sed 会把每一个输入行打印到输出,在将处理结果打印到输出。所以选中的行会被打印 2 次,没有被选中的行会被打印 1 次。为了避免这种情况可以指定 n 选项。e.g. sed n /0.0-90-9$/pfruit_prices.txtB. 删除行sed /pattern/dfilesC. 执行替换sed /pattern1/s/patt

40、ern2/pattern3/files使匹配规则 pattern1 的每一行中的 pattern2 被替换为 pattern3。如果 pattern1 被忽略,命令 s 将会对每一行输入都执行。默认情况下,s 命令在一行只执行一次替换。为了执行多次替换,需要用到 g(g 全局)操作符。/pattern1/s/pattern2/pattern3/g在 pattern3 位置可使用fruit_price.txt 打印每行的第 1、3 个字段3. awk 使用比较操作符(1) awk 使用比较操作符的语法:awk expression actions files这里 expression 是由下表给

41、出的比较操作符构成:操作符 描述大于= 大于等于= 等于!= 不等于value/pattern/ 如果 value 匹配样式,则为真value!/pattern/ 如果 value 不匹配样式,则为真e.g. #!/bin/shawk $3 75 printf $0; fruit_prices.txt输出 第 3 个字段包括一个小于或者等于 75 的值的行 并加上 REORDER 字符串。输出 第 3 个字段包含一个大于 75 的值的行。(2) 混合表达式与的语法: (expr1) fruit_prices.txt(4) 使用标准输入作为输入:e.g. ls l | awk $1 ! /tot

42、al/ printf “%-32s %sn”,$9,$5;4. awk 功能:变量及数值表达式的使用(1) 定义变量的语法:name=value这里 name 是变量名,value 是变量的值。初始化变量是没有必要的,当你第一次使用时它会自动初始化。变量名只能包含字母、数字和下划线,变量不能以数字开头。你可以在同一脚本中把数字和字符串赋值给变量。e.g. fruit=”peach”;fruit=100;e.g. fruit=”peach”;fruity=fruit;e.g. fruit=$1;(2) 使用数字表达式语法: num1 operator num2这里 num1 和 num2 是常数

43、或者是变量名。如果变量是字符串而不是数字,则 awk 使用值为 0而不是字符串。operator 是如下表的数值操作符。操作符 + - * / % 描述 加 减 乘 除 取模(余) 求幂e.g. awk / *$/ x=x+1;print x; t.txt赋值操作符语法: name operator num这里 nmae 是变量名,num 是变量的名字或常数,operator 是如下表指定的操作符之一。操作符 += -= *= /= %= =描述 加 减 乘 除 取模(余) 求幂e.g. awk / *$/ x+=1;print x; t.txt(3) 特殊的样式匹配: BEGIN 和 END

44、语法: awk BEGIN actions /pattern/ actions /pattern/ actions END actions files祥见 精通 shell 编程p200(4) awk 中的内部变量:变量 描述FILENAME 当前输入文件的名称。不能改变这个变量的值。NR 当前输入文件的行数或者输入文件的纪录。不能改变这个变量的值。NF 当前行或者记录的字段数。不能改变这个变量的值。OFS 输出字段的分隔符(默认是空格)FS 输入字段的分隔符(默认是空格和制表符,即t)OFMT 数字的输出格式(默认是%.6g)ORS 输出记录分隔符(默认是新起一行)RS 输入记录分隔符(默认

45、是新起一行)(5) 应用:改变输入字段分隔符。方法 1:在 BEGIN 中手工重置 FSe.g. awk BEGIN FS=”:”; print $1,$6; /etc/passwd方法 2:给 awk 指定 F 选项可以指定分隔符e.g. awk F : print $1,$6; /etc/passwd(6) 让 awk 使用 shell 变量许多版本 awk 不可直接访问 shell 变量。必须转换为 awk 变量。语法: awk script awkvar1=value awkvar2=value files这里 script 是你想执行的 awk 脚本。变量 awkvar1 等等是你想

46、设置的 awk 变量名称。e.g. awk $3 0) printf(“%16s”,$x);x-=1;printf “”; fruit_prices.txt(3) do 语句的基本语法:do actions while (expr)这里 expr 是用条件操作符建立的表达式,expr 外面的圆括号是必需的。actions 可以是任何有效的 awk 命令序列。当一个操作包含一个或多个语句时,涵括这些 actions 的大括号是必须的。do 语句是 while 语句的一个变种。区别是 do 语句至少执行一次.e.g. awk x=NF;do printf(“%16s”,$x);x-=1; whil

47、e (x0);print “”; fruit_prices.txt(4) for 循环的基本语法:for (init_cntr; test_cntr; incr_cntr) action这里 init_cntr 初始化计数器变量,test_cntr 是一个测试计数器变量值得表达式,incr_cntr 增加计数器的值。for 循环中包围表达式的圆括号是必需的。要执行的操作action 可以是任何有效的 awk 命令序列。当一个操作包含一个或多个语句时,涵括这些actions 的大括号是必须的。e.g. awk for (x=1;x out.txt”;echo hello $OUTPUT则屏幕打印

48、 hello out.txt 没有正的输出到out.txt 文件。e.g. OUTPUT=” out.txt”;eval echo hello $OUTPUT则屏幕上没有文本输出,输出被重定向到 out.txt:命令的应用:和 if (内部命令):命令有时在 if 语句中紧接着 than 使用。e.g. if -x $CMD ; then:elseecho Error: $CMD is not executable $PRICE/$UNITS” | bc16 十九、信号信号基础shell 脚本中重要的信号名称 值 描述0 Shell 脚本结束退出时,都会给自己发信号 0 表明脚本执行完成并且应该终止SIGHUP 1 控制终端发现被挂起或控制进程死亡S

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报