Linux shell脚本-概述、语法定义、自定义变量、环境变量、预设变量、变量的特殊用法(转义字符、单双引号、大小括号)的验证

news2025/3/26 9:55:07

目录

1.shell概述

1.1作为应用程序:

1.2 shell 作为一门语言

2.shell 语法

2.1 shell脚本的定义与执行

(1)新建文件 

(2)程序开头第一行 必须写shell的类型 

(3)程序编写完后,修改文件权限

(4)执行脚本文件

2.2 shell变量

2.2.1自定义变量

2.2.2 环境变量

2.2.2.1临时设置环境变量

2.2.2.2永久设置环境变量

2.2.2.3多个常用环境变量调用

2.2.3预设变量

2.2.4 变量的特殊用法:" " ` ` ' ' \ () {}


1.shell概述

shell 的两层含义:
既是一种应用程序 , 又是一种程序设计语言

1.1作为应用程序:

交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能
称之为 shell 命令解析器。
shell 是用户和 Linux 内核之间的接口程序 , 用户在提示符下输入的命令都由 shell 先解释然后传给 Linux 核心,它调用了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行
Linux 系统中提供了好几种不同的 shell 命令解释器, sh ash bash 。一般默认使用 bash 作为默认的解 释器。 编写的 shell 脚本,都是由上述 shell 命令解释器解释执行的。
shell本质是对内核起到保护作用,只有shell能够识别的命令才能够直接操作内核来控制硬件。
调用执行过程:用户输入shell命令-》shell解析命令-》内核响应-》硬件响应
shell的调用框图如下所示:

1.2 shell 作为一门语言

它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支
完成类似于windows下批处理操作,简化我们对系统的管理与应用程序的部署 称之为shell
脚本。shell脚本是shell命令的有序集合。
shell脚本是一种脚本语言 ,我们只需使用任意文本编辑器,按照语法编写相应程序,增加
可执行权限,即可在安装shell命令解释器的环境下执行shell脚本。

2.shell 语法

2.1 shell脚本的定义与执行

(1)新建文件 

指定shell脚本文件,一般以.sh作为后缀名,也可以不加,例如:test.sh

(2)程序开头第一行 必须写shell的类型 

#!/bin/bash  

#  #!用于指定当前脚本文件的shell解释器的类型 (必须放在第一行),
#  如果不写,则用默认的shell
#  这是一个注释       # 注释以 `#` 开头

#shell脚本是shell命令的有序集合,代码的构成就是命令

(3)程序编写完后,修改文件权限

chmod +x test.sh  # 给test.sh加上可执行权限

chmod 777 test.sh # test.sh可读可写可执行

(4)执行脚本文件

法1:
./test.sh   # 赋予执行权限后运行
法2:
bash test.sh (这种方式不需要修改文件权限)

2.2 shell变量

2.2.1自定义变量

(1)定义变量: num=1    #注意:变量等号两端不能有空格

#变量名只能包含英文字母下划线,不能以数字开头

(2)引用变量:num1=$num   #  新变量=$旧变量名   注意:变量等号两端不能有空格

(3)输出变量:echo $num # 输出num变量的值 

        echo "Hello World" # 输出文本

等号两边不能直接接空格符,若变量中本身就包含了空格,则 整个字符串都要用双引号 、或单引号括起来;双 引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。

(4)清除变量:unset num #清除变量

(5)变量的其它用法:

read string
从键盘输入一个字符串付给变量 string
readonly var=100
定义一个只读变量 , 只能在定义时初始化 , 以后不能改变 , 不能被清除。
export var=300
使用 export 说明的变量,会被导出为环境变量,其它 shell 均可使用
程序:
#!/bin/bash  # 指定shell解释器(必须放在第一行)

#定义变量
#shell脚本中没有数据类型可言,所以定义变量时不需要加数据类型
#shell脚本中,赋值操作时不能在等号两边加空格
#NUM = 1 #错误
NUM=6

#引用变量
# $变量名 取一个变量的值
i=$NUM

#输出变量
echo "NUM:"
echo $NUM
echo "i:"
echo $i

#清除变量
unset NUM
echo "*************"
echo $NUM

echo "开始 输入 str"
#使用read从终端读取数据保存在变量中
read str
echo "str = $str"

#使用readonly创建一个只读的变量
readonly n=888
echo "n = $n"

