1.你好World1.1。基本结构创建一个helloWorld.sh文件,写入如下内容:#!/bin/bashecho"helloworld"where#!告诉系统后面指定的路径程序就是解释这个脚本文件的shell程序。常见的shell程序包括以下几种(可以通过命令cat/etc/shells查看):BourneShell(/usr/bin/sh或/bin/sh)BourneAgainShell(/bin/bash)CShell(/usr/bin/csh)KShell(/usr/bin/ksh)ShellforRoot(/sbin/sh)...其中Bash在日常工作中被广泛使用,也是Linux系统默认的shell.执行sh脚本#增加可执行权限?chmodu+xhelloWorld.sh#运行脚本?./helloWorld.shor?shhellowWorld.sh1.2.注释单行注释#开头的行是注释多行注释的第一种方式:用一对{}括起来,定义为一个函数,没有地方可以达到注释的效果叫它。方法二::<file将输出重定向到文件。command>文件将输出重定向到附加的文件。n>file将文件描述符为n的文件重定向到file。n>>file将文件描述符为n的文件以追加方式重定向到file。n>&m合并输出文件m和n。n<&m合并输入文件m和n。<<标签将开始标签和结束标签之间的内容作为输入。关于文件描述符:0通常是标准输入(STDIN),Unix程序默认从stdin读取数据。1标准输出(STDOUT),Unix程序默认将数据输出到stdout。2标准错误输出(STDERR),Unix程序将错误信息写入stderr流。示例:#合并stdout和stderr并重定向到file?command>file2>&15.2。/dev/nullfile这是一个特殊的文件,写入的内容会被丢弃;如果你试图从这个文件中读取内容,也无法读取任何内容。我们通常将命令的输出重定向到它上面,起到“抑制输出”的作用。如:#屏蔽stdout和stderr?command>/dev/null2>&15.3。Heredocument#将两个分隔符之间的内容(文档)作为输入传递给命令。command<=10时,需要使用${n}获取参数。7.Includefiles(封装函数库)通常我们将常用的函数提取到单独的文件中,以便重复调用,减少冗余代码。对于函数库文件:后缀名随意,通常以.lib标识;通常,不授予可执行权限;不需要和脚本放在同级目录,只需要在引用脚本的时候指定即可;通常第一行一般使用#!/bin/echo输出警告信息,避免用户执行。示例:#!/bin/echo#/home/user1/lib/comm_function.libfunctionadd{echo"`expr$1+$2`"}#!/bin/bash#/home/user1/test.sh#导入函数库file#使用绝对或相对路径。./lib/comm_function.lib#usefunctioninfileadd13?sh-xtest_functions.sh+../lib/comm_function.lib+add13++expr1+3+echo448.常用命令8.1.find命令语法:find[path][option][operation]optionoptiondescriptionoptiondescription-name文件名-iname文件名(忽略大小写)-perm777文件权限-typef|d|l|c|b|p文件类型-userfileowner-nouserhasnovalidowner-groupfilebelonginggroup-nogrouphasnovalidbelonggroup-size-n|+nfilesize-prune排除某些搜索目录(通常与-路径一起)-mindepthnsearchesfromn-level子目录-maxdepthn最多搜索n级子目录-mtime-n|+n文件修改时间(天)-mmin-n|+n文件修改时间(分钟)-newerfile1文件修改时间早于file1例子:#文件名?find/etc/-name'*.conf'#文件类型#ffile;d目录;c字符设备文件;#b块设备文件;l链接文件;p管道文件?find/etc/-typef#filesize#-n小于等于;+n大于或等于?查找。-尺寸+100M?找到。-size-10k#文件修改时间#-n修改超过n天的文件;?找到。-mtime-3?查找。-mtime3?找到。-mtime+3#排除目录#-path./test1-prune排除test1目录#-path./test2-prune排除test2目录#-o类型f固定结尾写法?find.-path./test1-prune-o-path./test2-prune-otypefoperation-print打印输出-exec'command'{}\;其中{}为之前的搜索匹配结果-ok功能同exec,但是每次操作都会提示用户,用户决定是否执行相应的操作示例:#查找30天以上的日志文件并删除?find/var/log-name'*.log'-mtime+30-execrm-f{}\;#查找所有.conf文件并移动到指定目录?find/etc/apache-name'*.conf'-execcp{}/home/user1/backup\;8.2.echo命令用于输出字符串,基本格式为echostring。使用示例:#显示普通字符?echo"Itisatest"#OutputItisatest#显示转义字符?echo"\"Itisatest\""#Output"Itisatest"#显示变量#!/bin/shNAME="xiaoming"?echo"$NAMEItisatest"#输出xiaomingisatest#显示换行符?echo-e"OK!\n"#-eenableescape?echo"Itisatest"#shownonewline?echo-e"OK!\c"#-eenableescape\cnonewline?echo"Itisatest"#显示指向文件的结果?echo"Itisatest">myfile#显示命令执行结果?echo`date`8.3.printf命令模仿了C库(library)中的printf()程序,主要用于格式化输出。默认情况下,printf不会像echo一样自动添加换行符,我们可以手动添加\n。其基本语法格式为:?printfformat-string[arguments...]说明:format-string为格式控制字符串,arguments为参数列表。例子:?printf"%-10s%-8s%-4s\n"姓名性别体重kg?printf"%-10s%-8s%-4.2f\n"郭靖楠66.1234?printf"%-10s%-8s%-4.2f\n"杨国男48.6543?printf"%-10s%-8s%-4.2f\n"郭富女47.9876姓名性别体重kg郭靖男66.12杨国男48.65郭富女47.99其中:%s%c%d%f都是格式替代;%-10s指的是10个字符的宽度(-表示左对齐,no表示右对齐),10个字符宽度以内的任何字符都会显示,不够会自动用空格代替填充,超过也会显示所有的内容。%-4.2f指格式化为小数,其中.2指保留2位小数。更多用法示例:#可以不用引号输出?printf%sabcdef#format只指定一个参数,但是多余的参数还是会按照这个格式输出,format-string被复用了?printf%sabcdefabcdef?printf"%s\n"abcdefabcdef#如果没有参数,则%s被NULL替换,%d被0替换?printf"%sand%d\n"and08.4.测试命令用于检查某个条件是否成立,它可以对数值、字符和文件进行三种测试(详见第3节中相应的运算符部分)。基本用法示例:cd/biniftest-e./bashthenecho'文件已经存在!'elseecho'文件不存在!'fi9.补充9.1。变量替换规则示例}从头匹配,最短删除${var#*e}=>lloshell${变量##匹配规则}从头匹配,最长删除${var##*e}=>ll${variable%%matchingrules}从末尾开始匹配,最短删除${var%e*}=>hellosh${variable%%matchingrules}从末尾开始匹配,最长删除${var%%e*}=>H${variable/oldstring/newstring}只替换第一个匹配的${var/e/*}=>H*lloshell${variable//oldstring/newstring}替换所有${var//e/*}=>H*llosh*ll9.2。类型化变量shell中的变量默认都是字符串,除非通过以下方式声明。声明或排版参数说明-r只读-i整数-a数组-f显示脚本中定义的函数和内容-F显示脚本中定义的函数-X将变量声明为环境变量例如:?declare-rvar1="helloshelltype"?var1="hellolalala"zsh:只读变量:var19.3。使用bc进行浮点运算内置系统,支持+、-、*、/、^指数、%余数,以及使用scale指定小数位数,默认为0。示例:?whichbc/usr/bin/bc#示例?echo"5+4"|bc9?回声“5-4”|bc1?echo"5*4"|bc20?回声“5/4”|bc1?echo"scale=3;5/4"|bc1.250?echo"5%4"|bc1?echo"5^4"|bc6259.4。[...]和[[...]][[是关键字,很多shell都不支持。所有字符都不会用文件扩展名或标签分隔,但会有参数引用和命令替换;它将防止脚本中的许多逻辑错误,例如&&、||、<和>运算符可以用于[[...]]测试通过,但在[...]结构中出现错误。执行算术扩展。[是一个命令,相当于test,大多数shell都支持。其中的表达式应该是它的命令行参数,所以字符串比较运算符>和<必须转义,否则就变成IO重定向运算符了。不进行算术展开。