【基础】Linux - Shell 编程

Shell 简介

Shell 是一种应用程序,该程序提供了一个界面,用户可以通过这个界面访问操作系统内核的服务,并将调用服务的结果返回给我们。

Linux 中不止有一种 Shell,我们最常用的是 bash。我们可以直接发一个指令给 Shell,也可以将指令编写成一个 Shell 脚本执行。

Shell 变量

Shell 变量分为系统变量和用户自定义变量:

  • 系统变量如$HOME、$PWD、$SHELL、$USER可以通过echo指令直接查看;

  • 用户可以自定义变量,自定义变量可以通过set指令查看;

用户自定义变量

用户自定义变量的基本语法:

  • [变量名]=[值]:定义一个变量;

  • unset [变量名]:撤销变量;

  • readonly:声明静态变量,该变量不能被撤销;

自定义变量的规则:

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头;

  • 等号两侧不能有空格;

  • 变量名称一般习惯为大写,这是一个规范,我们遵守即可;

示例代码:

[root@ZQFLinux ~]# A=100
[root@ZQFLinux ~]# echo $A
100
[root@ZQFLinux ~]# unset A
[root@ZQFLinux ~]# echo $A

[root@ZQFLinux ~]# readonly READONLY=1
[root@ZQFLinux ~]# echo $READONLY
1
[root@ZQFLinux ~]# unset READONLY
-bash: unset: READONLY: cannot unset: readonly variable
[root@ZQFLinux ~]# A=`date`
[root@ZQFLinux ~]# echo $A
Thu Dec 8 13:23:37 CST 2022

全局变量(环境变量)

环境变量相关语法:

  • export [变量名]=[值]:设置全局变量(环境变量);

  • source [配置文件]:刷新配置文件。在某文件中定义了全局变量后,需要刷新才能生效;

示例代码:

[root@ZQFLinux ~]# echo $JAVA_HOME
/root/java
[root@ZQFLinux ~]# export MY_SERVICE_PORT=8080
[root@ZQFLinux ~]# echo $MY_SERVICE_PORT
8080

位置参数变量

使用位置参数可以向 shell 脚本文件中传参,基本语法包括:

  • $n:n 代表第几个参数。当 n = 0 时,代表执行的命令本身;

  • $*:该命令代表所有的参数,将所有参数视作一个整体;

  • $@:该命令代表所有的参数,将所有的参数视作单独的个体;

  • $#:该命令代表参数的个数;

新建脚本程序 myshell01.sh,编辑内容如下并保存:

#!/bin/bash
echo "执行命令:$0"
echo "参数1=$1;参数2=$2;"
echo "全体参数:$*"
echo "全体参数:$@"
echo "参数个数:$#"

执行脚本文件,查看结果:

[root@ZQFLinux myshell]# sh myshell01.sh
执行命令:myshell01.sh
参数1=;参数2=;
全体参数:
全体参数:
参数个数:0
[root@ZQFLinux myshell]# sh myshell01.sh 1 2
执行命令:myshell01.sh
参数1=1;参数2=2;
全体参数:1 2
全体参数:1 2
参数个数:2

预定义变量

预定义变量指 shell 提前设定好的一些变量,我们可以直接使用:

  • $$:当前的进程号 PID;

  • $!:后台运行的最后一个进程的进程号 PID;

  • $?:最后一次执行的命令的返回状态,若返回 0 则证明上一个命令执行正确;

示例代码:

[root@ZQFLinux myshell]# echo $$
16905
[root@ZQFLinux myshell]# echo $!

[root@ZQFLinux myshell]# echo $?
0

Shell 运算符

