吴洪东-2018-07-03-博客https://segmentfault.com/u/wu...LinuxShell基本语法ScriptTag#!/bin/bash是一个shell脚本中的第一行代码,表示脚本使用什么解释器;#!/bin/bashecho命令用于向窗口输出文本;回声“你好壳”;#启用转义换行符echo-e"hello\nshell";#反引号显示命令执行结果echo`ls/`;#将显示结果指向文件echo'hello'>1.txt;single-linecomment#表示单行注释;多行注释,EOF也可以使用其他符号,例如!:>>EOF注释内容1注释内容2EOF:>>!注1注2!示例创建一个名为/tmp/hello.sh#!/bin/bashecho"helloshell"的脚本文件;给脚本执行权限,执行脚本chmodu+x/tmp/hello.sh;./tmp/hello.sh变量定义使用格式:key=value;当value被单引号或双引号括起来时,它是一个字符串;当它是一个数字时,它是一个数值;使用美元符号$引用,标准格式为:${key};但有时你也可以使用$key;以供参考;#字符串变量a='A';b="${a}\\B";#只读变量readonlyc=7;#全局变量exportd=3.14;#单引号内容原样输出,不能出现单引号,不能使用转义符echo$a;#内容双引号可以包含变量,转义字符可以使用echo$b;#删除变量unsetc;字符串n="0123456789";m="aaabbbaaabbb";#返回字符串变量n的长度echo${#n};#返回从第5个字符到结尾的部分echo${n:5};#返回从第0个字符开始长度为5的部分echo${n:0:5};#删除开头部分matches012echo${n#012};#删除最后匹配789的部分echo${n%789};#将第一次出现的aaa替换为xxxecho${m/aaa/xxx};#将所有aaa替换为xxxecho${m//aaa/xxx};#替换开头的aaaforxxxecho${m/#aaa/xxx};#把最后的bbb换成xxxecho${m/%aaa/xxx};执行输出:10567890123434567890123456xxxbbbaaabbbxxxbbbxxxbbbxxxbbbaaabbbaaabbbaaabbbreplaceextensionv=V;echo$v;#如果v未定义或为空,则返回vvv,但v的值保持不变;如果v存在且不为空,则返回V;echo${v:-vvv};#如果v未定义或为空,则返回vvv,并将v的值赋给vvv;如果v存在且不为空,则返回V;echo${v:=vvv};#如果v未定义或为空,则返回vvv并终止脚本;如果v存在且不为空,则返回V;echo${v:?vvv};#如果v未定义或为空,则返回空,但v的值保持不变;如果v存在且不为空,则返回vvv;echo${v:+vvv};数值运算的四种算术运算符:+、-、*、/幂运算符、模运算符:**、%自增自减运算符:++、--赋值运算符:=、+=、-=、*=、/=,%=比较运算符:<,>,<=,>=,==,!=逻辑运算符:&&,||,!#运算表达式必须在双括号内((e??xpression))echo$((a=3**2));#输出9个变量输入格式:read-p[<变量名>...];#输入单个变量read-p"Pleaseenter:"n;echo$n;#输入多个变量read-p"Pleaseenter:"n1n2n3;echo$n1/$n2/$n3;返回值每条命令都会返回一个状态码,0表示成功,其他非零值表示各种情况下出错,exitn;(n的范围是0~255),1表示一般错误,126表示没有执行权限,127表示找不到命令;参数以参数形式传递格式:./shell脚本文件参数1参数2...#在脚本文件test.sh中添加3个参数./shell/test.shp1p2p3;#获取test.sh文件中的参数echo$1$2$3;Parameter#传递给脚本的参数个数echo$#;#显示所有参数echo$*;echo$@;#显示第一个参数echo$1;#显示第10个参数,第10个参数必须使用${n}echo${10};#显示上一条命令的退出状态,0表示没有错误,其他值表示错误;echo$?;#当前进程的PIDecho$$;测试表达式test语句格式一:test<测试表达式>格式二:[<测试表达式>]格式三:[[<测试表达式>]]格式一和格式二是等价的,格式三可以用&&,||,!逻辑连接器;格式2和3符号前后必须留空格;a=1.1;b=1.1;如果测试$a==$b;然后#如果(($a==$b));那么#if[$a-eq$b];那么#如果[[$a==$b]];thenecho'等于';菲;stringtest-zstr字符串是否为空字符串;-nstr字符串不是空字符串;str1==str2两个字符串是否相同;str1!=str2两个字符串是否不同;整数二进制比较[]使用-eq、-ne、-gt、-ge、-lt、-le;在(())中使用==、!=、>、>=、<、<=;使用-a,-o,!在[];使用&&,||,!在[[]];文件目录测试-e文件文件存在;-f文件为普通文件;-d文件是一个目录;-L文件是链接文件;-b文件是块设备文件;-c文件是字符设备文件;-s文件长度是否非零非空;-r文件是可读文件;-w文件是可写文件;-x文件是可执行文件;-O文件是文件的所有者;-G文件是否属于文件组;-u文件是否设置了SUID权限;-g文件是否设置了SGID权限;#当目录不存在时创建目录[!-e/shell]&&mkdir-p/shell;数组定义格式一:array=(a1'a2'a3);格式二:array[0]=a1;array[1]='a2';array[2]=a3;#定义数组array=(1'2');#设置第三个元素array[2]=3;#显示第一个元素echoarray[0];#获取数组的所有元素echo${array[*]};echo${array[@]};#Get数组的大小echo${#array[*]};函数定义格式:functionfun(){}function关键字可以省略;returnn可以加;(n必须为0~255)函数执行后,可以通过$?获取返回值;乐趣(){返回1;回声“结束”;}有趣;回声$?;流控制if语句iftest-e/shell/1;然后echo'1个文件存在';elif测试-e/shell/2;然后echo'2个文件存在';#elsebranch是最后一个默认分支,可以省略,最多一个elseecho'noneexist';fi;casestatementread-p'请输入:'num;case$numin1)echo'num=1';;2)echo'num=2';;*)echo'num=?';;esacwhile语句break:跳出循环;continue:跳过本次循环,进入下一次迭代;exitn:将中止当前函数和调用它的主shell;i=0;len=10;while(($i<$len));doecho$i;let"i++";done;#Loopreadthecontentofthefilelinewhilereadline;doecho$line;done、一般加上case语句处理;在123中选择x;在1)中执行case$xecho'x=1';;*)回显'x=?';;esac;完成;无限循环while:#或whiletruedoecho'loop';done;for((;;)){echo'loop';}