【Shell编程】Linux Shell编程入门:输入输出、变量、条件判断、函数和运算

news2024/11/15 17:48:22

在Linux操作系统中,Shell编程是一项非常重要的技能。通过Shell编程,我们可以自动化执行各种任务,提高工作效率。无论是系统管理、数据处理还是软件开发,都离不开Shell脚本的应用。本篇博客将带领大家深入了解Shell编程的基础知识,包括输入输出、变量、条件判断、函数和运算等部分。通过学习这些内容,将能够编写简单而强大的Shell脚本,实现各种自动化任务。无论你是初学者还是有一定经验的开发者,本篇博客都将为你提供详细的解释和实例代码,帮助你快速入门Shell编程。让我们一起开始这个有趣而实用的Shell编程之旅吧!
在这里插入图片描述

文章目录

    • 1. 输入输出
      • 1.1 从标准输入读取用户输入:
      • 1.2 读取命令行参数:
      • 1.3 使用环境变量:
      • 1.4 从文件中读取数据:
      • 1.5 将结果输出到文件:
      • 1.6 使用管道连接多个命令:
      • 1.7 将错误消息输出到文件:
    • 2. 变量
      • 2.1 定义变量:
      • 2.2 使用变量:
      • 2.3 只读变量:
      • 2.4 删除变量:
      • 2.5 特殊变量:
    • 3. 条件判断
      • 3.1 `if`语句
      • 3.2 `case`语句
    • 4. 运算
      • 4.1 数值运算:
      • 4.2 字符串运算:
      • 4.3 逻辑运算:可以使用逻辑运算符进行逻辑运算,例如:
    • 5. 函数
    • 总结

1. 输入输出

1.1 从标准输入读取用户输入:

#!/bin/bash

echo "请输入您的名字:"
read name
echo "您好,$name!"

在这个例子中,使用read命令从标准输入读取用户输入的名字,并使用echo命令将问候语输出到标准输出。

1.2 读取命令行参数:

#!/bin/bash

echo "第一个参数是:$1"
echo "第二个参数是:$2"

在这个例子中,使用$1$2来获取命令行参数的值,并使用echo命令将参数值输出到标准输出。

1.3 使用环境变量:

#!/bin/bash

echo "当前用户的主目录是:$HOME"
echo "当前工作目录是:$PWD"

在这个例子中,使用$HOME$PWD来获取环境变量的值,并使用echo命令将值输出到标准输出。

1.4 从文件中读取数据:

#!/bin/bash

while IFS= read -r line
do
  echo "读取到的行:$line"
done < input.txt

在这个例子中,使用while循环和read命令从input.txt文件中逐行读取数据,并使用echo命令将每行数据输出到标准输出。

1.5 将结果输出到文件:

#!/bin/bash

echo "这是一行文本" > output.txt

在这个例子中,使用重定向符号>将文本输出到output.txt文件中。

1.6 使用管道连接多个命令:

#!/bin/bash

ls -l | grep ".txt"

在这个例子中,使用管道将ls -l命令的输出作为grep ".txt"命令的输入,用于过滤出包含.txt的文件。

1.7 将错误消息输出到文件:

#!/bin/bash

command_not_exist 2> error.txt

在这个例子中,使用重定向符号2>command_not_exist命令的错误消息输出到error.txt文件中。

2. 变量

2.1 定义变量:

可以使用=符号来定义变量,并为其赋值。变量名和赋值之间不能有空格。例如:

name="John"
age=25

2.2 使用变量:

可以通过在变量名前加上$符号来使用变量的值。例如:

echo "My name is $name and I am $age years old."

2.3 只读变量:

可以使用readonly命令将变量设置为只读,防止其被修改。例如:

readonly name

2.4 删除变量:

可以使用unset命令删除变量。例如:

unset age

2.5 特殊变量:

shell编程还提供了一些特殊变量,用于存储有关脚本和环境的信息。例如:

  • $0:当前脚本的文件名。
  • $1$2$3…:命令行参数的值。
  • $#:命令行参数的数量。
  • $*:所有命令行参数的值。
  • $@:所有命令行参数的值(作为独立的字符串)。
  • $?:上一个命令的退出状态。

下面是一个简单的示例代码,演示了如何定义和使用变量:

#!/bin/bash

name="John"
age=25

echo "My name is $name and I am $age years old."

readonly name

unset age

在这个例子中,定义了名为nameage的变量,并将其值分别设置为"John"和25。然后使用echo命令将变量的值输出到标准输出。最后,将name变量设置为只读,并删除age变量。

3. 条件判断

3.1 if语句

  1. 使用if语句进行条件判断:
if [ condition ]
then
    # code block
fi

在这个语法中,condition是一个条件表达式,可以是比较运算符、逻辑运算符、字符串比较等。如果condition为真,则执行then后的代码块。

  1. 使用else语句进行条件分支:
if [ condition ]
then
    # code block 1
else
    # code block 2
fi

在这个语法中,如果condition为真,则执行then后的代码块1,否则执行else后的代码块2。

  1. 使用elif语句进行多个条件分支:
if [ condition1 ]
then
    # code block 1
elif [ condition2 ]
then
    # code block 2
else
    # code block 3
fi

在这个语法中,首先判断condition1,如果为真,则执行then后的代码块1。如果condition1为假,再判断condition2,如果为真,则执行then后的代码块2。如果condition2也为假,则执行else后的代码块3。

  1. 使用逻辑运算符进行复杂的条件判断:
if [ condition1 ] && [ condition2 ]
then
    # code block
fi

在这个语法中,&&表示逻辑与运算符,如果condition1condition2都为真,则执行then后的代码块。

下面是一个简单的示例代码,演示了如何使用条件判断:

#!/bin/bash

age=18

if [ $age -ge 18 ]
then
    echo "You are an adult."
else
    echo "You are not an adult."
fi

在这个例子中,根据变量age的值进行条件判断。如果age大于等于18,则输出"You are an adult.“,否则输出"You are not an adult.”。

3.2 case语句

  1. case语句:case语句用于根据不同的模式匹配执行不同的代码块。以下是case语句的基本语法:
case expression in
    pattern1)
        # code block 1
        ;;
    pattern2)
        # code block 2
        ;;
    pattern3)
        # code block 3
        ;;
    *)
        # default code block
        ;;
esac

在这个语法中,expression是要匹配的表达式,pattern1pattern2等是不同的模式,code block 1code block 2等是对应模式的代码块。如果expression匹配到某个模式,则执行对应模式的代码块,然后跳出case语句。如果没有匹配到任何模式,则执行default code block

  1. test命令:test命令用于进行条件判断,并返回一个退出状态。以下是test命令的基本语法:
test condition

在这个语法中,condition是一个条件表达式,可以是比较运算符、逻辑运算符、字符串比较等。如果condition为真,则test命令返回退出状态0,否则返回非零退出状态。

test命令也可以使用方括号[]来进行条件判断,例如[ condition ]

  1. 数值比较:可以使用比较运算符进行数值比较,例如:
  • -eq:等于
  • -ne:不等于
  • -gt:大于
  • -lt:小于
  • -ge:大于等于
  • -le:小于等于
  1. 字符串比较:可以使用字符串比较运算符进行字符串比较,例如:
  • =:相等
  • !=:不相等
  • -z:长度为零
  • -n:长度不为零

下面是一个使用case语句和test命令进行条件判断的示例代码:

#!/bin/bash

fruit="apple"

case $fruit in
    "apple")
        echo "It's an apple."
        ;;
    "banana")
        echo "It's a banana."
        ;;
    *)
        echo "It's neither an apple nor a banana."
        ;;
esac

if [ $fruit = "apple" ]
then
    echo "It's an apple."
else
    echo "It's not an apple."
fi

在这个例子中,首先使用case语句根据变量fruit的值进行模式匹配。如果fruit是"apple",则输出"It’s an apple.“,如果是"banana”,则输出"It’s a banana.“,否则输出"It’s neither an apple nor a banana.”。然后使用test命令进行条件判断,如果fruit等于"apple",则输出"It’s an apple.“,否则输出"It’s not an apple.”。

4. 运算

在shell编程中,可以进行各种类型的运算,包括数值运算、字符串运算和逻辑运算。下面是一些常用的运算符和运算方式:

4.1 数值运算:

可以使用算术运算符进行数值运算,例如:

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取余

可以使用$((expression))expr命令来进行数值运算。例如:

#!/bin/bash

num1=10
num2=5

# 使用$((expression))进行数值运算
result1=$((num1 + num2))
echo "Result 1: $result1"

# 使用expr命令进行数值运算
result2=$(expr $num1 - $num2)
echo "Result 2: $result2"

在这个例子中,首先定义了两个变量num1num2,然后使用$((expression))进行加法运算和expr命令进行减法运算,分别将结果赋值给result1result2,最后输出结果。

4.2 字符串运算:

可以使用字符串运算符进行字符串运算,例如:

  • +:字符串拼接
  • =:字符串相等
  • !=:字符串不相等
  • -z:字符串为空
  • -n:字符串不为空

例如:

#!/bin/bash

str1="Hello"
str2="World"

# 字符串拼接
result1=$str1$str2
echo "Result 1: $result1"

# 字符串相等判断
if [ $str1 = $str2 ]
then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

# 字符串为空判断
if [ -z $str1 ]
then
    echo "String is empty."
else
    echo "String is not empty."
fi

在这个例子中,首先定义了两个变量str1str2,然后使用+运算符进行字符串拼接,将结果赋值给result1,然后使用=运算符进行字符串相等判断,最后使用-z运算符进行字符串为空判断,根据不同的情况输出结果。

4.3 逻辑运算:可以使用逻辑运算符进行逻辑运算,例如:

  • &&:逻辑与
  • ||:逻辑或
  • !:逻辑非

例如:

#!/bin/bash

num=10

# 逻辑与运算
if [ $num -gt 0 ] && [ $num -lt 20 ]
then
    echo "Number is between 0 and 20."
else
    echo "Number is not between 0 and 20."
fi

# 逻辑或运算
if [ $num -eq 0 ] || [ $num -eq 20 ]
then
    echo "Number is either 0 or 20."
else
    echo "Number is neither 0 nor 20."
fi

# 逻辑非运算
if ! [ $num -eq 0 ]
then
    echo "Number is not 0."
else
    echo "Number is 0."
fi

在这个例子中,首先定义了一个变量num,然后使用-gt-lt运算符进行数值比较,使用&&运算符进行逻辑与运算,使用-eq运算符进行数值比较,使用||运算符进行逻辑或运算,使用-eq运算符进行数值比较,使用!运算符进行逻辑非运算,根据不同的情况输出结果。

5. 函数

在shell编程中,可以使用函数来封装一段可重用的代码。函数可以接受参数,执行一系列操作,并返回一个值。下面是一个简单的函数示例:

#!/bin/bash

# 定义一个函数
hello() {
    echo "Hello, $1!"
}

# 调用函数
hello "World"

在这个例子中,首先使用hello() { ... }的语法定义了一个名为hello的函数。函数中的$1表示第一个参数,通过$1可以获取到函数调用时传入的参数。在函数中,使用echo命令输出一条带有参数的问候语。然后,在函数定义后,使用hello "World"的语法调用了这个函数,并传入了一个参数"World"。运行脚本后,会输出Hello, World!

除了接受参数和输出结果,函数还可以执行其他各种操作,例如进行数值运算、字符串处理、文件操作等。下面是一个更复杂的函数示例:

#!/bin/bash

# 定义一个函数,计算两个数的和
sum() {
    local num1=$1
    local num2=$2
    local result=$((num1 + num2))
    echo "The sum of $num1 and $num2 is $result."
}

# 调用函数
sum 10 5

在这个例子中,首先使用sum() { ... }的语法定义了一个名为sum的函数。函数中使用local关键字定义了三个局部变量num1num2result,并分别赋值为传入的两个参数的和。然后,使用echo命令输出计算结果。在函数定义后,使用sum 10 5的语法调用了这个函数,并传入了两个参数105。运行脚本后,会输出The sum of 10 and 5 is 15.

总结

Shell编程是一种在Unix/Linux系统下进行脚本编程的方式。在Shell脚本中,可以使用变量来存储数据,使用条件语句进行逻辑判断,使用循环语句进行重复操作,使用运算符进行数值和逻辑运算,使用函数封装可重用的代码。通过合理使用这些特性,可以实现各种复杂的计算和逻辑操作。Shell脚本可以用于自动化任务、系统管理、数据处理等各种场景。它具有简单易学、灵活高效的特点,是Unix/Linux系统下非常重要的工具之一。无论是初学者还是有经验的开发者,都可以通过Shell编程来简化工作、提高效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/855071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

