Linux之shell编程

深入解析LinuxShell编程:基础语法、变量、流程控制与函数
本文详细介绍了Linuxshell编程的基础概念,包括shell脚本执行、变量类型(系统变量、自定义变量)、环境变量设置、位置参数、预定义变量、运算符使用、条件判断、if-else、case、for和while循环,以及读取控制台输入和自定义函数的实例。

😃Linux 之shell编程

1. 什么是shell?

shell是一个命令行解释器,相当于是 **翻译、解释**Linux的命令

在这里插入图片描述

2. shell脚本的执行

脚本必须以下面开头:

#!/bin/bash
  • 第一种执行:
./test.sh

或者直接绝对路径打开

/home/test.sh

⭐️但是在这之前,必须先打开执行权限x

  • 第二种执行方式,无需执行权限x
sh + 脚本
sh /home/test.sh(绝对路径)
sh test.sh (相对路径)

3. shell的变量

3.1 shell变量介绍

  • 系统变量

由计算机自己早已设置好

  • 自定义变量

自己定义的变量

展示当前shell中的所有变量

set

3.2 shell变量的定义

  • 定义变量
变量值=值(不要有空格)
  • 撤销变量
unset 变量
  • 声明静态变量(全局变量)
readonly 变量名

注意:不能unset

  • 具体规则

在这里插入图片描述
在这里插入图片描述

  • 将命令的返回值赋值给变量
A=`date`

运行里面的命令,将结果的返回值返回给变量A

A=$(date)

4. 设置环境变量

在这里插入图片描述

5. 位置参数变量

想要获得命令行的参数信息,就可以用到位置参数变量

$n:n为数字,$0代表命令本身,$1 -$9带表第一到第九个参数
$*:代表命令行中的所有参数,把所有参数看作一个整体
$@:代表命令行中的所有参数,把每个参数区别对待
$#:代表命令行中所有参数的个数

sh /home/myshell.sh 100 200

100 200相当于是两个形参,往这个命令行(相当于是函数)传入参数,利用上述指令打印输出这些函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. 预定义变量

预定义变量:类似于内部变量,只能作用于对应脚本

就是shell设计者事先定义好的变量,可以直接在shell脚本中使用
$$:当前进程的进程号(PID)
$!:后台运行的最后一个进程的PID
$?:最后一次执行的命令的返回状态,这个变量值为0,证明上一个命令正确执行;这个变量值非0,不正确执行

7. 运算符

在这里插入图片描述

基本语法

$((运算式))
$[运算式]
expr m + n (中间有空格)
expr m - n
expr \*,/,%  乘,除,取余
如果希望将expr的结果赋给某个变量,使用``(反单引号)

应用实例

计算(2+3)x4的值
请求出命令行的两个参数[整数]的和20 50

在这里插入图片描述
在这里插入图片描述

cat可以看文件里面的内容

#!/bin/bash
#案例1:计算(2+3)x4
# 第一种方式:
ans1=$(((2+3)*4))
echo "ANS1=$ans1"
#第二种方式
ans2=$[(2+3)*4]
echo "ANS2=$ans2"
#第三种方式
ans3=`expr 2 + 3`
ans30=`expr $ans3 \* 4`
echo "ANS3=$ans30"
# 案例2
SUM=$[$1+$2]
echo "sum=$SUM"

8. 条件判断 if语句

  • 基本语法
[ condition ] //注意condition前后要有空格

在这里插入图片描述

非空返回true,空[ ]返回false,空里面也要有空格

#! /bin/bash
if [ "ok"="ok" ]
then
 echo "YES"
fi
#案例2:23 是否大于等于22
#判断语句:使用 -ge
if [ 23 -ge 22 ]
then
   echo "23确实大于等于22"
fi
#案例3:/root/shcode/aaa.txt 目录中的文件是否存在
#判断语句:使用 -f
if [ -f /root/shcode/aaa.txt ]
then
        echo "存在"
fi

9. 流程控制之if

if判断

基本语法:

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

多分支结构

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

案例

# 编写一个shell程序,输入参数大于60,就输出“及格了”,小于60,则输出”不及格“
if [ $1 -ge 60 ]
then
	echo "及格了"
elif [ $1 -lt 60 ]
then
	echo "不及格"
fi

10. 流程控制之case

case语句

  • 基本语法

基本语法非常奇怪,看开一点就可以了

case $变量名 in
"值1")
;;   //两个分号作为第一种情况的结束
"值2")
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac   //用这个符号结束case语句分支

案例

#!/bin/bash
# 案例1:当输入的参数为1时,输出“周一”;当输入的参数为2时,输出“周二”,其他情况就输出“other”
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

11. 流程控制之for

基本语法1

for 变量 in 值1 值2 值3...
do
程序/代码
done
案例
#! /bin/bash
# 打印命令行输入的参数
for i in "$*"
do
	echo "The number is $*"
done
echo "-----------第二种方法---------------"
for i in "$@"
do
        echo "The number is $@"
done

echo "-----------第三种方法---------------"
for i in $*
do
        echo "The number is $*"
done

基本语法2

for ((初始值;循环控制条件;变量变化))
do
程序/代码
done
案例
#! /bin/bash
# 打印命令行输入的参数
for i in "$*"
do
        echo "The number is $*"
done
echo "-----------第二种方法---------------"
for i in "$@"
do
        echo "The number is $@"
