Shell编程 --基础语法(1)

文章目录

  • Shell编程
  • 基础语法
    • 变量
      • 定义变量
      • 使用变量
      • 命令的使用
      • 只读变量
      • 删除变量
    • 传递参数
    • 字符串
      • 获取字符串长度
      • 字符串截取
    • 数组
      • 定义方式
      • 关联数组
      • 获取数组的长度
  • 总结

Shell编程

Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

基础语法

Shell编程的基础语法有变量、传递参数、字符串、数组、运算符、echo命令、printf命令、read命令、 test命令。

变量

在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

定义变量

Shell 支持以下三种定义变量的方式:
#!/bin/sh	--------->#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序variable=value
variable='value'
variable="value"
#注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。

Shell 变量的命名规范和大部分编程语言都一样:

1. 变量名由数字、字母、下划线组成;
2. 必须以字母或者下划线开头;
3. 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:

#!/bin/sh
train_head='huochetou'
a=houchetou
b="huochetou"
echo $train_head,$a,$b
------------------------------
huochetou,houchetou,huochetou

那么,假设现在有一个变量skill=python,要求输出“you are good at pythons job”,将其中的python用变量skill替换:

skill='python'
echo "you are good at ${skill}s job"	#用花括号将变量名括起来,帮助$识别
-----------------
you are good at pythons job

推荐给所有变量加上花括号{ },这是个良好的编程习惯。

但是!!!需要注意的是,虽然双引号的单引号都可以定义变量,它们依然有区别:单引号内全部为字符串,引用的变量不能使用:

skill="java"
echo "you are good at ${skill}s job"
echo you are good at ${skill}s job
echo 'you are good at ${skill}s job'
--------------------
you are good at javas job
you are good at javas job
you are good at ${skill}s job	#由此可见,单引号内不能识别变量,全部按字符串输出

命令的使用

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

#第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;
#第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。
variable=`Shell`
variable=$(Shell)

如:

comm=`ps`
echo $comm aaaaaaaaaa
comm2=$(ps)
echo $comm2 bbbbbbbbbb
--------------
PID TTY TIME CMD 7311 pts/4 00:00:00 bash 7960 pts/4 00:00:00 sh 7961 pts/4 00:00:00 ps aaaaaaaaaa
PID TTY TIME CMD 7311 pts/4 00:00:00 bash 7960 pts/4 00:00:00 sh 7962 pts/4 00:00:00 ps bbbbbbbbbb

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

# readonly 只读变量 不能修改
ai_03='pretty good'		
echo "$ai_03 ......."	#正常变量输出readonly ai_03		#将变量设置为只读变量ai_03="pretty pretty good"	#给变量重新赋值,尝试输出
echo "$ai_03 ......."
------------------
pretty good .......
02.sh:行24: ai_03: 只读变量		#结果可见:变量变成只读变量后,修改后无法输出

删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用;unset 命令不能删除只读变量。

比如:

# 删除变量 只读变量无法删除
unset ai_03
echo "ai_03 ....."
----------------
02.sh: 第 34 行:unset: ai_03: 无法反设定: 只读 variable
ai_03 .....		#我们看到,只读变量不能删除,依旧成功输出
===============================
# 空变量不会报错 输出一个空
unset comm2
echo "$comm2 ......."
--------------.......	#我们看到变量comm2输出一个空

传递参数

在这里插入图片描述

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

比如:

#!/bin/sh
# 接受文件外部传参
# 超过十的数字用括号括起来
echo "接受第一个参数$0"
echo "接受第二个参数$1"
echo "接受第三个参数$2"
echo "接受第四个参数$3"
echo "接受第五个参数$4"
echo "接受第六个参数$5"
echo "接受第Ⅶ个参数$6"
echo "接受第八个参数$7"
echo "接受第九个参数$8"
echo "接受第十个参数$9"
echo "接受第十一个参数${10}"
echo "接受第十二个参数${11}"
echo "$# 个参数"
echo "输入的参数为$@"
echo "输入的参数为$*"

外部传参,输出结果(输出的第一个参数为文件名):

