Linux【实操篇】—— Shell 编程入门、变量、运算符、条件判断、流程控制

article/2025/10/8 8:44:37

目录

一、Shell 编程入门

1. 认识 Shell

2. Shell 脚本的创建与执行        

二、Shell 变量

1. 系统变量和自定义变量

2. 变量的基本规则

3. 设置环境变量

4. 位置参数变量

5. 预定义变量

三、运算符

四、条件判断

五、流程控制

1. if 语句

2. case 语句

3. for 循环

4. while 循环

六、read 读取控制台输入


一、Shell 编程入门

1. 认识 Shell

开发者在进行服务器集群管理时,都需要编写 Shell 程序来进行服务器管理。Shell 是一个命令行解释器,为用户提供了一个向 Linux 内核发送请求以便于运行程序的界面系统升级程序。用户可以用 Shell 来启动、挂起、停止或者编写一些程序。

2. Shell 脚本的创建与执行        

Shell 脚本在执行时有两个格式上的要求:以 #!/bin/bash 开头、必须有可执行权限。如下我们编写第一个 Shell 脚本:

(1)创建新目录 shell 用于存放 shell 脚本;

[root@majinjian ~]# mkdir /root/shell
[root@majinjian ~]# cd /root/shell

(2)vim 编辑器新建 shell 脚本 shell.sh,输入命令;

#!/bin/bash
echo "hello world!"

(3)这个时候查看 shell.sh 的权限,是没有可执行权限 x 的;

(4)为它添加可执行权限;

[root@majinjian shell]# chmod u+x shell.sh

(5)执行文件;

shell 脚本常用的执行方式有两种:

  • 输入脚本的绝对路径或者相对路径(需要先赋予脚本执行权限 x);
  • sh + 脚本(无需赋予执行权限,直接执行即可)。

二、Shell 变量

1. 系统变量和自定义变量

Linux Shell 中的变量分为系统变量和用户自定义变量。系统变量顾名思义就是系统已经设置好的变量,诸如 $HOME、$PWD、$USER、$SHELL 等都是系统变量。使用指令 set 可以查看系统中所有的系统变量。我们常用较多的是自定义变量,基本语法如下:

  • 定义变量:变量名称=值
  • 撤销变量:unset 变量名
  • 定义静态变量:readonly 变量名称=值(静态变量不能撤销);
  • 输出变量:$变量

我们试着操作一下变量:

#定义变量A
A=100#输出变量
echo A=$A
echo "A=$A"#撤销变量A
unset A
echo $A#声明静态的变量B = 3
readonly B=3
echo $B

执行结果为;

2. 变量的基本规则

在定义变量时变量名称可以由字母、数字和下划线组成,但不能以数字开头;等号的两侧不能有空格;变量名称一般为大写。

将命令的返回值赋给变量时使用如下写法;

  • A=`data`,表示运行 ` ` 中的命令,并把结果返回给 A;
  • A=$(data),$() 相当于 ``。

3. 设置环境变量

  • export 变量名=变量值  //将 Shell 变量输出为环境变量/全局变量
  • source 配置文件  //让修改后的配置信息立即生效
  • echo $变量名  //查询环境变量的值

案例:在 /etc/profile 文件中定义 TOMCAT_HOME 环境变量,vim 打开 /etc/profile 输入;

export TOMCAT_HOME=/opt/tomcat

设置完之后刷新配置状态;

[root@majinjian opt]# source /etc/profile

结果如下;

4. 位置参数变量

当执行一个 Shell 脚本时,如果希望获取到命令行的参数信息,就需要使用到位置参数变量。基本语法有:

  • $n  //n 为数字,$0 代表命令本身,$1-9 代表第 1 到第 9 个参数,10 以上的参数需要用大括号包含如 ${10}
  • $*  //代表命令行中的所有参数,$* 将所有参数看成一个整体
  • $@  //这个变量也可以代表命令行中的所有参数,不过 $@ 把每个参数区分对待
  • $#  //代表命令行中所有参数的个数

案例:编写一个 Shell 脚本 position.sh,在脚本中获取到命令行中的各个参数信息。

#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有参数=$*"
echo "$@"
echo "参数个数=$#"

运行时输入 100 和 200 两个参数,结果如下。

5. 预定义变量

