欢迎重视「Android茶话会」
- 回 「学习之路」 取Android技能路线经典电子书
- 回「pdf」取阿里&字节经典面试题、Android、算法、Java等系列武功秘籍。
- 回 「天边」 取天边论坛200+精彩博文,包括小说、形而上学等
Shell是一种指令行解说器,它是在Unix和Linux操作体系中广泛运用的一种工具,也是咱们日常开发工作中的好帮手,相较于Python,Shell语法简略非常好上手而且开箱即用无需纠结装置Python2还是Python3。下面将从 入门到实践详细介绍下Shell编程
本篇是入门篇
入门篇:
大纲图如下:
字符串
字符串替换
- ${变量名#匹配规矩}从变量最初进行规矩匹配,将契合最短的数据删去。
- ${变量名##匹配规矩}从变量最初进行规矩匹配,将契合最长的数据删去。
- ${变量名%匹配规矩}从变量尾部进行规矩匹配,将契合最短的数据删去。
- ${变量名%%匹配规矩}从变量尾部进行规矩匹配,将契合最长的数据删去。
- ${变量名/旧字符串/新字符串}变量内容契合旧字符串,则榜首个旧字符串会被新字符串替代。
- ${变量名//旧字符串/新字符串}变量内容契合旧字符串,则悉数旧字符串会被新字符串替代。
var_1="Iloveyou,Doyouloveme"
var=${var_1#*ov}#eyou,Doyouloveme
var=${var_1##*ov}#eme
var=${var_1%ov*}#Iloveyou,Doyoul
var=${var_1%%ov*}#Il
var_2="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
#榜首个小写bin被替换为大写的BIN
var=${var_2/bin/BIN}#/usr/local/BIN:/usr/bin:/bin:/usr/sbin:/sbin
#一切小写bin会被替换为大写的BIN
var=${var_2//bin/BIN}#/usr/local/BIN:/usr/BIN:/BIN:/usr/sBIN:/sBIN
抽取子串
- ${string:position}从string的 position开端。
- ${string:position:length}从position开端,匹配长度为 length
- ${string: -position}从右边开端匹配。
- ${string:(position)}从左面开端匹配。
- expr substr $string $postion $length从 position开端,匹配长度为 length
字符串长度
-${#string}
-exprlength"$string"假如string有空格有必要加双引号
var_1="Helloworld"
len=${#var_1}#11
len=`exprlength"$var_1"`#11
获取子串在字符串中的索引方位
- expr index$substring 从1开端核算索引方位
var_1="quickstartisanapp"
ind=`exprindex"$var_1"start`#6
ind=`exprindex"$var_1"uniq`#1
ind=`exprindex"$var_1"f`#0
核算子串长度
- expr match $string substr
从头开端匹配子串长度,假如没有匹配到则回来0,匹配到了回来匹配子串的长度
var_1="quickstartisanapp"
sub_len=`exprmatch"$var_1"app`#0
sub_len=`exprmatch"$var_1"quic`#4
sub_len=`exprmatch"$var_1"quic.*`#18
字符串替换大小写
#!/bin/bash
#留意:脚本榜首行一定要注明脚本解说器是bash.不能是sh,或dash
#由于sh软衔接有或许指向的是dash
var="Hello,Word"
#把变量中的榜首个字符换成大写
echo${var^}
#把变量中的一切小写字母,悉数替换为大写
echo${var^^}
#把变量中的榜首个字符换成小写
echo${var,}
#把变量中的一切大写字母,悉数替换为小写
echo${var,,}
数组
界说数组
array=('v1''v2''v3')
输出数组内容
${array[@]}#输出悉数内容
${array[*]}#也是输出悉数内容
${array[1]}#输出下标索引为1的内容
获取数组长度
${#array}#数组内元素个数
${#array[2]}#数组内下标为2的元素长度
数组赋值
array[0]="frank"#给数组下标为1的元素赋值为frank
array[20]="lion"#在数组尾部添加一个新元素
删去数组
unsetarray[2]#铲除元素
unsetarray#清空整个数组
数组遍历
forvin${array[@]}
do
done
函数
界说
- 函数名后边的圆括号不加任何参数
- 函数的完整界说有必要置于函数的调用之前
函数名(){
函数体
}
传参
#!/bin/bash
print_something(){
echo"hello$1"#$1获取榜首个参数
}
print_somethingLion#Lion为参数
print_somethingFrank#Frank为参数
参数获取
$1~$9:函数的榜首个到第9个的参数。
$0:函数地点的脚本名。
$#:函数的参数总数。
$@:函数的悉数参数,参数之间运用空格分隔。
$*:函数的悉数参数,参数之间运用变量$IFS值的榜首个字符分隔,默以为空格,可是能够自界说。
$?:显现最终指令的退出状况。0表明没有过错,其他任何值表明有过错。能够用于函数回来值
回来值
testFun(){
echo"helloworld!"
return99
}
#千万要留意shell并不像其他言语直接回来回来值,其回来值放到$?中,这也是为什么只能回来整型的原因
#所以这种承接办法是过错的,获取到的值是echo打印的内容
#return_value=`testFun`
#以下才是正确获取通过return回来的回来值的正确写法
testFun
echo"thereturnvalueis:$?"
局部变量
- 不做特别声明,shell中变量都是全局变量
- 局部变量 运用 「local」 关键字,函数内外同时存在同名变量,则函数内部会覆盖函数外部变量
#!/bin/bash
localvar="fun1"
main(){
func1
func2
}
func1(){
locallocalvar="funlocal"
echo${localvar}
localvar="fun2"
}
func2(){
echo${localvar}
}
main"$@"
循环
until
until[条件判别式]
do
程序
done
while循环
while[条件判别式]
do
程序
done
for循环
两种程式
//方法一
for变量in值1值2值3…(能够是一个文件等)
do
程序
done
这种语法中for循环的次数,取决于in后边值的个数(空格分隔),有几个值就循环几次,而且每次循环都把值赋予变量。
也便是说,假设in后边有三个值,for会循环三次,榜首次循环会把值1赋予变量,第2次循环会把值2赋予变量,以此类推。
//方法二
for((初始值;循环操控条件;变量改变))
do
程序
done
语法二中需求留意:
初始值:在循环开端时,需求给某个变量赋予初始值,如i=1;
循环操控条件:用于指定变量循环的次数,如i<=100,则只需i的值小于等于100,循环就会继续;
变量改变:每次循环之后,变量该如何改变,如i=i+1。代表每次循环之后,变量i的值都加1。
逻辑操控
多分支case
每个程序之后;; 双分号结尾;以 case最初以esac结尾
[root@localhost~]$vish/if-case.sh
#!/bin/bash
read-p"请输入一个字符,并按Enter确认:"KEY
case"$KEY"in
[a-z]|[A-Z])
echo"您输入的是字母"
;;
[0-9])
echo"您输入的是数字"
;;
*)
echo"您输入的是其他字符"
;;
esac
if
if[条件判别式1]
then
当条件判别式1成立时,履行程序1
elif[条件判别式2]
then
当条件判别式2成立时,履行程序2
…省掉更多条件…
else
当一切条件都不成立时,最终履行此程序
fi
文件
文件与目录
操作符 | 阐明 |
---|---|
pwd | 查看当时目录 |
cd | 切换目录 cd.. cd ~ cd / |
ls | 查看当时目录的文件列表 |
mkdir | 创建目录或文件 |
echo | 打印 |
cat | 链接、查看文件 > , >> |
less | 文件内容过多,以分页方法查看 |
q | 退出 |
mv | 移动, . 代表当时目录;移动文件到一个目录,最终一个为方针目录 |
cp | 仿制文件或目录 |
rm | 移除文件或许目录 |
rmdir | 删去目录 |
#移动文件到某个目录
mvcombined.txtdir1
#.代表当时目录
mvdir1/combined.txt.
#移动多个文件到一个目录,最终一个为方针目录,如把以下几个文件及文件夹dir3移动到dir2
mvcombined.txttest_*dir3dir2
#修正文件名、目录名
mvtest_1.txttest1.txt
mv"folder1"folder_1
运算
bash的运算有以下几种方法
$(( ))
只能核算整数
expr
语法格式: expr $num2
- num1 | num2– num1不为空且非0,回来 num1; 不然回来 num2
- num1 & num2– num1不为空且非0,回来 num1;不然回来0
- num1 < num2– num1小于 num2,回来1;不然回来0
- num1 <= num2– num1小于等于 num2,回来1;不然回来0
- num1 = num2– num1等于 num2,回来1;不然回来0
- num1 != num2– num1不等于 num2,回来1;不然回来0
- num1 > num2 — num1大于 num2,回来1;不然回来0
- num1 >= num2 — num1 大于等于 num2,回来1;不然回来0
- num1 + num2– 求和
- num1 – num2– 求差
- num1 * num2– 求积
- num1 / num2– 求商
- num1 % num2– 求余
let
let指令声明变量时 能够直接履行算术表达式
let"foo=1+2"
echo$foo#3
运算符
文件测验运算符
文件测验运算符用于检测Unix/Linux文件的各种属性
操作符 | 阐明 |
---|---|
-b file | 检测文件是否是块设备文件 |
-c file | 检测文件是否是字符设备文件 |
-d file | 检测文件是否是目录 |
-f file | 检测文件是否是一般文件,不是目录或许设备文件 |
-g file | 检测文件是否设置了SGID位 |
-p file | 检测文件是否是明管道 |
-r file | 检测文件是否可读 |
-w file | 检测文件是否可写 |
-x file | 检测文件是否可履行 |
-s file | 检测文件是否为空 |
-e file | 检测文件(包括目录)是否存在 |
- -e $file exist 的缩写,表明文件是否存在。
- -d $file directory 的缩写,表明文件是否为一个目录。
- -f $file file 的缩写,表明文件是否是一个文件。
- -L $file Link 的缩写,表明链接。
- -r $file readable 的缩写,表明文件是否可读。
- -w $file writable 的缩写,表明文件是否可写。
- -x $file executable 的缩写,表明文件是否可履行。
- $file1 -nt $file2 表明文件 file1 是否比 file2 更新。
- $file1 -ot $file2 表明文件 file1 是否比 file2 更旧。
字符串测验运算符
运算符 | 阐明 |
---|---|
= | 检测两个字符串是否持平 |
!= | 检测两个字符串是否不持平 |
-z | 检测字符串长度是否为0 |
-n | 检测字符串长度是否不为0 |
str | 检测字符串是否不为空 |
- $string1 = $string2 表明两个字符串是否持平。
- $string1 != $string2 表明两个字符串是否不持平。
- -z $string 表明字符串 string 是否为空。
- -n $string 表明字符串 string 是否不为空。
数字测验运算符
运算符 | 单词 | 阐明 |
---|---|---|
-eq | equal | 查看两个数是否持平,持平回来true |
-ne | not equal | 查看两个数是否持平,不持平回来true |
-gt | great than | 检测左面的数是否大于右边的,假如是 回来true |
-lt | less than | 检测左面数是否小于右边数,假如是 回来true |
-ge | great than or equal | 检测左面数是否大于等于右边的,假如是,回来true |
-le | less than or equal | 检测左面数是否小于等于右边,假如是,回来true |
- num1−eqnum1 -eq num2 equal 的缩写,表明两个数字是否持平。
- num1−nenum1 -ne num2 not equal 的缩写,表明两个数字是否不持平。
- num1−ltnum1 -lt num2 lower than 的缩写,表明 num1 是否小于 num2 。
- num1−lenum1 -le num2 lower or equal 的缩写,表明 num1 是否小于或等于 num2 。
- num1−gtnum1 -gt num2 greater than 的缩写,表明 num1 是否大于 num2 。
- num1−genum1 -ge num2 greate or equal 的缩写,表明 num1 是否大于或等于 num2
逻辑判别
- && 表明逻辑与,只需有一个不为真,整个条件测验为假。
- || 表明逻辑或,只需有一个为真,整个条件测验就为真。
- ! 表明反转测验条件。
变量
预界说变量
预界说变量 | 作用 |
---|---|
$? | 最终一次履行指令的回来状况,为0表明,上一个指令正确履行,不然代表上一个指令履行过错 |
$$ | 当时进程的进程号 PID |
$! | 后台运转的最终一个进程号PID |
[root@localhostsh]$ls
count.shhello.shparameter2.shparameter.sh
#ls指令正确履行
[root@localhostsh]$echo$?
#预界说变量“$?”的值是0,证明上一个指令履行正确
[root@localhostsh]$lsinstall.log
ls:无法访问install.log:没有那个文件或目录
#当时目录中没有install.log文件,所以ls指令报错了
[root@localhostsh]$echo$?
2
#变量“$?”回来一个非的值,证明上一个指令没有正确履行
#至于过错的回来值到底是多少,是在编写ls指令时界说好的,假如碰到文件不存在就回来数值2
方位参数
方位参数变量 | |
---|---|
$n | 0表明当时脚本程序0表明当时脚本程序 1-9代表榜首到第九参数,10以上参数需求大括号 {10} |
$* | 代表指令行中一切参数,$把一切参数当作一个全体 |
$@ | 代表指令行中一切参数,每个参数差异对待 |
$# | 代表指令行中一切参数的个数 |
[root@localhostsh]$viparameter2.sh
#!/bin/bash
foriin"$*"
#界说for循环,in后边有几个值,for会循环多少次,留意“$*”要用双引号括起来
#每次循环会把in后边的值赋予变量i
#Shell把$*中的一切参数当作是一个全体,所以这个for循环只会循环一次
do
echo"Theparametersis:$i"
#打印变量$i的值
done
x=1
#界说变量x的值为1
foryin"$@"
#相同in后边的有几个值,for循环几次,每次都把值赋予变量y
#可是Shel1中把“$@”中的每个参数都当作是独立的,所以“$@”中有几个参数,就会循环几次
do
echo"Theparameter$xis:$y"
#输出变量y的值
x=$(($x+1))
#然变量x每次循环都加1,为了输出时看的更清楚
done
环境变量设置
export 声明的变量即是环境变量
环境变量查询和删去
env指令和set指令差异:set指令能够查看一切变量,而env指令只能查看环境变量
[root@localhost~]$unsetgender#删去环境变量gender
[root@localhost~]$env|grepgender
变量删去
unset 变量名
变量查看
set -u 调用未声明变量会报错 -x 履行之前会把指令先输出一次 +<参数> 撤销魔偶个set曾发动的参数
[root@localhost~]$set[选项]
选项:
-u:假如设定此选项,调用未声明变量时会报错(默许无任何提示)
-x:假如设定此选项,在指令履行之前,会把指令先输出一次
+<参数>:撤销某个set曾发动的参数。
[root@localhost~]$set
BASH=/bin/bash
…省掉部分输出…
name='shenchao'
#直接运用set指令,会查询体系中一切的变量,包括用户自界说变量和环境变量
[root@localhost~]$set-u
[root@localhost~]$echo$file
-bash:file:unboundvariable
#当设置了-u选项后,假如调用没有设定的变量会有报错。默许是没有任何输出的。
[root@localhost~]$set-x
[root@localhost~]$ls
+ls--color=auto
anaconda-ks.cfginstall.loginstall.log.syslogshtdirtesttestfile
#假如设定了-x选项,会在每个指令履行之前,先把指令输出一次
[root@localhost~]$set+x
#撤销发动的x参数
细节
反引号
假如指令不必反引号包括,指令不会履行,而是直接输出 只有用反引号包括的指令、运用${指令}的方法也是能够
[root@localhost~]$echols
ls
#假如指令不必反引号包括,指令不会履行,而是直接输出
[root@localhost~]$echo`ls`
anaconda-ks.cfginstall.loginstall.log.syslogshtesttestfile
#只有用反引号包括指令,这个指令才会履行
[root@localhost~]$echo$(date)
2018年10月21日星期一18:25:09CST
#运用$(指令)的方法也是能够的
单引号和双引号
假如输出运用单引号,则$name原封不动输出 假如输出运用双引号,则输出变量name的值sc 反引号和双引号括起来的指令会正常履行; 反引号被单引号括起来指令不会履行作为一般字符串输出
[root@localhost~]$name=sc
#界说变量name的值是sc(便是最正派的人,超哥我了!)
[root@localhost~]$echo'$name'
$name
#假如输出时运用单引号,则$name原封不动的输出
[root@localhost~]$echo"$name"
sc
#假如输出时运用双引号,则会输出变量name的值sc
[root@localhost~]$echo`date`
2018年10月21日星期一18:16:33CST
#反引号括起来的指令会正常履行
[root@localhost~]$echo'`date`'
`date`
#可是假如反引号指令被单引号括起来,那么这个指令不会履行,―date`会被当成一般字符输出
[root@localhost~]$echo"`date`"
2018年10月21日星期一18:14:21CST
#假如是双引号括起来,那么这个指令又会正常履行
Shell反引号、()和{}的差异
反引号与$()
用于指令替换,获取指令的回来值
all_files=`ls`#获取ls指令的履行成果
all_files=$(ls)#作用同上
- ${}
用于变量替换
echo${A}B
特别变量替换
1.${var:n}若n为正数,n从0开端,表明在变量var中提取第n个字符到结尾的一切字符
2.${var:n1:n2}用于提取从下标n1开端后边n2个字符
3.${/}与${//}用于字符串形式匹配替换
4.${#}、${##}、${%}与${%%}用于字符串形式匹配截断
[]和[[ ]] 、(())
在运用[]或许test指令进行字符串判空时,需求在引用的变量上加上双引号""。
假如运用[[]]的话就不需求。
$(())用来做整数运算的
- 回 「学习之路」 取Android技能路线经典电子书
- 回「pdf」取阿里&字节经典面试题、Android、算法、Java等系列武功秘籍。
- 回 「天边」 取天边论坛200+精彩博文,包括小说、形而上学等
您的 点赞、评论、转发 是对我的巨大鼓舞!