[root@localhost shell_test]# sh 03.sh 2 234  5423  23535 5325 131235 235235 324 43 85 976 765 8657 5646
接受第一个参数03.sh
接受第二个参数2
接受第三个参数234
接受第四个参数5423
接受第五个参数23535
接受第六个参数5325
接受第Ⅶ个参数131235
接受第八个参数235235
接受第九个参数324
接受第十个参数43
接受第十一个参数85
接受第十二个参数976
14 个参数
输入的参数为2 234 5423 23535 5325 131235 235235 324 43 85 976 765 8657 5646
输入的参数为2 234 5423 23535 5325 131235 235235 324 43 85 976 765 8657 5646

字符串

字符串(String)就是一系列字符的组合。字符串是 Shell 编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了)。

字符串可以由单引号’ '包围,也可以由双引号" "包围,也可以不用引号。它们之间是有区别的:

  1. 由单引号’ '包围的字符串:

    ​ 任何字符都会原样输出,在其中使用变量是无效的。字符串中不能出现单引号,即使对单引号进行转义也不行。

  2. 由双引号" "包围的字符串:

    ​ 如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。字符串中可以出现双引号,只要它被转义了就行。

  3. 不被引号包围的字符串:

    ​ 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。

#!/bin/sh
n=214
str1=www.aaa,com$n
str2="shell \"scripe\"$n"
str3='shell "scripe"$n'
echo $str1
echo $str2
echo $str3
echo "$str1 $str2"		# 两个变量之间空格 用引号
-------------
www.aaa,com214
shell "scripe"214
shell "scripe"$n
www.aaa,com214 shell "scripe"214

获取字符串长度

在 Shell 中获取字符串长度很简单,具体方法如下:

${#string_name}	 #string_name 表示字符串名字

比如:

url='https://blog.csdn.net/zhangfei5354/article/details/136298293'
echo ${#url}
-------------
60

字符串截取

Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取。

  1. 从指定位置开始截取这种方式需要两个参数:

​ 除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。既然需要指定起始位置,那么就涉及到计数方向的问题,到底是从字符串左边开始计数,还是从字符串右边开始计数。答案是 Shell 同时支持两种计数方式。

#从左边计数
#格式:${string_name:start:length}
url='https://blog.csdn.net/zhangfei5354/article/details/136298293'
echo ${url:0:10}	#从第0位开始,截取10个长度的字符
echo ${url:1}		#从第1个开始,截取后面的所有字符
echo ${url:20:50}
-----------------------
https://bl
ttps://blog.csdn.net/zhangfei5354/article/details/136298293
t/zhangfei5354/article/details/136298293
#从右边计数
#格式:${string_name:0-start:length}
url='https://blog.csdn.net/zhangfei5354/article/details/136298293'
echo ${url:0-6:4}
----------
2982

注意:不管是从左边还是右边开始计数,截取方向都是从左向右!!!

  1. 从指定字符(子字符串)开始截取:

第二点也区分,从截取指定字符右边字符还是截取指定字符左边的字符:

# 从指定字符开始截取
# 截取右边的字符   ${string#*chars}
echo ${url#*blog}
echo ${url##*a}		#找到最右边符合匹配的字符,截取其右边的字符
-----------------
.csdn.net/zhangfei5354/article/details/136298293
ils/136298293
# 截取左边的字符 ${string%chars*}
echo ${url%blog*}
echo ${url%%a*}		#找到最左边符合匹配的字符,截取其左边的字符
------------
https://
https://blog.csdn.net/zh

数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。

与大部分编程语言类似,数组元素的下标由 0 开始。

定义方式

  1. Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2 value3 …………)

读取数组,格式:

${array_name[index]}

比如:

array=(1 2 A 4)
echo ${array[*]}	#读取数组内所有的值
echo ${array[1]}
-----------
1 2 A 4
2
  1. 也可以用数字下表定义数组:
array1[0]=n
array1[1]=i
array1[2]=h
array1[4]=a
array1[5]=o
echo ${array1[@]}
echo ${array1[1]}
echo ${#array1[@]}	#输出数组长度
----------
n i h a o
i
5

关联数组

有两种关联方式:

  1. 关联数组使用 declare 命令来声明,语法格式如下:
declare -A array_name-A 选项就是用于声明一个关联数组。
关联数组的键是唯一的。
declare -A a=(['google']='www.google.com' ['taobao']='www.taobao.copm')
echo ${a['google']}		#访问关联数组元素可以使用指定的键
------------------
www.google.com
  1. 用数字下表关联
declare -A b
b['sogou']='www.sogou.com'
b['baidu']='www.baidu.com'
b['weibo']='www.weibo.com'
echo ${b['weibo']}
-------------
www.weibo.com

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

declare -A a=(['google']='www.google.com' ['taobao']='www.taobao.copm')
echo ${#a[*]}
#或
echo ${#a[@]}
----------------
2
2

总结

本篇介绍了Shell编程的部分基础语法:

  1. 变量:如何定义、使用、删除变量。
    1. 特别注意:单引号内全部为字符串,引用的变量不能使用。
  2. 传递参数:接收外界参数,超过十位的要用{}括起来
  3. 字符串:输出字符串、获取字符串长度、截取字符串
    1. 字符串的截取分为两种:
      1. 从指定位置开始截取:其中又区分从左边开始计数还是从右边开始,但是不管从左边还是右边,截取方向都是从左向右
      2. 从指定字符(子字符串)开始截取:其中也区分截取字符串左边的(%str*)还是右边的(#*str)
  4. 数组:
    1. 定义数组的两种方式
    2. 定义关联数组的两种方式
    3. 获取数组中的值:访问关联数组元素可以使用指定的键
    4. 获取数组长度

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能基础三】卷积神经网络基础(CNN)

文章目录 1. 卷积神经网络结构2. 卷积神经网络计算2.1. 卷积层计算2.2. 池化层计算2.3. 全连接层计算 3. 典型卷积神经网络3.1. AlexNet3.2. VGGnet 卷积神经网络(Convolutional Neural Network,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Ne…

计算机毕业设计Python+Tensorflow股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

1、用pycharm打开项目,一定要打开包含manage.py文件所在文件夹 2、配置解释器:建议使用Anaconda(Python 3.8(base)),低于3.8版本的,页面会不兼容 3、安装依赖库:打开pycharm的终端,输入: pip in…

Docker-学习笔记(借助宝塔面板)

ubuntu环境 一、安装 可以参考官网进行或其他博客进行安装 1.进入宝塔面板 进图Docker菜单,查看是否提示安装。 2.查看是否安装 查看版本 docker -v 证明已经安装 二、常用命令 1.查看版本 docker -v 2.启动、停止、重启docker systemctl start docker…

自制安卓车机软件(含APP)

本软件使用APPinventor2编程软件,耗时5天和3天调试,具有高德导航,视频播放,网易云音乐,酷狗,抖音,(需下载车机版软件)和自定义添加软件,网页有哔哩哔哩&#…

无人机工程师技术高级证书详解

随着无人机技术的飞速发展,其在航拍、农业、测绘、救援、物流等多个领域的应用日益广泛,对无人机工程师的专业技能与综合素质提出了更高要求。无人机工程师技术高级证书,作为对无人机领域高级工程师专业技能的权威认证,不仅是对个…

简单搭建dns服务器

目录 一.安装服务 二.编写子配置文件 三.编写主配置文件 四.编写文件 五.测试 一.安装服务 [rootnode1 ~]# dnf install bind -y 二.编写子配置文件 [rootnode1 ~]# vim /etc/named.rfc1912.zones 三.编写主配置文件 [rootnode1 ~]# vim /etc/named.conf 四.编写文件 …

【Python】Numpy概述安装及使用

文章目录 Numpy概述Numpy开发环境搭建Numpy使用创建数组创建一维数组创建二维数组创建三维数组,array()函数ndmin参数的使用array()函数dtype参数的使用随机数创建 Numpy概述 Numpy是科学计算基础库,提供大量科学计算相关功能,比如数据统计&…

GuLi商城-商品服务-API-新增商品-调试会员等级相关接口

在网关服务中配置路由: 代码: nacos这些服务都要启动: 如果有不是一个命名空间中的,要改成同一个命名空间中 启动商品product服务遇到循环依赖问题,解决:

Leetcode 第 135 场双周赛题解

Leetcode 第 135 场双周赛题解 Leetcode 第 135 场双周赛题解题目1:3222. 求出硬币游戏的赢家思路代码复杂度分析 题目2:3223. 操作后字符串的最短长度思路代码复杂度分析 题目3:3224. 使差值相等的最少数组改动次数思路代码复杂度分析 题目4…

classical Chinese

classical Chinese 中型娃娃暑假作业背诵 文言文《伯牙鼓琴》 1)拿到文言文,先看一遍 2)用白话文(现代文)翻译一次 3)用白话文对照回去文言文(白话文中那些需要替换回文言文呢) 虽…

神奇海洋养鱼小程序游戏广告联盟流量主休闲小游戏源码

在海洋养鱼小程序中,饲料、任务系统、系统操作日志、签到、看广告、完成喂养、每日签到、系统公告、积分商城、界面设计、拼手气大转盘抽奖以及我的好友等功能共同构建了一个丰富而互动的游戏体验。以下是对这些功能的进一步扩展介绍: 饲料 任务奖励&a…

非对称加密:数据安全的双重保障

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

单元测试JUnit

前言👀~ 上一章我们介绍了自动化测试工具Selenium,今天讲解单元测试工具JUnit JUnit JUnit的使用 JUnit注解 BeforeAll和AfterAll注解 BeforeEach和AfterEach注解 参数化 方法获取参数(动态参数) 断言 用例执行顺序 测…

MATLAB优化模型(3)

一、前言 在MATLAB中处理各种优化问题,如背包问题、指派问题(也称为分配问题)、抽屉原理应用、旅行商问题(TSP)以及排队论模型,通常需要结合MATLAB的优化工具箱(如Optimization Toolbox&#xf…

MTK Android12 分析system_app允许vendor_mtk_audiohal_prop SELinux 权限问题

本文将尝试分析,在开发 Android 12 MTK 平台时遇到了 vendor_mtk_audiohal_prop 属性相关的 SELinux 权限问题。包括如何修改 SELinux 策略以允许 system_app 设置 vendor_mtk_audiohal_prop 属性。 问题描述 希望允许 system_app 设置 vendor_mtk_audiohal_prop 属…

C# Unity 面向对象补全计划 之 初识继承方法与多态

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列旨在通过补全学习之后,给出任意类图都能实现并做到逻辑上严丝合缝 1.继承方法 C# & Unity 面向对象补全计划 之 继承(字段与属性&…

如何在立创EDA的PCB电路板导入logo图案

1、首先制作好logo图案,一般为公司logo图标,如下图 2、打开立创EDA的PCB文件,如下图 3、将PCB的图层切换到丝印层: 4、然后选择EDA菜单栏的放置---图片: 5、进入后点击选择图片,将logo图片导入,…

Depth Anything——强大的单目深度估计模型

概述 单目深度估计(Monocular Depth Estimation, MDE)是一项在计算机视觉领域中非常重要的技术,它旨在从单张图像中恢复出场景的三维结构。这项技术对于机器人导航、自动驾驶汽车、增强现实(AR)和虚拟现实&#xff08…

在vscode中远程连接linux进行开发

目录 引言 配置过程 1.本机安装OpenSSH 2.本机生成RSA公钥和私钥 3.将rsa公钥添加到远程linux的authorized_keys文件中 4.vscode安装Remote - SSH插件 5.在vscode中ssh连接服务器 6.在本地vscode操作远程linux文件进行开发 7.在vscode上给远程linux机器需安装插件 常…

设计模式 之 —— 抽象工厂模式

目录 什么是抽象工厂模式? 定义 特点 抽象工厂模式(java代码示例) 首先定义第一个接口 实现第一个接口的类 定义第二个接口 实现第二个接口的类 * 创建抽象工厂类 创建扩展了 AbstractFactory 的工厂类 饮料工厂 食物工厂 * 创建一个…