操作系统——shell编程

news2024/12/23 17:32:32

文章目录

    • shell入门
      • 什么是 Shell?
      • Shell 编程的 Hello World
    • Shell 变量
      • Shell 编程中的变量介绍
      • Shell 字符串入门
      • Shell 字符串常见操作
      • Shell 数组
    • Shell 基本运算符
      • 算数运算符
      • 关系运算符
      • 逻辑运算符
      • 布尔运算符
      • 字符串运算符
      • 文件相关运算符
    • shell流程控制
      • if 条件语句
      • for 循环语句
      • while 语句
    • shell 函数
      • 不带参数没有返回值的函数
      • 有返回值的函数
      • 带参数的函数

shell入门

什么是 Shell?

简单来说“Shell编程就是对一堆Linux命令的逻辑化处理”。

W3Cschool 上的一篇文章是这样介绍 Shell的,如下图所示。
什么是 Shell?

Shell 编程的 Hello World

学习任何一门编程语言第一件事就是输出HelloWord了!下面我会从新建文件到shell代码编写来说下Shell 编程如何输出Hello World。

(1)新建一个文件 helloworld.sh :touch helloworld.sh,扩展名为 sh(sh代表Shell)(扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了)

(2) 使脚本具有执行权限:chmod +x helloworld.sh

(3) 使用 vim 命令修改helloworld.sh文件:vim helloworld.sh(vim 文件------>进入文件----->命令模式------>按i进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输入:wq/q! (输入wq代表写入内容并退出,即保存;输入q!代表强制退出不保存。))

helloworld.sh 内容如下:

#!/bin/bash
#第一个shell小程序,echo 是linux中的输出命令。
echo  "helloworld!"

shell中 # 符号表示注释。shell 的第一行比较特殊,一般都会以#!开始来指定使用的 shell 类型。在linux中,除了bash shell以外,还有很多版本的shell, 例如zsh、dash等等…不过bash shell还是我们使用最多的。

(4) 运行脚本:./helloworld.sh 。(注意,一定要写成 ./helloworld.sh ,而不是 helloworld.sh ,运行其它二进制的程序也一样,直接写 helloworld.sh ,linux 系统会去 PATH 里寻找有没有叫 helloworld.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 helloworld.sh 是会找不到命令的,要用./helloworld.sh 告诉系统说,就在当前目录找。)

shell 编程Hello World

Shell 变量

Shell 编程中的变量介绍

Shell编程中一般分为三种变量:

  1. 我们自己定义的变量(自定义变量): 仅在当前 Shell 实例中有效,其他 Shell 启动的程序不能访问局部变量。
  2. Linux已定义的环境变量(环境变量, 例如:$PATH, $HOME 等…, 这类变量我们可以直接使用),使用 env 命令可以查看所有的环境变量,而set命令既可以查看环境变量也可以查看自定义变量。
  3. Shell变量 :Shell变量是由 Shell 程序设置的特殊变量。Shell 变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了 Shell 的正常运行

常用的环境变量:

PATH 决定了shell将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录名
HOSTNAME 指主机的名称
SHELL 当前用户Shell类型
LANGUGE  语言相关的环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PS1 基本提示符,对于root用户是#,对于普通用户是$

使用 Linux 已定义的环境变量:

比如我们要看当前用户目录可以使用:echo $HOME命令;如果我们要看当前用户Shell类型 可以使用echo $SHELL命令。可以看出,使用方法非常简单。

使用自己定义的变量:

#!/bin/bash
#自定义变量hello
hello="hello world"
echo $hello
echo  "helloworld!"

使用自己定义的变量

Shell 编程中的变量名的命名的注意事项:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头,但是可以使用下划线(_)开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

Shell 字符串入门

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号。这点和Java中有所不同。

单引号字符串:

#!/bin/bash
name='SnailClimb'
hello='Hello, I  am '$name'!'
echo $hello

输出内容:

Hello, I am SnailClimb!

双引号字符串:

#!/bin/bash
name='SnailClimb'
hello="Hello, I  am "$name"!"
echo $hello

输出内容:

Hello, I am SnailClimb!

Shell 字符串常见操作

拼接字符串:

