shell编程基础,完整版

本文介绍了shell编程的基础概念,包括Bash shell的使用、变量定义与初始化、算术与关系运算、逻辑运算、if语句、for循环、键盘输入、数组、函数和日期操作。通过实例演示了如何在shell脚本中灵活运用这些核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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"
~                  
这里头部的标识建议大家给加上。

运行的三种方法:

  1. 执行方式–sh
sh shell01HelloWorld.sh 
把这里的sh换成bash也是可以的
  1. 执行方式–bash
bash shell01HelloWorld.sh 

这里虚拟机的指令不做讲解,虚拟机的使用,如果有需要可以联系小编让我出一期,或者联系我直接把视频给你们。

  1. 执行方式–可执行文件

    如果换成可执行的文件,那么还可以执行吗?

先用命令把他编程可执行的文件:

chmod 777 shell01HelloWorld.sh 

这里我说一下,可执行文件的执行方式是点上当前它本身的目录。然后斜杠给上一个可执行的文件

./shell01HelloWorld.sh 

然而我们发现,这样也是可以把目标文件执行出来的。

这里我说了三种的执行方式,任大家选择。

二、变量

定义和初始化
变量=值
注意等号两边不能有空格。
命名规则注意事项

是个动态的数据类型,没有数据类型的限制。并且必须初始化。

这里的变量命名规则就不再赘述,和之前学过的语言都是一样的。但是要注意的一点就是:

变量的赋值是通过等号(=)进行赋值的,但是在变量、等号和值之间不能出现空格(对我来说就很难受,我写代码的习惯就是把空格加上去),显示变量的值使用echo命令(类似于java中的system.out),加上$变量名,也可以使用${变量名}。

下面我们来看变量的使用以及要注意的事项

我 们先创建一个shell文件,叫shell02var.sh

#!/bin/bash
#shell中变量是个动态的数据类型语言,变量可以赋值所有的数据类型的概念,所以必须初>始化。
#等号两边不能有空格。
name="zs"
age=18
#只要是满足shell 的格式,都会被认为是个变量,所以这样会输出一个  岁
#如过想要有所区分,那么就必须给他加上分隔符号,这里的分隔符是大括号; 
echo $nameis18echo ${name} is 18name=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脚本中随便调用。

说明:

  1. 可以带functio fun()定义,也可以直接fun()定义,不带任何参数。
  2. 参数返回,可以显示加: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"

时间的相加减

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创作者mateo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值