预定义变量就是 Shell 的设计者事先定义好的变量,可以直接在 Shell 脚本中使用。基本语法有:

  • $$  //当前进程的进程号码(PID)
  • $!  //后台运行的最后一个进程的进程号
  • $?  //最后一次执行命令的返回状态,如果这个变量的值为0证明上一个命令正确执行,如果不是 0 上一个命令没有正确执行

三、运算符

在 Shell 编程中有各种运算操作,语法格式为 $((运算式))$[运算式] 或者 expr m + n;如果希望将 expr 的值赋给某个变量,使用 `` 即可。

  • \*  //乘,在 `` 里面的乘应该用此格式即 * 前添加转义字符 \
  • /  //除
  • %  //取余

案例1:计算 (2+3)×4;

#!/bin/bash
#计算(2+3)×4的值#方式1
result1=$(((2+3)*4))
echo "res1=$result1"#方式2
result2=$[(2+3)*4]
echo "res2=$result2"#方式3
result3=`expr 2 + 3`
result4=`expr $result3 \* 4`
echo "expr res4=$result4"

结果如下。

案例2:计算命令行两个参数的和;

#计算命令行两个参数的和
sum=$[$1+$2]
echo "sum=$sum"

运行时输入 20 和 50,结果如下:

四、条件判断

条件判断使用语法 [ condition ](注意 condition 前后有空格),非空会返回 true。可以使用 $? 验证结果,0 为 true,>1 为false。如:

  • [ hspEdu ] 会返回 true
  • [ ] 会返回 false
  • [ condition ] && echo yes || echo no ,前一个判断满足时会继续执行后面的语句

常用的判断语句有:

判断两个字符串

  • =  //相等

判断两个整数

  • -lt  //小于
  • -le  //小于等于
  • -eq  //等于
  • -gt  //大于
  • -ge  //大于等于
  • -ne  //不等于

按照文件权限进行判断

  • -r  //有读的权限
  • -w  //有写的quanx
  • -x  //有执行的权限

按照文件类型进行判断

  • -f  //文件存在并且是一个常规的文件
  • -e  //文件存在
  • -d  //文件存在并是一个目录

案例:判断 "ok" 是否等于 ok;

#!/bin/bash
if [ "ok" = "ok" ]
then
echo "equal" #如果等于则输出 equal
fi  #否则结束

22 是否大于等于 21;

if [ 22 -ge 21 ]
then
echo "大于"
fi

/root/shell 目录下是否有 aaa.txt 文件;

if [ -f /root/shell/aaa.txt ]
then
echo "存在"
fi

执行结果如下:

五、流程控制

1. if 语句

if 语句的基本语法如下,需要注意 [ 条件判断式 ] 中括号与判断式之间必须有空格。

#单分支
if [ 条件判断式 ]
then
代码
fi
#多分支
if [ 条件判断式 ]
then
代码
elif [ 条件判断式 ]
then
代码
fi

案例:编写一个 shell 程序,如果输入的参数大于等于 60,输出“及格”,小于 60 则输出“不及格”。

#!/bin/bash
if [ $1 -ge 60 ]
thenecho "及格"
elif [ $1 -le 60 ]
thenecho "不及格"
fi

运行时带参数结果如下;

2. case 语句

基本语法如下,其中 * 代表都不是以上的值。

case $变量名 in
"值1")
如果变量的值等于1,则执行程序1
;;
"值2")
如果变量的值等于2,则执行程序2
;;
......
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

案例:编写 Shell 程序当命令行参数为 1 时输出“周一”,是 2 时输出“周二”,其他情况均输出“other”。

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

运行结果如下:

3. for 循环

for 循环有两个基本语法,语法一:

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

案例1:打印命令行输入的参数;

#!/bin/bash
#使用$*
for i in "$*"
do
echo "num is $i"
done#使用$@
for i in "$@"
do
echo "num is $i"
done

运行结果如下,这也印证了 $*(将所有参数看成一个整体) 和 $@(将参数区别对待) 的区别;

除此之外 for 循环还有第二个语法;

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

案例2:输出从 1 加到 100 的值。

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

运行结果如下:

4. while 循环

基本语法:

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

案例:命令行输入一个参数 n,计算 1+2+..+n 的值;

#/bin/bash
sum=0
i=0
while [ $i -le $1 ]  #只要第i个数小于我们输入的参数,就执行循环
do
sum=$[$sum+$i]
i=$[$i+1]  #i自增
done
echo "SUM=$SUM"

运行结果如下:

六、read 读取控制台输入

在我们进行 Shell 编程的时候,有时候也需要跟控制台进行交互,比如用户动态的输入一些数据,这个时候就需要用到 read。基本语法为

read(选项)(参数)

  • -p 制定读取值时的提示符
  • -t 指定读取值时的等待时间,如果没有在规定时间内输入,则不再等待

案例 1:读取控制台输入一个 num 值;

#!/bin/bash
read -p "输入num1=:" num1
echo "你输入的num1为:$num1"

运行结果如下:

案例 2:读取控制台输入一个 num 值,指定在 10 秒内输入;

read -t 10 -p "输入num2=" num2
echo "你输入的num2为:$num2"

运行结果如下:


http://chatgpt.dhexx.cn/article/GvNOnQ3R.shtml

相关文章

各大常见OJ与推荐OJ汇总(OJ题量统计)

这么长时间了 收集了不少做题的网站 在这里列一列 可以挑自己各方面都喜欢的主用 并没有什么顺序 大家择优选择 Last-Modified: 2023/3 POJ&#xff08;北京大学&#xff09;洛谷CowcoderLibreOJCodeforces&#xff08;俄罗斯&#xff09;东北大学秦皇岛分校oj51Nodhihocoder…

华为OD机试(2023A+B)在线OJ模拟

语言支持 CCJavaJavaScript&#xff08;Node.js-CJS、Node.js-ESM&#xff09;Python&#xff08;Python3、PyPy3、Python3-Graphics&#xff09;Mono C#GoRubyRustSQLHaskellBashJuliaKotlin/JVMFortranPascalPHPVerilog 用例库说明 在线OJ中的题目用例均来自本人构思&#…

在线OJ注意事项

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 一、OJ概念 online judge&#xff0c;简称OJ&#xff0c;是一个在线的判题系统。 用户可以在线提交多种程序代码(比如&#xff1a;C、C、Java、Python等)&#xff0c;系统对源代码进行编译和执行&#xff0c;并通过预先设计…

在线OJ系统

在线OJ系统 项目开始之前需要准备的第三方库项目分析 两大模块在线编译模块整体思路编译模块 题目管理模块数据存储页面显示服务器 项目开始之前 需要准备的第三方库 httplib g版本必须得是4.9以上 ctemplate boost&#xff1a; yum install boost-devel.x86_64 jsoncpp&a…

分享一个OJ平台——浙江工商大学的OJ平台

1.引言 最近是有总喜欢讨论算法题&#xff0c;因为他们在准备考研复试&#xff0c;为什么我不准备呢&#xff1f;这是一个悲伤的故事&#xff0c;刚好自己也有面试遇到只能使用C和C的代码题&#xff0c;他们说这OJ平台相对简单一些&#xff0c;那些刷不来LeetCode可以试试这个&…

算法OJ题(1)

1.删除有序数组中的重复项 原题链接&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-array/ 思路&#xff1a;使用双指针算法可以使时间复杂度达到O(1). 具体过程&#xff1a;&#xff08;以画图解释&#xff09; 代码实现&#xff1a; int remove…

你想知道刷题的秘密吗?一篇博客让你明白什么是OJ题,如何刷OJ题,并深入浅出的带你刷遍顺序表的OJ题(小白必看)

目录 0.前言 1.什么是OJ 1.1 OJ简述 1.2 OJ的分类&#xff08;尤其接口型OJ&#xff0c;带你剖析得明明白白&#xff09; 1.3 接口型OJ的输入型参数 2. 剑指 Offer 56 - I. 数组中数字出现的次数 3. 88. 合并两个有序数组 4. 27.移除元素 5. 26. 删除有序数组中的重复…

Online Judge系统(简称OJ)

什么是OJ Online Judge系统&#xff08;简称OJ&#xff09;是一个在线的判题系统。用户可以在线提交程序源代码&#xff0c;系统对源代码进行编译和执行&#xff0c;并通过预先设计的测试数据来检验程序源代码的正确性。 一个用户提交的程序在Online Judge系统下执行时将受到比…

OJ的介绍以及使用方法

OJ系统简介 Online Judge系统&#xff08;简称OJ&#xff09;是一个在线的判题系统。用户可以在线提交程序多种程序&#xff08;如C、C&#xff09; 源代码&#xff0c;系统对源代码进行编译和执行&#xff0c;并通过预先设计的测试数据来检验程序源代码的正确性。 一个用户提…