done

echo "-----------第三种方法---------------"
for i in $*
do
        echo "The number is $*"
done


# 基本语法 2
# 从1 到100的值输出显示
SUM=0
for (( i=1 ;i<=100 ; i++))
do
        SUM=$[$i+$SUM]
done
echo $SUM

# 基本语法 2
# 从1 到100的值输出显示
SUM=0
for (( i=1 ;i<=$1 ; i++))
do
        SUM=$[$i+$SUM]
done
echo $SUM


# 基本语法 2
# 从1 到100的值输出显示
SUM=0
for (( i=1 ;i<=100 ; i++))
do
        SUM=$i+$SUM
done
echo $SUM

12. 流程控制之while

基本语法

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

案例

#!/bin/bash
#案例1:从命令行输入一个数字n,统计从1+...+n的值是多少
SUM=0
i=0
while [ $i -le $1 ]
do
	SUM=$[$SUM+$i]
	#i自增
	i=$[$i+1]
done
echo "执行结果=$SUM"

13. 读取控制台输入之read

有点像C++的cin输入,echo像C++的cout

  • 基本语法:
read(选项)(参数)

-p:指定读取值时的提示符
-t:指定读取值时的等待时间,超过这个等待时间后,如果还是没有输入,直接退出,不再等待
变量:指定读取值的变量名

read -t 10 -p "猜猜我是谁"

注意:选项后面要紧跟相关的参数,-t后面跟时间,-p后面跟提示语句

#!/bin/bash
# 读取控制台输入一个num值
read -p "请输入第一个数字:" NUM1
echo "第一个数字是:$NUM1"
# 读取控制台输入一个num值,在10秒内输入
read -t 10 -p  "请输入第二个数字:" NUM2
echo "第一个数字是:$NUM2"

14. 函数

shell编程中的函数分为两大类,系统函数自定义函数

系统函数

basename函数

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

basename [pathname][suffix]
basename [string][suffix]

会删掉所有文件 绝对路径的前缀包括最后一个’/’

basename /home/cal.sh

返回:

cal.sh

进一步:

basename /home/cal.sh .sh

返回:

cal
dirname 基本语法

功能:返回完整路径最后/的前面部分,返回绝对路径

dirname /home/cal.sh

在这里插入图片描述

应该是用来接收一个变量,然后过滤出文件名与目录

⭐️ 自定义函数

  • 基本语法
[ function ] funname[()]
{
	Action;
	[return int;]
}

调用直接写函数名:

funname []
案例
#!/bin/bash
# 案例1:计算输入两个参数的和(动态的获取),getSum

# 定义函数 getSum
function getSum ()
{
	Sum=$[$n1+$n2]
	echo "和=$Sum"
}

# 输入两个值
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
#调用自定义函数
getSum $n1 $n2 

先在shell脚本之前写函数的定义,以及形式参数,最后再写函数的调用getSum $n1 $n2 ,同时read相当于cin,往两个形式参数里面去输入;

函数是优先级最低的,整个shell脚本,撇开函数其他的都是按顺序依次执行,例如:

# 输入两个值
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
#调用自定义函数
getSum $n1 $n2

成功结果如下

在这里插入图片描述

换个顺序的话:

#调用自定义函数
getSum $n1 $n2
# 输入两个值
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2

就会报错:

fun.sh:行7: +: 语法错误: 期待操作数 (错误符号是 "+")

要是以后又不懂了,可以看看这个博客:

关于shell中的自定义函数的一些注意事项

💮完结散花
函数的调用getSum $n1 $n2 ,同时read相当于cin,往两个形式参数里面去输入;

函数是优先级最低的,整个shell脚本,撇开函数其他的都是按顺序依次执行,例如:

# 输入两个值
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
#调用自定义函数
getSum $n1 $n2

成功结果如下
换个顺序的话:

#调用自定义函数
getSum $n1 $n2
# 输入两个值
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2

就会报错:

fun.sh:行7: +: 语法错误: 期待操作数 (错误符号是 "+")

要是以后又不懂了,可以看看这个博客:

关于shell中的自定义函数的一些注意事项

💮完结散花

本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 chmod命令的其他例子 6 1.4.5 可以选择使用符号模式或绝对模式 7 1.5 目录 7 1.6 suid/guid 7 1.6.1 为什么要使用suid/guid 8 1.6.2 设置suid/guid的例子 8 1.7 chown和chgrp 9 1.7.1 chown举例 9 1.7.2 chgrp举例 9 1.7.3 找出你所属于的用户组 9 1.7.4 找出其他用户所属于的组 10 1.8 umask 10 1.8.1 如何计算umask值 10 1.8.2 常用的umask值 11 1.9 符号链接 12 1.9.1 使用软链接来保存文件的多个映像 12 1.9.2 符号链接举例 12 1.10 小结 13 第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 3.1.7 删除crontab文件 25 3.1.8 恢复丢失的crontab文件 25 3.2 at命令 25 3.2.1 使用at命令提交命令或脚本 26 3.2.2 列出所提交的作业 27 3.2.3 清除一个作业 27 3.3 &命令 27 3.3.1 向后台提交命令 28 3.3.2 用ps命令查看进程 28 3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准错误 43 5.9 合并标准输出和标准错误 43 5.10 exec 44 5.11 使用文件描述符 44 5.12 小结 45 ... ...
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值