当前位置: 首页 > Linux

Shell编程快速入门指南

时间:2023-04-06 03:51:44 Linux

第一个shell脚本#!/bin/bashecho"hello,world"运行程序可以作为解释器参数,也可以作为可执行程序bashtest.shchmod+xtest.shtest.sh变量名="huruji"需要注意的是,变量名和等号之间不能有空格。使用echo$nameecho${name}在变量名前加$,{}表示变量名的边界。只读变量name="huruji"readonlyname使用readonly定义一个变量为只读变量,只读变量不能重新赋值删除变量name="huruji"unsetname使用unset删除变量,并且不能再次使用。Stringname="huruji"echo"mynameis$name"字符串可以用单引号和双引号,单引号不能包含单引号,连转义单引号都不逊色,双引号可以,双引号字符串也可以使用。拼接name="huruji"hello="mynameis${name}"得到字符串长度str="huruji"echo${#str}#6提取子串str="huruji"echo${str:2:3)从字符串的第二个字符提取3个字符,输出ruj搜索str="huruji"echo`exprindex"$str"u`,此时输出2,因为此时第一个字符位置从1开始数组定义names=("huruji""greywind""xie")echo${names[0]}echo${names[2]}readecho${names[2]}echo${names[@]}如上比如用@获取数组中的所有元素,获取长度length=${#names[@]}length=${#names[*]}Shell参数传递在执行Shell脚本时,可以传递参数给脚本,在Shell中获取这些参数的格式为$n,即$1,$2……,echo"第一个参数为:$1"echo"第一个参数为:$2"echo"第一个参数是:$3"runchmod+xtest.shtest.sh121314那么此时输出:第一个参数是:12第一个参数是:13第一个参数是:14另外还有几个其他特殊字符处理参数$#:传递给脚本的参数个数$*:显示所有参数$$:当前运行脚本的进程ID号$!:后台运行的最后一个进程ID号$@:返回所有参数$-:显示shell当前使用的选项$?:退出状态,0表示没有错误,其他表示错误其他命令,比如awk和expr,其中expr用得最多。expr是一个表达式计算工具,可以完成表达式的求值运算。val=`expr2+2`echo$val需要注意的是运算符两边需要空格,并且使用了反引号。算术运算符包括:+-×/%===!=关系运算关系运算只支持数字,不支持字符串,除非字符串的值是数字。a=12b=13if[$a-eq$b]thenecho"equal"elseecho"notequal"fi-eq:等于-ne:不等于-gt:大于-lt:小于-ge:大于thanorequalto-le:小于等于布尔运算!:not-o:or-a:andlogicaloperator&&:logicaland||:logicalorstringoperator=:equal[$a=$b]!=:不等于[$a!=$b]-z:字符串长度是否为0,为0则返回true[-z$a]-n:字符串长度是否为0,返回trueifisnot0[-n$a]str:character字符串是否为空,不为空则返回true[$a]文件检测操作符,用于检测Unix文件的各种属性。-b:检查文件是否为块设备文件[-b$file]-c:检查文件是否为字符设备文件[-c$file]-d:检查文件是否为目录[-d$file]-f:检查文件是否为普通文件[-f$file]-g:检查文件中是否设置了SGID位[-g$file]-k:检查文件中是否设置了sticky位file[-k$file]-p:检查文件是否为Famouspipes[-p$file]-u:检查文件是否设置了SUID位[-u$file]-r:检查文件是否可读[-r$file]-w:检查文件是否可写[-w$file]-x:检查文件是否可执行[-x$file]-s:检查文件大小是否大于0[-s$file]-e:检查文件是否存在[-e$file]file="/home/greywind/Desktop/learnShell/test.sh"if[-e$file]thenecho"fileexists"elseecho"文件不存在"fiif[-r$file]thenecho"readable"elseecho"unreadable"fiif[-w$file]thenecho"writable"elseecho"notwritable"fiif[-x$file]thenecho"可执行"elseecho"不可执行"fiif[-d$file]thenecho"是目录"elseecho"不是目录"fiif[-f$file]thenecho"是普通文件"elseecho"不是一个普通文件”fiechoecho可以在显示输出时省略双引号。使用read命令从标准输入中读取一行并将其分配给变量。readnameechoyournameis$name换行使用escapen,非换行使用c另外,使用>回显结果写入指定文件,如果这个文件不存在,会自动创建echo"itisatest">"/home/greywind/Desktop/learnShell/hello"使用反引号显示命令执行的结果,比如date,history,pwdecho`pwd`echo`date`printfShell中的输出命令printf类似于C语言中的printf(),语法格式为:printfformat-string[arguments...]printf"%-10s%-8s%-4s\n"namegenderWeightkgprintf"%-10s%-8s%-4.2f\n"GuoJingnan66.1234printf"%-10s%-8s%-4.2f\n"YangGuonan48.6543printf"%-10s%-8s%-4.2f\n"GuoFunv47.9876testtest命令用于检查某个条件是否成立,可以对数值、字符、文件进行测试a=100b=200iftesta==bthenecho"equal"elseecho"notequal"fi流量控制ifa=100b=200iftest$a-eq$bthenecho"equal"elseecho"notequal"fia=100b=200iftest$a-eq$bthenecho"equal"elif测试$a-gt$bthenecho"aisgreaterthanb"eliftest$a-lt$bthenecho"aislessthanb"fifornumin1234doecho${num}donenum=10for((i=1;i<10;i++));do((num=num+10))donecho$numwhilenum=1while[$num-lt100]do((num++))doneecho$num无限循环while:docommandonewhiletruedocommandonefor((;;))untiluntilconditiondocommanddonecasevalueinmode1)command1command2...commandN;;模式2)命令1命令2...命令N;;esac需要注意与其他语言不同,Shell使用;;表示break,如果不匹配,则用*捕获值echo"Enteranynumber123"readnumcase$numin1)ech??o"Enter1";;2)回显“输入2”;;3)回显“输入3”;;*)echo"输入的值不是123";;esac和其他语言类似,循环可以使用break和continue跳出function函数定义用户自定义定义函数可以使用也可以不使用function关键字,如果指定返回值则返回值同时,如果没有return语句,则将最后一次操作的结果作为返回值functionfirst(){echo"helloworld"}first(){echo"helloworld"}调用函数直接使用这个函数名firstfunctionparametercallfunction可以传入参数,在函数内部使用$n获取传入的参数,这类似于获取运行程序时使用的参数,但需要注意的是,超过两位数的要用{}来告诉shell边界,如${12},${20}functionadd(){数=0;对于((我=1;我<=$#;我++));donum=`expr$i+$num`donereturn$num}add12345a=$?echo$a函数本身是一个命令,所以只能通过$?得到返回值输入输出重定向在上面的例子中,>可以用来将回显结果写入指定的文件。这是一种输出重定向。重定向主要有以下几种:描述符为n的文件通过追加重定向到文件filen>&m:合并输出文件m和nn<&m:合并输入文件m和n<"./user",使用cat命令查看内容是否已保存。如果不想覆盖文件内容,可以使用append方法。who>>"./user"Shell文件包含Shell脚本,可以包含外部脚本,可以方便的将一些常用的代码封装成一个独立的文件。包含的语法格式如下:.filename#或源文件名,例如:test1.shecho"helloworld"test.shsource./test1.shecho"hello"