木马免杀(篇一)基础知识学习

木马免杀&#xff08;篇一&#xff09;基础知识学习 ———— 简单的木马就是一个 exe 文件&#xff0c;比如今年hw流传的一张图&#xff1a;某可疑 exe 文件正在加载。当然木马还可能伪造成各式各样的文件&#xff0c;dll动态链接库文件、lnk快捷方式文件等&#xff0c;也可能…

音视频基础:分辨率、码率、帧率之间关系

基础 人类视觉系统 分辨率 像素&#xff1a; 是指由图像的小方格组成的&#xff0c;这些小方块都有一个明确的位置和被分配的色彩数值&#xff0c;小方格颜色和位置就决定该图像所呈现出来的样子&#xff1b;可以将像素视为整个图像中不可分割的单位或者是元素&#xff1b;像素…

php通过递归获取分公司的上下级数据

1.表结构 2.php核心代码 /*** param $branches 全部分公司数据* param $parentId 查询的分公司id&#xff0c;传0则全部排序。大于0&#xff0c;则查询该分公司下的下级* param int $level 层级&#xff0c;方便界面特效* param int $level_grade 层级叠加数* return array*/f…

CNN的特性

1、位移不变性 它指的是无论物体在图像中的什么位置&#xff0c;卷积神经网络的识别结果都应该是一样的。 因为CNN就是利用一个kernel在整张图像上不断步进来完成卷积操作的&#xff0c;而且在这个过程中kernel的参数是共享的。换句话说&#xff0c;它其实就是拿了同一张“通…

Docker+rancher部署SkyWalking8.5并应用在springboot服务中

1.Skywalking介绍 Skywalking是一个国产的开源框架&#xff0c;2015年有吴晟个人开源&#xff0c;2017年加入Apache孵化器&#xff0c;国人开源的产品&#xff0c;主要开发人员来自于华为&#xff0c;2019年4月17日Apache董事会批准SkyWalking成为顶级项目&#xff0c;支持Jav…

预测成真,国内传来三个消息,中国年轻人变了,创新力产品崛起

中国的年轻人真的变了&#xff01; 最近&#xff0c;国内传来三个消息&#xff0c;让外媒的预测成真。 第一&#xff0c;奥迪要开始用国产车的平台了。这里需要说明的是新能源汽车&#xff0c;奥迪也曾多次公开表示&#xff0c;承认了当前中国新能源汽车核心技术上的领先。 第…

【计算机网络】概述及数据链路层

每一层只依赖于下一层所提供的服务&#xff0c;使得各层之间相互独立、灵活性好&#xff0c;已于实现和维护&#xff0c;并能促进标准化工作。 应用层&#xff1a;通过应用进程间的交互完成特定的网络应用&#xff0c;HTTP、FTP、DNS&#xff0c;应用层交互的数据单元被称为报…

java编程规范

一、时间格式为什么有大写有小写呢&#xff1f; new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");为了区分月份和分钟&#xff0c;用大写M代表月份&#xff0c;小写m代表分钟 而大写的H代表24小时制&#xff0c;小写h代表12小时制 二、下面的程序判断等值的方式&…

【人工智能前沿弄潮】—— SAM自动生成物体mask

SAM自动生成物体mask 由于SAM可以高效处理提示&#xff0c;可以通过在图像上抽样大量的提示来生成整个图像的mask。这种方法被用来生成数据集SA-1B。 类SamAutomaticMaskGenerator实现了这个功能。它通过在图像上的网格中对单点输入提示进行抽样&#xff0c;从每个提示中SAM可…

基于关系有向图的知识推理2022ACM 8.9

基于关系有向图的知识推理 摘要介绍相关工作基于路径的方法基于GNN的方法 关系有向图RED-GCN实验 摘要 知识图推理旨在从已有的知识中推断出新的事实。基于关系路径的方法在文献中显示出较强的可解释性和归纳推理能力。然而&#xff0c;在KG中 捕获复杂拓扑(Capturing complex…

