一文快速学会linux shell 编程基础!!!


前言

shell脚本编程是linux中重要的一个环节,熟悉shell脚本编程,我们可以更好的在linux环境下工作。


一、shell脚本执行的方式

1.格式要求

脚本要以#!/bin/bash 开头

2.脚本常用执行方式

2.1 . 输入脚本的绝对路径或相对路径进行执行

这个没什么好说的,只说一点,这种执行方式需要有执行权限。

2.2 使用 sh + 脚本的方式

bash 脚本的路径
这种方式不需要有执行权限就可以执行

shell 的注释语法

# 是shell的单行注释
:<<! xxxx !是shell的多行注释,我建议多行注释的符号各占一行,例如下面这样

:<<!
xxxx
xxxxx
!

二、shell 变量

1.shell变量介绍

代码如下(示例):

linux shell中的变量分为,系统变量和用户自定义变量
系统变量:$HOME,$PWD,$SHELL,$USER等等
显示当前shell中所有的变量:set

2.shell 变量的定义

定义变量

1.定义变量:变量名=值
2.撤销变量:unset 变量
3.声明静态变量:readonly 变量名=值
注意,静态变量不能使用unset

下面的代码会在最后一行报错

#!/bin/bash
# 定义变量A
A=100
# 输出变量需要加上$
echo A=$A
echo "A=$A"
# 撤销变量A
unset A
echo "A=$A"
# 声明静态的变量B=2,不能unset
readonly B=2
echo "B=$B"
unset B

定义变量的规则

变量名称可以由字母、数字和下划线组成,但是不能以数字开头
5A=100就是错的
等号两侧不能有空格
变量名称一般习惯为大写,这个是一个规范,遵守即可

将命令的返回值赋给变量

A=`date` 反引号,运行里面的命令,并把结果返回给变量A
A=$(date) 等价于 A=`date`

3.设置环境变量

(关于这个,如果你之前在linux环境下配置过java的环境变量,这个可以不用看,步骤是一模一样的)
基本流程

  1. export 变量名=变量值(一般都是在/etc/profile里面写环境变量)
  2. source 配置文件
  3. echo $变量名

3.位置参数变量

位置参数变量,用大白话来说,就是当你用命令行执行这个shell脚本文件的时候,来获取这行命令里面的一些东西

基本语法

  • $n(n为数字,$0代表命令本身,$1~$9代表第一到第九个参数,如果要获取第十个以上的参数,需要这样写 ${10} )
  • $*(这个变量代表命令行中的所有参数,但是把所有的参数看成一个整体)
  • $@ (这个变量也是代表命令行中的所有参数,但是$@把每个参数区分对待)
  • $# (这个变量代表命令行中的所有参数的个数)

下面有一个shell脚本可以供大家理解

#!/etc/bash

echo "0=$0 1=$1 2=$2"

for i in "$*";do
 echo $i
done

for i in "$@";do
echo $i
done

echo "number=$#"
~                   

在这里插入图片描述
$ @ 与 $ * 如果不在双引号里面的效果是一样的,但是如果在双引号里面
$ * 就会把所有的参数当作一个东西来看,这在上面的代码里面已经看的很清楚了,
$ @ 则是分开的

4.预定义变量

大白话就是shell设计者已经定义好的变量,可以直接使用

  • $$ (获得当前进程的进程号(PID))
  • $! (后台运行的最后一个进程的进程号(PID))
  • $?(最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确了)
#!/bin/bash
echo "当前执行的进程id=$$"
# 以后台的方式运行一个脚本,并获得他的进程号
. position.sh 100 200 &
echo "最后一个后台方式运行的进程id=$!"
echo "执行结果是=$?"

在这里插入图片描述

三、运算符

基本语法

  • $((运算式)) 或 $[运算式] 或 expr m + n (expr代表 expression ,expr的写法中运算符之间要有空格)
  • 乘号 \*(对,就是这么奇怪,有反斜杠)
  • 除号 /
  • 取余 %
  • 如果希望将expr的运算结果赋给某个变量,可以使用我们之前学习的反引号(就是1左边的那个)``
#!/bin/bash
#案例1:计算(2+3)*4的值
#使用第一种方式
RES1=$(((2+3)*4))
echo "res1=$RES1"
#使用第二种方式
RES2=$[(2+3)*4]
echo "res2=$RES2"
#使用第三种方式
TMP=`expr 2 + 3`
RES4=`expr $TMP \* 4`
echo "temp=$TMP"
echo "res4=$RES4"
                     

