shell编程
一、概念
Shell 是一种用c语言编写的程序,他是用户使用Linux的桥梁,shell既是一种命令语言又是一种程序设计语言。
Shell是指一种应用程序,这个应用程序提供了一个界面,用户可以通过这个界面访问操作系统内核的服务。
Shell是用户于Linux操作系统的桥梁。可以书写多个命令,后缀必须为.sh
Linux的shell种类有很多,常见的有:
1.Bourne Shell(/usr/bin/sh 或/bin/sh)
2.Bourne Again Shell(/bin/bash)
3.C Shell (/usr/bin/csh)
4.K Shell (/usr/bin/ksh)
5.Shell for Root(/sbin/sh)
shell之hello world
vim hello.sh
创建一个头为:
#!/bin/bash
运行 sh XXX.sh
#这是注释头部可加可不加
#!/bin/bash
echo "helloworld"
~
这里头部的标识建议大家给加上。
运行的三种方法:
- 执行方式–sh
sh shell01HelloWorld.sh
把这里的sh换成bash也是可以的
- 执行方式–bash
bash shell01HelloWorld.sh
这里虚拟机的指令不做讲解,虚拟机的使用,如果有需要可以联系小编让我出一期,或者联系我直接把视频给你们。
-
执行方式–可执行文件
如果换成可执行的文件,那么还可以执行吗?
先用命令把他编程可执行的文件:
chmod 777 shell01HelloWorld.sh
这里我说一下,可执行文件的执行方式是点上当前它本身的目录。然后斜杠给上一个可执行的文件
./shell01HelloWorld.sh
然而我们发现,这样也是可以把目标文件执行出来的。
这里我说了三种的执行方式,任大家选择。
二、变量
定义和初始化
变量=值
注意等号两边不能有空格。
命名规则注意事项
是个动态的数据类型,没有数据类型的限制。并且必须初始化。
这里的变量命名规则就不再赘述,和之前学过的语言都是一样的。但是要注意的一点就是:
变量的赋值是通过等号(=)进行赋值的,但是在变量、等号和值之间不能出现空格(对我来说就很难受,我写代码的习惯就是把空格加上去),显示变量的值使用echo命令(类似于java中的system.out),加上$变量名,也可以使用${变量名}。
下面我们来看变量的使用以及要注意的事项:
我 们先创建一个shell文件,叫shell02var.sh
#!/bin/bash
#shell中变量是个动态的数据类型语言,变量可以赋值所有的数据类型的概念,所以必须初>始化。
#等号两边不能有空格。
name="zs"
age=18
#只要是满足shell 的格式,都会被认为是个变量,所以这样会输出一个 岁
#如过想要有所区分,那么就必须给他加上分隔符号,这里的分隔符是大括号;
echo $nameis18岁
echo ${name} is 18 岁
name=10
echo $name
~
使用
格式1:
$变量名称
注意:从$符号开始,会把后面的内容识别成变量
格式2:
${变量名称}
注意:只会把大括号里面的内容识别成变量。把一整个内容做了一个切分。
三、位置变量
$1,$2,3......3......3......{10}…:接收执行脚本时,传递的参数
格式:
$下表
注意:
$0永远是脚本名称,0不作为下表的开始位置,从1开始,脚本名称也不作为参数。
如果接收不到变量就会显示空,并且位置变量的接收顺序不需要有序($3,$1)
位置变量可给可不给,不给就不接收
如果下标大于一位数,必须加大括号,默认是一位数。
${#}:表示参数个数,(不含脚本名称)。
$*:表示所有参数(不含脚本名称)。
该看第27天的shell命令了。
四、shell基本运算符
shell和其他编程语言一样,支持多种运算符,包括:
算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符
1、算数运算符
原生的bash不支持简单的数学运算符,但是可以通过其他命令来实现,例如:awk和expr,后者最常用。
#!/bin/bash
a=10
b=20
echo `expr $a + $b`
d=$[a+b]
2、关系运算符
关系运算符:><,==,!=
在shell中是用1和0表示ture或者flase
echo $[2>5]
符号两边可以不加括号
3、逻辑运算符
与& 或| 非 !
与或的使用
# $[2>1] true & &[2<1]false
echo $[2!=2]
echo $[$[2>1] & $[2>1]]
echo $[2>1 & 2>1]
这两种情况都是可以输出结果的,当里面的表达式被外面的中括号括起来的时候,里面是没有必要添加的。
非的使用
echo $[!2>1]
反转2>1的结果
echo $[!$[2>1]]
反转后面的结果2>1 and 2>3 false0
echo $[!$[$[2>1]&$[2>3]]]
echo $[2>1 & 2<1]
五、基本语法
1、if语句
if语句的几种格式
#!/bin/bash
a=10
b=20
if [[ 2 > 3 ]]
then
echo “true”
else
echo “false”
fi
#想要引用变量,直接使用$a,$b
if [[ $a > $b ]]
then
echo “true”
else
echo “false”
fi
#使用变量的时候:
#shell不太支持用符号计算
if [ $b \> $a ]
then
echo "结果为true"
else
echo "结果为false"
fi
#shell自己提供的运算符。可以看看,常用的还是正常的符号
if [ $a -gt $b ]
then
echo "结果为true"
else
echo "结果为false"
fi
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJGPt2us-1638837128659)(/Users/kayleigh/Library/Application Support/typora-user-images/image-20211206073711982.png)]
a=20
b=10
#使用小括号,不需要关注空格的东西,符号两边不用加,数字两边也不用加
#如果加上没有任何影响。
if ((2 > 1))
then
echo true
else
echo false
fi
#如果是使用变量呢?
#使用变量也是一样的情况,所以建议使用(()),但是不能使用-gt等shell提供的
#比较运算符
if ((a > b))
then
echo true
else
echo false
fi
2、for循环语句
java版本
#!/bin/bash
#这里来输出1-100这里是java 的写法
for ((i=1;i<=100;i++))
do
echo $i
done
python版本
#!/bin/bash
a=10
b=20
#格式1:
for i in {1..100}
do
echo $i
done
#如果100用变量表示呢?
#不能在后面直接改成变量。
#如果想要使用变量,就得用格式2
#格式2:
for i in `seq 1 $b`
do
echo $i
done
来个案例:
#求1=100的奇数和偶数的和
#!/bin/bash
jsum=0
osum=0
for i in {1..100}
do
if ((i%2==0))
then
#osum=`expr $osum + $i`
osum=$[osum+i]
else
#jsum=`expr $jsum + $i`
jsum=$[jsum+i]
fi
done
echo $osum
echo $jsum
注意这里代码的空格一定要严格区分
犯的错误: osum=`expr $osum + $i`这个语句等号右边加了一个空格导致代码错误。一定要小心。
上面的两种连加语句都是可以的
shell里面不支持+=的写法,如果真的很想用就用这个格式:
let osum+=i
3、键盘录入
键盘录入的格式:
read +变量名字
如果想要添加多个变量,直接在read后面加变量即可。
但是要注意输入的时候,值与值之间要加空格,再按回车
例如:
#键盘录入
#不需要进行初始化
#接收的是一个值
read x
echo $x
#接收多个值
read x xx xxx
read y
echo $x
echo $xx
echo $xxx
echo $y
4、数组
在shell中,数组和一些开发语言的数组的概念基本一致,有下标,有元素
在shell中,用括号表示数组,数组元素用“空格”符号分隔开。定义数组的格式一般为:
数组名 = {值1 值2 … 值n}
例如:
#!/bin/bash
#这是数组的学习
#这里输出的时候默认输出第一位
l=(1 2 a c d f 6)
echo $l
#想要输出所有,要通过下标获取
#输出的格式为:
#这里如果把*好改成数组的下标,就会输出对应下标的值,如果下标过大不会报错,会输出
#空
echo ${l[*]}
~
获取数组的长度
#获取数组的长度
echo ${#l[*]}
数组的遍历
#遍历数组
#格式1
for((i=0;i<7;i++))
do
echo ${l[$i]}
done
#格式2
for i in `seq 0 $[${#l[*]}-1]`
do
echo ${l[$i]}
done
要获取计算结果就必须在外面加一个$符号,再用[]括起来。
但是这种方法显得很麻烦,可以直接获取下标,往下看:
echo ${l[@]}#这是遍历数组的方法,然后再加一个感叹号,
echo ${!l[@]}#这是获取数组下标的方法
#通过这种方法我们来改进一下数组遍历:
#方式3:
for i in ${!l[@]}
do
echo ${l[$i]}
done
5、shell函数
Linux的shell函数可以用户定义函数,可以在shell脚本中随便调用。
说明:
- 可以带functio fun()定义,也可以直接fun()定义,不带任何参数。
- 参数返回,可以显示加:return 返回,如果不加,将以最后一条的命令运行结果,作为返回值返回,return后面的数值n(0-255)
格式:
[function] funname [()]
{
action;
[return int;]
}
#方法写出来了,怎么调用呢?
#直接在下面写上函数名,后面是不能跟()的
#例如
#!/bin/bash
#这是函数的学习
function fun(){
echo $[10+20]
}
fun
#$?表示接收当前方法的返回结果
#来看有返回值的情况
fun(){
x=$[10+20]
return $x
}
fun
echo $?
必须先调用再接收。
注意:返回值只能是int型,只能到0-255
方法的返回结果只能接收一次。
fun(){
a=$1
b=$2
c=$[$a+$b]
return $c
}
fun 20 90
echo $?
如果是要使用方法,直接在调用的时候,后面加上数值即可。
6、shell日期
获取当前日期的时间
可以直接用
date
也可以换个格式
date +"%Y-%m-%d %H:%M:%S"
格式化日期时间
date -d today +"%Y-%m-%d %H:%M:%S"
时间的相加减