饮用水除硝酸盐、饮用水除砷、饮用水除氟、饮用水除铁锰的技术汇总

我们所说的“自来水”是指从水龙头里放出来的水。但从水龙头里放出来并不等于安全卫生。实际上&#xff0c;原水必须经过各种处理措施之后才能称为安全卫生的饮用水。每一滴水都要经过了混凝、沉淀、过滤、消毒四个步骤的处理&#xff0c;才能去除杂质和细菌&#xff0c;变得安…

Three.js纹理贴图

目录 Three.js入门 Three.js光源 Three.js阴影 Three.js纹理贴图 纹理是一种图像或图像数据&#xff0c;用于为物体的材质提供颜色、纹理、法线、位移等信息&#xff0c;从而实现更加逼真的渲染结果。 纹理可以应用于Three.js中的材质类型&#xff0c;如MeshBasicMaterial…

本质矩阵E、基本矩阵F、单应矩阵H

1. E (归一化坐标对进行计算) t ^ R 为3*3的矩阵, 因为R,t共有6个自由度&#xff0c;又因为单目尺度等价性&#xff0c;所以实际上E矩阵共有5个自由度。因此至少需要5个点对来求解。 2. 基本矩阵F:根据两帧间匹配的像素点对儿计算 3*3且自由度为7的矩阵kF也为基础矩阵&#x…

构建之法 - 软工教学:每天都向前推进一点点

作者&#xff1a;福州⼤学 汪璟玢⽼师 汪老师&#xff1a;每次都向前推进一点点&#xff0c;哪怕只有一点点&#xff0c;也好过什么都不做。 ​邹老师&#xff1a;对&#xff0c;几个学期下来&#xff0c;就已经超过那些“空想”的团队很远了。坚持下去&#xff01; 汪老师&…

x86 kgdb deug调试分析

本文主要是收集&#xff0c;以下文章写得很好&#xff0c;我二次整理一下。 如果要手动livedb. 1. call kdbg_arch_late() 2. kgd_set_hw_break(addr,8,1); 3. kgdb_correct_hw_break();// enable bp to cpu regs -------------------------------分割线----------------…

第5讲:如何构建类的方法

【分享成果&#xff0c;随喜正能量】在这个社会上&#xff0c;对别人好一点&#xff0c;多站在别人的角度考虑&#xff0c;不要为小事争执&#xff0c;不要取笑他人&#xff0c;不要在别人背后嚼舌根&#xff0c;更不能逼人太甚。凡事退一步&#xff0c;对你有好处。。 《VBA中…

前沿分享-无创检测血糖RF波

非侵入性血糖仪&#xff0c;利用射频 (RF) 波连续测量血液中的葡萄糖水平。利用射频波技术连续实时监测血液中的葡萄糖水平&#xff0c;使用的辐射要比手机少得多。 大概原理是血液中的葡萄糖是具有介电特性&#xff0c;一般来说就是介电常数。 电磁波波幅的衰减反映了介质对电…

电脑文件丢失如何找回?使用这个方法轻松找回!

电脑文件丢失怎么办&#xff1f;有没有免费的电脑文件恢复软件&#xff1f;相信很多人在日常办公中也都经常会遇到这种现象&#xff0c;不管是在学习中&#xff0c;还是日常的办公&#xff0c;往往也都会在电脑上存储大量的数据文件&#xff0c;那么如果我们在日常办公操作过程…

忆恒创源发布PBlaze7 7940系列PCIe 5.0企业级NVMe SSD

今天&#xff0c;国内知名企业级SSD产品和解决方案供应商——北京忆恒创源科技股份有限公司&#xff08;Memblaze&#xff0c;以下简称“忆恒创源”&#xff09;全新一代PCIe 5.0企业级NVMe SSD PBlaze7 7940正式发布。与主流PCIe 4.0产品相比&#xff0c;PBlaze7 7940有着2.5倍…

1.利用matlab建立符号表达式(matlab程序)

1.简述 、 1. 使用sym命令创建符号变量和表达式 语法&#xff1a; sym(‘变量’,参数) %把变量定义为符号对象 说明&#xff1a;参数用来设置限定符号变量的数学特性&#xff0c;可以选择为’positive’、’real’和’unreal’&#xff0c; ’positive’ 表示为“正、实”符…