#!/bin/bash
name="SnailClimb"
# 使用双引号拼接
greeting="hello, "$name" !"
greeting_1="hello, ${name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$name' !'
greeting_3='hello, ${name} !'
echo $greeting_2  $greeting_3

输出结果:

输出结果

获取字符串长度:

#!/bin/bash
#获取字符串长度
name="SnailClimb"
# 第一种方式
echo ${#name} #输出 10
# 第二种方式
expr length "$name";

输出结果:

10
10

使用 expr 命令时,表达式中的运算符左右必须包含空格,如果不包含空格,将会输出表达式本身:

expr 5+6    // 直接输出 5+6
expr 5 + 6       // 输出 11

对于某些运算符,还需要我们使用符号\进行转义,否则就会提示语法错误。

expr 5 * 6       // 输出错误
expr 5 \* 6      // 输出30

截取子字符串:

简单的字符串截取:

#从字符串第 1 个字符开始往后截取 10 个字符
str="SnailClimb is a great man"
echo ${str:0:10} #输出:SnailClimb

根据表达式截取:

#!bin/bash
#author:amau

var="http://www.runoob.com/linux/linux-shell-variable.html"

s1=${var%%t*}#h
s2=${var%t*}#http://www.runoob.com/linux/linux-shell-variable.h
s3=${var%%.*}#http://www
s4=${var#*/}#/www.runoob.com/linux/linux-shell-variable.html
s5=${var##*/}#linux-shell-variable.html

Shell 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。我下面给了大家一个关于数组操作的 Shell 代码示例,通过该示例大家可以知道如何创建数组、获取数组长度、获取/删除特定位置的数组元素、删除整个数组以及遍历数组。

#!/bin/bash
array=(1 2 3 4 5);
# 获取数组长度
length=${#array[@]}
# 或者
length2=${#array[*]}
#输出数组长度
echo $length #输出:5
echo $length2 #输出:5
# 输出数组第三个元素
echo ${array[2]} #输出:3
unset array[1]# 删除下标为1的元素也就是删除第二个元素
for i in ${array[@]};do echo $i ;done # 遍历数组,输出: 1 3 4 5 
unset array; # 删除数组中的所有元素
for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没有任何输出内容

Shell 基本运算符

说明:图片来自《菜鸟教程》

Shell 编程支持下面几种运算符

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

算数运算符

算数运算符

我以加法运算符做一个简单的示例(注意:不是单引号,是反引号):

#!/bin/bash
a=3;b=3;
val=`expr $a + $b`
#输出:Total value : 6
echo "Total value : $val"

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

shell关系运算符

通过一个简单的示例演示关系运算符的使用,下面shell程序的作用是当score=100的时候输出A否则输出B。

#!/bin/bash
score=90;
maxscore=100;
if [ $score -eq $maxscore ]
then
   echo "A"
else
   echo "B"
fi

输出结果:

B

逻辑运算符

逻辑运算符

示例:

#!/bin/bash
a=$(( 1 && 0))
# 输出:0;逻辑与运算只有相与的两边都是1,与的结果才是1;否则与的结果是0
echo $a;

布尔运算符

布尔运算符

这里就不做演示了,应该挺简单的。

字符串运算符

 字符串运算符

简单示例:

#!/bin/bash
a="abc";
b="efg";
if [ $a = $b ]
then
   echo "a 等于 b"
else
   echo "a 不等于 b"
fi

输出:

a 不等于 b

文件相关运算符

文件相关运算符

使用方式很简单,比如我们定义好了一个文件路径file="/usr/learnshell/test.sh" 如果我们想判断这个文件是否可读,可以这样if [ -r $file ] 如果想判断这个文件是否可写,可以这样-w $file,是不是很简单。

shell流程控制

if 条件语句

简单的 if else-if else 的条件语句示例

#!/bin/bash
a=3;
b=9;
if [ $a -eq $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
else
   echo "a 小于 b"
fi

输出结果:

a 小于 b

相信大家通过上面的示例就已经掌握了 shell 编程中的 if 条件语句。不过,还要提到的一点是,不同于我们常见的 Java 以及 PHP 中的 if 条件语句,shell if 条件语句中不能包含空语句也就是什么都不做的语句。

for 循环语句

通过下面三个简单的示例认识 for 循环语句最基本的使用,实际上 for 循环语句的功能比下面你看到的示例展现的要大得多。

输出当前列表中的数据:

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

产生 10 个随机数:

#!/bin/bash
for i in {0..9};
do 
   echo $RANDOM;
done

输出1到5:

通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要,下面来看一个例子:

#!/bin/bash
for((i=1;i<=5;i++));do
    echo $i;
done;

while 语句

基本的 while 循环语句:

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

while循环可用于读取键盘信息:

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的电影: '
while read FILM
do
    echo "是的!$FILM 是一个好电影"
done

输出内容:

按下 <CTRL-D> 退出
输入你最喜欢的电影: 变形金刚
是的!变形金刚 是一个好电影

无限循环:

while true
do
    command
done

shell 函数

不带参数没有返回值的函数

#!/bin/bash
hello(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
hello
echo "-----函数执行完毕-----"

输出结果:

-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----

有返回值的函数

输入两个数字之后相加并返回结果:

#!/bin/bash
funWithReturn(){
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $?"

输出结果:

输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3

带参数的函数

#!/bin/bash
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

输出结果:

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

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

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

相关文章

带着问题看SpringBoot

带着问题看SpringBoot 1、Spring容器具体是什么&#xff1f; 跟进run方法&#xff0c;context this.createApplicationContext()&#xff0c;得出容器是AnnotationConfigServletWebServerApplicationContext类。 SpringApplication.run(ServeroneApplication.class, args);…

轻松实现24小时无人直播带货,只需一款无人值守手机直播软件!

现在做线上运营&#xff0c;基本上就离不开短视频平台&#xff0c;想要做好短视频平台&#xff0c;就得弄懂如何在平台上进行直播。 今年以来&#xff0c;以专帮科技为首的一些科技公司研发的手机无人直播技术得到了快速发展&#xff0c;使得越来越多的企业和个人开始使用此类…

不溶性微粒该如何检测?液体粒子计数器

不溶性微粒是什么&#xff1f; 不溶性微粒系指可流动的、随机存在于静脉注射用药物中不溶于水的微小颗粒&#xff0c;通常采用光阻法(Light Obscuration Particles Count Test)和显微计数法(Microscopic Particles Count Test)进行检测。所谓静脉注射用药物中不溶于水的微小颗…

Go与Rust的对比与分析

Rust 和 Go 是两种现代语言&#xff0c;近年来获得了巨大的关注&#xff0c;每种语言都有自己独特的优势和权衡。在这篇文章中&#xff0c;我们将深入探讨 Rust 和 Go 之间的差异&#xff0c;重点关注性能、语言功能和其他关键因素&#xff0c;以帮助您针对您的开发需求做出明智…

VS13打开后菜单中没有“生成”这个选项

小白新手学开发之vs2013下载后没有生成菜单 今天下载了vs2013竟然发现程序在调试的时候&#xff0c;菜单上没有了生成这个选项&#xff01; 很苦恼&#xff0c;上网查了半天&#xff0c;也没有找到合适的方法&#xff0c;自己琢磨吧&#xff01; 不舍得把好不容易安装的这个v…

Workspace ONE 统一端点管理系统对 Windows 多用户的支持

自从二十多年前微软推出 Active Directory&#xff08;AD&#xff09;以来&#xff0c;用户就可以使用他们在 AD 中的任何账户登录到 Windows 域连接的 PC 上&#xff0c;而该 PC 将根据他们的需求量身定制。组策略对象&#xff08;Group policy objects, GPOs&#xff09;使这…

番茄(西红柿)叶病害识别(Python代码,pyTorch框架,深度卷积网络模型,很容易替换为其它模型,带有GUI识别界面)

代码运行要求&#xff1a;Torch>1.13.1即可 1.数据集介绍&#xff1a; 每一个文件夹里装有一类病害叶子的照片&#xff0c;一共10种类别&#xff0c;每种类别下有1100张照片 从第一类到第十类分别如下图所示 2.整体文件夹 data文件夹存放的是未被划分训练集和测试集的原…

HCIP实验之三层架构

目录 一、实验题目 二、实验思路 2.1 拓扑设计&#xff08;IP地址规划&#xff09; 2.2 实施 2.3 维护 2.4 升级 涉及知识点&#xff1a; 配置顺序: 三、实验步骤 3.1 建立eth-trunk 3.2 建立vlan 3.3 划入vlan 3.4 trunk干道 3.5 STP生成树协议 3.6 调整边缘接口…

解决vant组件 van-dialog造成的页面闪动问题

解决方案&#xff1a;该问题是因为van-dialog默认是scale&#xff0c;将这个属性改为fade即可

解决express引入express-session报错require(...) is not a function

我引入的版本是7.1.0 然后就报错 换成了6.1.0 就没事了 具体的还没有探究

Android开发基础知识总结(三)简单控件(上)

一.文本显示 考虑到结构样式相分离的思想&#xff0c;我们往往在XML中设置文本 <TextViewandroid:layout_width"342dp"android:layout_height"70dp"android:text"房价计算器"android:layout_gravity"center"android:textColor"…

OLED透明屏:如何选择合适的OLED透明屏供应商?定制、安装、生产

引言&#xff1a;OLED透明屏作为一种创新的显示技术&#xff0c;正逐渐占领市场并在各个行业中得到广泛应用。 在这篇文章中&#xff0c;尼伽将为您提供OLED透明屏的品牌排名、制造过程和安装要点的综合指南&#xff0c;结合相关调查数据和报告&#xff0c;详细介绍该技术的优…

Linux系统查看文件系统类型C代码

系统&#xff1a;VM Ubuntu 实现Linux系统下通过输入指定路径查看文件系统类型,MSDOS_SUPER_MAGIC&#xff0c;NTFS_SUPER_MAGIC和EXT4_SUPER_MAGIC这些宏定义并不是在sys/mount.h中定义的&#xff0c;它们实际上是在linux/magic.h头文件中定义的。不同系统下宏定义可能不一样&…

基于微信小程序的美食系统/基于微信小程序的美食网站/基于springboot的美食宣传平台

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括微信小程序美食天下的网络应用&#xff0c;在外国微信小程序美食天下已经是很普遍的方式&#xff0c;不过国内的美食天下可能还处于起步阶段。微信小程序美食天下具有在…

rook-ceph部署

宿主机&#xff1a; MacBook Pro&#xff08;Apple M2 Max&#xff09; VMware Fusion Player 版本 13.0.2 VM软硬件&#xff1a; ubuntu 22.04.2 4核 CPU&#xff0c;5G 内存&#xff0c;40G硬盘 *每台机器分配硬件资源很重要&#xff0c;可以适当超过宿主机的资源量&am…

【php】windows下php运行已有php web项目环境配置教程

php环境配置教程 php安装composer安装扩展安装redis扩展安装 composer install 本文操作系统使用的是win11&#xff0c;软件PhpStorm 2023.1 php安装 要安装的php版本可以在composer.json看到&#xff0c;下载安装对应版本 windows下载地址https://windows.php.net/download …

华为OD机试之报文重排序【Java源码】

题目描述 对报文进行重传和重排序是常用的可靠性机制&#xff0c;重传缓中区内有一定数量的子报文&#xff0c;每个子报文在原始报文中的顺序已知&#xff0c;现在需要恢复出原始报文。 输入描述 输入第一行为N&#xff0c;表示子报文的个数&#xff0c;0 &#xff1c;N ≤ …

海外聚合广告SDK功能比较

目前主流的广告变现平台数量繁多&#xff0c;开发者在选择第三方聚合广告平台时&#xff0c;如何判别&#xff1f;APP开发者有哪些指标来衡量如何选择聚合广告平台呢&#xff1f; 1、接入及运营成本 广告SDK是否容易接入&#xff1f;聚合平台操作是否简单易懂&#xff1f;广告…

AMBA总线协议(5)——AHB(三):猝发传输

一、前言 在之前的文章中我们详细讲述了关于AHB的基本操作流程&#xff0c;主机要先从仲裁器获得授权&#xff0c;然后进行总线的访问&#xff0c;这样可以避免总线冲突&#xff0c;获得授权后&#xff0c;主机给出地址和控制信号&#xff0c;从机根据自身情况进行响应&#xf…