#指定变量初始化后不能再次修改变量的值,只能使用
#n=666
#echo "n = $n"

运行结果: 注意该shell程序执行,需要有可执行权限。

程序改权限:chmod 777 xx.sh # xx.sh可读可写可执行

2.2.2 环境变量

shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,我们在shell中可以直
接使用$name引用。
定义:
一般在~/.bashrc或/etc/profile文件中(系统自动调用的脚本)使用 export设置 ,允许 用户后来更改。 传统上,所有环境变量均为大写。
显示环境变量
使用 env 命令可以查看所有的环境变量。
清除环境变量
使用 unset 命令清除环境变量
常见环境变量:
HOME :用于保存注册目录的完全路径名。
PATH :用于保存用冒号分隔的目录路径名, shell 将按 PATH 变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
PATH=$HOME/bin:/bin:/usr/bin;export PATH
HOSTNAME :主机名
SHELL :默认的 shell 命令解析器
LOGNAME :此变量保存登录名
PWD :当前工作目录的绝对路径名
2.2.2.1临时设置环境变量
在终端执行命令
MY_SHELL_NUM=999
export MY_SHELL_NUM
运行结果:
(1) 使用 env 命令可以查看所有的环境变量
(2)使用echo输出该变量结果
2.2.2.2永久设置环境变量
需要在配置文件(~/.bashrc或/etc/profile)中进行设置即可,设置完毕后需要通过
source 命令配置文件 立即生效 或 重新打开系统。
一般环境变量类似c语言中的全局变量,可以在shell脚本文件中任意使用。
以  ~/.bashrc 为例:
(1)打开文件: vi ~/.bashrc 
(2)末尾加入环境变量:
        MY_SHELL_NUM1=888
         export MY_SHELL_NUM1
(3)保存退出,在终端执行:source ~/.bashrc
(4)执行 env 命令,查看结果,或执行 echo $ MY_SHELL_NUM1
2.2.2.3多个常用环境变量调用

程序:

#!/bin/bash

#PATH=$HOME/bin:/bin:/usr/bin;export PATH

echo "You are welcome to use bash"
echo "Current work dirctory is $PWD"
echo "the host name is  $HOSTNAME"
echo "your home dir  $HOME"
echo "Your shell is  $SHELL"
echo "user env val is $MY_SHELL_NUM1"
echo "系统路径: $PATH"
echo "---系统路径:--- "
echo $PATH | tr ':' '\n'  # 按行显示,更易读

运行结果:

2.2.3预设变量

$# :传给 shell 脚本参数的数量
$* :传给 shell 脚本参数的内容
$1 $2 $3 ... $9 :运行脚本时传递给其的参数, 用空格隔开
$? :命令执行后返回的状态
"$?" 用于检查上一个命令执行是否正确 ( Linux 中,命令退出状态为 0 表示该命令正确 执行,任何非 0 值表示命
令出错 )
$0:当前执行的进程名  #  xx.sh
$$ :当前进程的进程号
"$$" 变量最常见的用途是用作临时文件的名字以保证临时文件不会重复
程序:
#! /bin/bash

# 其中\为转义字符,让$0输入为字符,而不作为变量
#位置变量$0 - $9 保存从终端输入的每一个参数
echo "\$0 = $0" 
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$4 = $4"
echo "\$5 = $5"
echo "\$6 = $6"
echo "\$7 = $7"
echo "\$8 = $8"
echo "\$9 = $9"
#如果超过9,需要加大括号
echo "\$10 = ${10}"
echo "\$11 = ${11}"

echo " 传入的参数的个数,不包括\$0"
#$#:保存命令行传入的参数的个数,不包括$0
echo "\$# = $#"

echo " 传入的参数的原内容,不包括\$0"
#$@或者$*:保存所有的命令行传入的参数,但是不包括$0
echo "\$@ = $@"
echo "\$* = $*"

echo " 当前进程的进程号"
#$$:获取当前进程的进程号
echo "\$$ = $$"
#read NUM # 加入这个为了,再开一个终端验证进程号是否正确

echo "执行ls获取当前目录下的内容,执行成功,则\$?的值为0,执行失败,则为非0"
# $? 返回上一个命令执行的结果,如果执行成功,则$?的值为0,执行失败,则为非0
ls
echo "\$? = $?"

ls ABC
echo "\$? = $?"

运行结果:

2.2.4 变量的特殊用法:" " ` ` ' ' \ () {}

(1)""(双引号):包含的 变量输出变量值
(2)''(单引号):包含的变量会当做字符串解释,保持原样输出。
(3)``(数字键1左面的反引号): 反引号中的内容作为系统命令,并执行其内容 ,可以替换输出为
一个变量。
(4)\ 转义字符:
同c语言 \n \t \r \a等 echo命令需加 -e转义
(5)(命令序列): 由子shell来完成, 不影响当前shell中的变量
{ 命令序列 }: 在当前shell中执行, 会影响当前变量
程序:
#!/bin/bash

name="ASD"
#双引号里面的特殊字符,会使用其特殊含义
string1="good moring $name"
#单引号里面的特殊字符,都会失去特殊含义,保持原样输出
string2='good moring $name'

echo $string1
echo $string2

echo " pwd 引号 测试 "
#反引号:获取一个shell命令的输出结果,一般对有输出结果的命令经常去使用,
#也可以使用$()与反引号等价
echo "My dir is pwd"
echo "My dir is `pwd`"
echo 'My dir is `pwd`'
echo "My dir is $(pwd)" # 与echo "My dir is `pwd`"  等价

echo " 转义字符 测试 "
#转义字符:使用时,需要在echo后面加上-e选项
echo "this \n is\ta\ntest"  #保持原样输出
echo -e "this \n is\ta\ntest"

echo " () {} 测试 "
num=333
#由 子shell 来完成,不影响当前shell中的变量
( num=999;echo "num1 $num" )
echo num1:$num

#在 当前shell 中执行,会影响当前变量
{ num=666; echo "num2 $num"; }
echo num2:$num

运行结果:

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

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

相关文章

数据驱动进化:AI Agent如何重构手机交互范式?

如果说AIGC拉开了内容生成的序幕,那么AI Agent则标志着AI从“工具”向“助手”的跨越式进化。它不再是简单的问答机器,而是一个能够感知环境、规划任务并自主执行的智能体,更像是虚拟世界中的“全能员工”。 正如行业所热议的:“大…

DL学习笔记:穿戴设备上的轻量级人体活动识别方法

Hello,大家好!这里是《Dream 的深度学习笔记》,本系列将聚焦三个学习方面: 论文解读:拆解经典论文与最新突破 技术实现:从模型搭建到实际部署 应用案例:涵盖图像识别、深度学习、人工智能等热门方向 让…

windows安装配置FFmpeg教程

1.先访问官网:https://www.gyan.dev/ffmpeg/builds/ 2.选择安装包Windows builds from gyan.dev 3. 下滑找到release bulids部分,选择ffmpeg-7.0.2-essentials_build.zip 4. 然后解压将bin目录添加path系统变量:\ffmpeg-7.0.2-essentials_bui…

Qt/C++项目积累:4.远程升级工具 - 4.1 项目设想

背景: 桌面程序一般都支持远程升级,也是比较常用的场景设计。如酷狗音乐的升级,会提供两个选项,自动帮助安装或是新版本提醒,由用户来决定是否升级,都属于远程升级的应用及策略。 看看经过这块的功能了解及…

同旺科技USB to SPI 适配器 ---- 指令循环发送功能

所需设备: 内附链接 1、同旺科技USB to SPI 适配器 1、周期性的指令一次输入,即可以使用 “单次发送” 功能,也可以使用 “循环发送” 功能,大大减轻发送指令的编辑效率; 2、 “单次发送” 功能,“发送数据…

单表达式倒计时工具:datetime的极度优雅(Kimi)

一个简单表达式,也可以优雅自成工具。 笔记模板由python脚本于2025-03-22 20:25:49创建,本篇笔记适合任意喜欢学习的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 Pyth…

Linux:基础IO---文件描述符

文章目录 1. 前言1.1 C语言文件知识回顾 2. 文件2.1 文件基础知识 3. 被打开的文件3.1 以C语言为主,先回忆一下C文件接口3.2 过渡到系统,认识文件系统调用3.3 访问文件的本质3.4 重定向&&缓冲区 序:在深入了解了进程的内容后&#xf…

LINUX基础 [二] - 进程概念

目录 前言 什么是进程 如何管理进程 描述进程 组织进程 如何查看进程 通过 ps 命令查看进程 通过 ls / proc 命令查看进程 通过系统调用 获取进程标示符 前言 在学习了【Linux系统编程】中的 ​ 操作系统 和 冯诺依曼体系结构 之后,我们已经对系统应该有…