Shell 中进行数据运算的基本语法有:

  • $((运算公式)

  • $[运算公式]

  • expr 运算公式:使用该方法的运算符格式为+ - \*, /, %(加减乘除取余);

新建脚本程序 myshell02.sh,编辑内容如下并保存,实现两个数值的求和运算:

#!/bin/bash
echo "$1 + $2 = $(($1+$2))"

运行脚本测试:

[root@ZQFLinux myshell]# sh myshell02.sh 200 300
200 + 300 = 500

Shell 条件判断

条件判断的基本语法:[ 判断条件 ],常用的判断条件包括:

  • 对于字符串的比较使用=

  • 对于整数的比较使用-lt/-le/-eq/-gt/-ge/-ne,分别表示小于/小于等于/等于/大于/大于等于/不等于;

  • 根据文件的权限进行判断:

    • -r:拥有读权限;

    • -w:拥有写权限;

    • -x:拥有执行权限;

  • 根据文件类型进行判断:

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

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

    • -e:文件存在;

条件判断一般应用在流程控制当中,此处不单独演示代码。

Shell 流程控制

if 流程控制

if 流程控制的基本语法为if [ 条件判断式 ] then ... elif [ 条件判断式 ] then ... fi

新建脚本程序 myshell03.sh,编辑内容如下并保存,实现简单的猜数游戏:

#!/bin/bash
if [ $1 -gt 64 ]
then
    echo "猜大了~"
elif [ $1 -lt 64 ]
then
    echo "猜小了~"
elif [ $1 -eq 64 ]
then
    echo "猜对了!"
fi

测试代码:

[root@ZQFLinux myshell]# sh myshell03.sh 42
猜小了~
[root@ZQFLinux myshell]# sh myshell03.sh 68
猜大了~
[root@ZQFLinux myshell]# sh myshell03.sh 64
猜对了!

case 流程控制

case 流程控制的基本语法为case $变量名 in "预期值1") ... ;; “预期值2” ... ;; esac

新建脚本程序 myshell04.sh,编辑内容如下并保存,实现简单的档位选择:

#!/bin/bash
case $1 in
"1")
echo "档位1"
;;
"2")
echo "档位2"
;;
"3")
echo "档位3"
;;
*)
echo "请重新输入~"
;;
esac

测试代码:

[root@ZQFLinux myshell]# sh myshell04.sh 1
档位1
[root@ZQFLinux myshell]# sh myshell04.sh 2
档位2
[root@ZQFLinux myshell]# sh myshell04.sh 3
档位3
[root@ZQFLinux myshell]# sh myshell04.sh 30
请重新输入~

for 流程控制

for 流程控制的基本语法为for (( 初始值;循环条件;循环条件增量 )) do ... done

新建脚本程序 myshell05.sh,编辑内容如下并保存,实现 1-100 求和:

#!/bin/bash
SUM=0
for (( i=1;i<=100;i++ ))
do
  SUM=$(($SUM+$i))
done
echo "result=$SUM"

测试代码:

[root@ZQFLinux myshell]# sh myshell05.sh
result=5050

while 流程控制

while 流程控制的基本语法为while [条件判断 ] do ... done

新建脚本程序 myshell06.sh,编辑内容如下并保存,实现 1-x 求和:

#!/bin/bash
SUM=0
I=1
while [ $I -le $1 ]
do
SUM=$(($SUM+$I))
I=$(($I+1))
done
echo "result=$SUM"

测试代码:

[root@ZQFLinux myshell]# sh myshell06.sh 4
result=10
[root@ZQFLinux myshell]# sh myshell06.sh 100
result=5050

Shell 读取控制台输入

使用 read 命令读取控制台的输入,基本语法为read [选项] [变量名],常用选项有:

  • -p:指定读取值时输出的提示;

  • -t:指定读取值时的等待时间,若超时则不再等待;

示例代码:

[root@ZQFLinux myshell]# read -p "请输入一个数:" A
请输入一个数:36
[root@ZQFLinux myshell]# echo $A
36
[root@ZQFLinux myshell]# read -t 3 -p "请输入一个数:" A
请输入一个数:
[root@ZQFLinux myshell]#

Shell 函数

Shell 系统函数

  • basename [string] [suffix]:该函数返回路径字符串最后一个/后边的部分,常用于获取文件名。若指定了 suffix,则会去除结果中的 suffix 指定字段;

  • dirname [string]:该函数返回路径字符串最后一个/前面的部分,常用于获取路径;

示例代码:

[root@ZQFLinux myshell]# basename /root/myshell/myshell01.sh
myshell01.sh
[root@ZQFLinux myshell]# basename /root/myshell/myshell01.sh 01.sh
myshell
[root@ZQFLinux myshell]# basename /root/myshell/myshell01.sh .sh
myshell01
[root@ZQFLinux myshell]# dirname /root/myshell/myshell01.sh
/root/myshell

Shell 自定义函数

Shell 中用户自定义函数的基本语法为function 函数名 {...}

新建脚本程序 myshell07.sh,编辑内容如下并保存,实现两数求和:

#!/bin/bash
function getSum() {
    SUM=$(($X1+$X2))
    echo "result=$SUM"
}

read -p "请输入第一个数:" X1
read -p "请输入第二个数:" X2

getSum

测试代码:

[root@ZQFLinux myshell]# sh myshell07.sh
请输入第一个数:1
请输入第二个数:2
result=3

本书共分五部分,详细介绍了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 ... ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值