C++-OJ

题目源自某高校C的OJ 本文字数过多&#xff0c;所有代码&#xff0c;都在这里 将做过的C OJ题目整理合并了一下&#xff0c;总共有一百多道题目&#xff0c;手动合并自然是不可能的 这个时候我们就可以使用shell脚本来取代这种机械化的重复劳动了&#xff0c;由于写成博客需要…

杭电OJ刷题指南(ACM)

除了杭电OJ&#xff0c;还有北大OJ&#xff0c;华科OJ等。 1.首先&#xff0c;打开百度&#xff0c;输入“杭电OJ”进行搜索 2.然后进入杭电OJ官网&#xff0c;进行注册 3.输入注册信息 4.接下来进入详细注册界面&#xff0c;将信息填写完整后点击Submit 5.接下来即可登录…

OJ系统

什么是OJ Online Judge系统&#xff08;简称OJ&#xff09;是一个在线的判题系统。用户可以在线提交程序源代码&#xff0c;系统对源代码进行编译和执行&#xff0c;并通过预先设计的测试数据来检验程序源代码的正确性。 一个用户提交的程序在Online Judge系统下执行时将受到比…

最适合编程训练的三大OJ(从易到难)

按照学习的需求来说依次介绍&#xff0c;方便初学者使用&#xff1a; 1.Dotcpp网www.dotcpp.com 优点&#xff1a;全中文OJ&#xff0c;题目分类&#xff0c;有题解 这可能是初学者最好用的OJ甚至没有之一了 全中文的友好操作&#xff0c;充足的语法基础题、二级C语言题、…

各大OJ刷题平台汇总

前言 想成为一名高级工程师&#xff0c;算法还是要有的&#xff0c;至少在入门编程和进入公司之前都是必备的。刷题也可以很好的锻炼动手能力和逻辑思维&#xff0c;今天就给大家介绍一些知名的在线刷题平台,都是干货哦&#xff01; 力扣(leetcode) 江湖人尽皆知的站点&#xf…

OJ的基本原理

OJ的简介&#xff1a;OJ(Online Judge)&#xff0c;就是一个线上判断的接口&#xff0c;通常用于一些比赛中的程序判断&#xff0c;也就是将符合程序的结果放在OJ上&#xff0c;来进行程序验证&#xff0c;后来的大量的互联网公司也开始使用OJ来判断题目的正确性。 OJ的分类 …

【OJ】OJ的介绍和常用OJ推荐

目录 OJ的介绍编程刷题OJ集合计蒜客(主刷编程题 &#xff09;牛客网(编程题和选择题都有)力扣(主要编程大题)领扣(主刷大题)Comet OJACMOREXidian Programming Contest Online Judge晴问浙江中医药OJZOJHDUOJ华东师范OJ洛谷codeforces 常见的测评结果 OJ的介绍 Online Judge 简…

OJ基础题库(1)

收录内容 P1005 最大公约数 p1008 质数还是合数 p1019 修改字符串 p1021 日历问题 #include<iostream> using namespace std;int max_yueshu(int x,int y){int temp;while(y!0){tempx%y;xy;ytemp;}return x; }int main(){int n,i;cin>>n; //输入对数int x,y,res;…

OJ算法分析题库(2)

P1476 加工生产调度 【实验】贪心算法之流水作业调度问题&#xff08;分析&#xff09; P1748 abcd0 P1750 求逆序对 P1746 求解查找最后一个数小于等于指定数的元素问题 P1477 部分背包问题&#xff08;分析&#xff09; 算法分析&#xff1a; 算法大致的思路就是通过四…

小程序生成网址链接,网址链接跳转小程序(附详细流程)

1.点击右上角工具下拉选择生成URL Scheme 2.填写好信息点击生成 3. 可以得出一个 weixin://dl/business/?tbAXXXXX 这样的链接&#xff0c;点击就可以调整到小程序拉&#xff0c;但是这种只能在微信打开哦。

小程序接入流量主、banner广告、激励广告

小程序接入广告 1.什么是微信小程序广告2.流量主开通流程3.微信小程序流量主开通以及添加广告步骤(1) 接入banner广告(2) 接入激励广告 1.什么是微信小程序广告 2.流量主开通流程 申请成为流量主后才能接入广告首先进入小程序后台&#xff0c;点击流量主&#xff0c;点击开通…