浏览器自动携带cookie注意事项

文章目录 浏览器自动携带与目标域相关的 cookie 是由 HTTP 协议规范和浏览器设计共同决定的一、Cookie 携带的基本规则同源策略下的自动携带跨域请求的受限携带一、服务器端配置二、客户端配置三、 常见错误及注意事项 二、Cookie 属性的筛选逻辑 三、浏览器携带cookie的准则1.…

同旺科技USB to I2C 适配器 ---- 指令循环发送功能

所需设备: 内附链接 1、同旺科技USB to I2C 适配器 1、周期性的指令一次输入,即可以使用 “单次发送” 功能,也可以使用 “循环发送” 功能,大大减轻发送指令的编辑效率; 2、 “单次发送” 功能,“发送数据…

关于VSCode使用过程中的一些问题记录(持续更新)

1. VSCode更新拒绝访问 VSCode安装更新的时候出现: D:\Program Files\Microsoft VS Code\tools\inno_updater.exe 尝试在目标目录创建文件时发生一个错误:拒绝访问。 解决方法: 1. 禁止VSCode的自动检查更新,操作方法&#xff…

重新复活的(手机端)一站式应用管理与下载平台

应用乐园(安卓) 应用乐园作者去年3月表示,由于精力问题,要停止维护奇妙搜索、应用乐园、奇妙影视这些软件了。 然而最近,令人意外的是,应用乐园竟然“复活”了!更准确地说,它进行了…

Vue3前端开发:组件化设计与状态管理

Vue3前端开发:组件化设计与状态管理 一、Vue3组件化设计 组件基本概念与特点 是一款流行的JavaScript框架,它支持组件化设计,这意味着我们可以将页面分解成多个独立的组件,每个组件负责一部分功能,通过组件的嵌套和复用…

失物招领|校园失物招领系统|基于Springboot的校园失物招领系统设计与实现(源码+数据库+文档)

校园失物招领系统目录 目录 基于Springboot的校园失物招领系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、 管理员功能实现 (1) 失物招领管理 (2) 寻物启事管理 (3) 公告管理 (4) 公告类型管理 2、用户功能实现 (1) 失物招领 (2) 寻物启事 (3) 公告 …

Pear Admin Flask 开发问题

下载代码请复制以下命令到终端执行 git clone https://gitee.com/pear-admin/pear-admin-flask 于是我下载git 完成安装后: 安装 Git 后出现的页面是 “Git for Windows 的版本发布说明(Release Notes)”,通常会在安装完成后自动弹…

1996-2023年各省公路里程数据(无缺失)

1996-2023年各省公路里程数据(无缺失) 1、时间:1996-2023年 2、来源:国家统计局、统计年鉴 3、指标:公路里程(万公里) 4、范围:31省 5、指标解释:公路里程指报告期末…

量化研究---可转债量化交易系统上线快速服务器

现在可转债交易系统使用的人多,服务器比较小,今天对服务器进行了升级,提供快速的数据支持,同时我也给了服务器的源代码,支持自定义服务器数据支持,不通过我服务器,可以挂在服务器上面24小时快速…

用ArcGIS做一张符合环评要求的植被类型图

植被类型图是环境影响评价(环评)中的重要图件,需满足数据准确性、制图规范性和信息完整性等要求。本教程将基于ArcMap平台,从数据准备到成果输出,详细讲解如何制作符合环评技术规范的植被类型图。 ArcGIS遥感解译土地…

Java 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]

集合 关系 介绍 Deque 是一个接口 LinkedList 是这个接口的实现类 题目 输入输出 滑动窗口 基于双端队列实现 Deque<Integer> deque new LinkedList<>(); 滑动窗口代码 洛谷 public static List<Integer> maxSlidingWindow(int[] nums, int k) {List&l…

[学习笔记] VM虚拟机安装Ubuntu系统

前言 我现在装的Ubuntu总是死机&#xff0c;经常黑屏&#xff0c;所以我决定换个版本&#xff0c;顺便写一下笔记&#xff0c;给大家分享如何安装虚拟机 下载 这里我选择的是Ubuntu 22.04.5 LTS&#xff0c;下载链接&#xff1a;Ubuntu 22.04.5 LTS 如果访问不了网站的话&…