在这里插入图片描述

四、条件判断

判断语句
基本语法

  • [ condition ] (注意!!!condition前后要有空格),非空返回true,可使用$?验证
    常用判断条件
  1. 字符串比较 =
    两个整数的比较
  • -lt 小于

  • -le 小于等于

  • -eq 等于

  • -gt 大于等于

  • -ne不等于
    按照文件权限进行判断

  • -r 有读的权限

  • -w 有写的权限

  • -x 有执行的权限
    按照文件类型进行判断

  • -f文件存在并且是一个常规的文件

  • -e 文件存在

  • -d 文件存在并且是一个目录


照例来个代码

#!/bin/bash
#案例1:"ok"是否等于ok

# 判断语句,使用 =
if [ "ok" = "ok" ]
then
        echo "equal"
fi

# 案例2:23是否大于等于22
#判断语句:使用-ge
if [ 23 -ge 22 ]
then
        echo "大于"
fi

# 案例3:/shellcode/aaa.txt 目录中的文件是否存在
# 判断语句:使用 -f
if [ -f /shellcode/aaa.txt ]
then
        echo "存在"
fi

在这里插入图片描述

五、流程控制

1.if判断语句

(这个我不再多说了,相信学linux的各位至少学过一门编程语言)
基本语法
单分支

if [ 条件判断式 ]
then
代码
fi

或者 多分支

if [ 条件判断式 ]
then
代码
elif [条件判断式]
then
代码
elif [条件判断式]
then
代码
…(这里指可以写多个elif)
else(else可省略)
代码
fi

2.case判断语句

(这个跟java 里面的 switch case 类似,但是看起来非常的诡异)
基本语法

case $变量名 in
“值1”)(注:如果变量的值等于值1,则执行程序1)
代码
;;
“值2”)(注:如果变量的值等于值2,则执行程序2)
代码
;;
*)(注:如果变量的值都不是以上的值,则执行下面的代码)
代码
;;
esac

#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac

在这里插入图片描述

3.for循环语句

基本语法

for 变量 in 值1 值2 值3
do
程序
done

或者

for ((初始值;循环控制条件;变量变化))
do
程序
done

#!/bin/bash
for i in "$*"
do
 echo $i
done

for i in "$@"
do
echo $i
done
#!/bin/bash
SUM=0
for ((i=0;i<=$1;i++))
do
SUM=$[$SUM+$i]
done
echo $SUM

在这里插入图片描述

4.while循环语句

while [条件判断式]
do
程序
done

#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done
echo "执行结果=$SUM"

在这里插入图片描述

六、read读取控制台输入

基本语法

read (选项) (参数)
选项:
-p :指定读取值时的提示符;
-t ; 指定读取值时的等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。。
参数:
变量:指定读取值的变量名
注意!!! read 与 $n 不同,read的读取输入是必须要输入的,如果你不输入,脚本> 会一直在那个地方堵塞

#!/bin/bash
#读取控制台输入一个NUM1值
read -p "请输入一个数NUM1=" NUM1#这里要注意 NUM1 跟前面的双引号要有空格,下面的NUM2也是如此
echo "你输入的NUM1=$NUM1"
# 读取控制台输入一个NUM1值,在10秒内输入
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"

在这里插入图片描述

七、函数

  • 函数介绍
    shell编程和其他编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。

系统函数

basename基本语法
功能:返回完整路径最后 / 的部分,常用用于获取文件名

basename [pathname] [suffix]
(功能描述:basement命令会删除所有的前缀包括最后一个(“/”)字符,然后将字符串显示出来)
suffix 为后缀,如果suffix 被指定了,basename 会将pathname 或 string 中的 suffix 去掉

在这里插入图片描述

dirname 基本语法
功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
语法
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名)

在这里插入图片描述

自定义函数

基本语法

[ function ] funname[()]
{
Action;
[return int;]
}

调用直接写函数名:funname [值]

#!/bin/bash
function getSum() {

        read -p "请输入一个数n1=" n1
        read -p "请输入一个数n2=" n2
        SUM=$[$n1+$n2]
        echo "和是=$SUM"
}

getSum

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值