SHELL笔记(概念+变量)

shell 概念

Shell 是一个命令行解释器,它充当用户与操作系统内核之间的桥梁。用户在 Shell 环境下输入各种命令,Shell 负责接收并分析这些命令,然后将其转换为内核能够理解和执行的系统调用。通过这种方式,用户可以便捷地操作计算机系统,完成诸如文件和目录操作、进程管理、系统配置、网络管理等一系列复杂的任务。

常见的 Shell 类型众多,其中 Bourne Shell(sh)是早期 UNIX 系统广泛使用的一种 Shell;C Shell(csh)在语法上与 C 语言有相似之处,具有独特的交互特性;Korn Shell(ksh)综合了其他 Shell 的优点;而 Bash(Bourne Again Shell)是目前大多数 Linux 系统默认的 Shell,它继承了 Bourne Shell 的语法,同时融合了其他 Shell 的优秀特性,功能强大且应用广泛。

shell 编写规范

  1. 首行声明
    Shell 脚本的首行用于指定脚本的解释器。对于 Bash 脚本,通常使用#!/bin/bash。这一行至关重要,它告诉操作系统使用何种解释器来执行后续的脚本内容。如果是其他类型的 Shell 脚本,如使用 Python 作为解释器的脚本,首行可能是#!/usr/bin/python(具体路径根据系统实际安装情况而定)。

  2. 注释
    注释是提高脚本可读性的关键因素。在 Shell 脚本中,使用#来添加注释。注释可以出现在脚本的任何位置,用于解释脚本的功能、某一行或某一块代码的作用、变量的含义等。例如:

# This is a simple shell script to print "Hello, World!"
echo "Hello, World!"

多行注释可以使用以下方式:

:<<'xxxx'
comment1
comment2
comment3
……
xxxx
  1. 命名规范

    • 变量命名:变量名应具有清晰的含义,便于理解代码。一般采用小写字母和下划线组合的方式,例如user_namefile_path等。避免使用无意义或容易混淆的名称。
    • 函数命名:函数名同样需要遵循清晰易懂的原则,能够准确反映函数的功能。例如print_usagecalculate_sum等。
  2. 代码缩进
    虽然 Shell 脚本对缩进没有严格的语法要求,但为了提高代码的可读性,建议使用统一的缩进风格。通常可以使用四个空格或者一个制表符进行缩进,特别是在代码块结构(如if - else语句、for循环、while循环、函数定义等)中。例如:

if [ $condition ]; thenaction1action2
elseaction3
fi
  1. 语句分隔
    在 Shell 中,每条语句默认以换行符作为结束标志。不过,也可以在同一行中编写多条语句,此时需要使用分号;来分隔不同的语句。但为了保持代码的清晰性,尽量避免在一行中编写过多复杂的语句。例如:
command1; command2; command3

 

shell 变量

  1. 变量定义
    在 Shell 中,定义变量无需事先声明类型。变量的定义形式为变量名 = 值,注意等号两边不能有空格(除非值本身包含空格,此时需要用引号将值括起来)。例如:
var1=10
var2="hello world"
var3=$var1$var2

这里var1被赋值为数字 10,var2被赋值为字符串 “hello world”,var3则是将var1var2的值连接起来。

  1. 变量引用
    要使用变量的值,在变量名前加$符号。例如,如果定义了name="Alice",那么echo $name会输出 “Alice”。当变量名与其他字符连接时,为了避免歧义,可以使用${变量名}的形式。例如:
prefix="pre"
suffix="fix"
echo "${prefix}_${suffix}"

这会出 “pre_fix”。

  1. 环境变量
    环境变量是一种特殊的变量,它在整个系统环境中都有效,可以被系统中所有的进程访问。可以使用export命令来创建或修改环境变量。例如,要将一个新的目录添加到PATH环境变量中(PATH用于指定系统查找可执行文件的路径),可以使用以下命令:
export PATH=$PATH:/new/directory

一些常见的环境变量包括:

  • PATH:决定了 Shell 在哪些目录中搜索用户输入的命令对应的可执行文件
  • HOME:当前用户的主目录。
  • USER:当前用户名。
  • SHELL:当前使用的 Shell 的路径。
  1. 局部变量和全局变量
    • 局部变量在函数内部定义的变量通常是局部变量,其作用域仅限于该函数内部。例如:
function my_function() {local local_var="local value"echo $local_var
}
my_function
echo $local_var # 这里会报错,因为local_var在函数外部不可见
  • 全局变量在函数外部定义的变量一般是全局变量,可以在整个脚本中访问(包括函数内部)。但是,如果在函数内部对全局变量重新赋值,需要使用global关键字(在某些 Shell 中)或者通过export命令(在 Bash 中)来声明其为全局变量。例如:
global_var="global value"
function modify_global_var() {global_var="new global value"echo $global_var
}
modify_global_var
echo $global_var
  1. 特殊变量
    Shell 中有一些特殊变量,它们具有特定的含义和用途:
    • $0:代表脚本的名称。
    • $1$2...$n:分别代表传递给脚本的第 1 个、第 2 个、...、第 n 个参数。例如,如果脚本test.sh的内容为echo $1,执行./test.sh argument1会输出 “argument1”。
    • $#:表示传递给脚本的参数个数。
    • $@:代表所有参数的列表(以空格分隔),常用于遍历所有参数。
    • $*:也是所有参数的列表,但将所有参数视为一个整体。
    • $$:当前脚本的进程 ID。
    • $?:上一个命令的退出状态,0 表示命令执行成功,非 0 表示命令执行失败。例如:
ls non_existent_file
echo $? # 这里会输出非0的值,因为ls命令查找不存在的文件会失败

 

  • shell 环境变量存储的文件:

    • bash shell 初始化文件有:/etc/profile、 ~/.bash_profile、 ~/.bash_login、 ~/.profile、 ~/.bashrc、/etc/bashrc

    • 如图:

    • image-20230130154156590

    • /etc/profile :存放一些全局(共有)变量,不管哪个用户,登录时都会读取该文件。通常设置一些Shell变量PATH,USER,HOSTNAME和HISTSIZE等

    • ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次,默认情况下,此文件通过脚本执行同目录下用户的.bashrc文件

    • ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取

    • /etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取

    • /etc/inputrc文件为特定的情况处理键盘映射

    • 执行顺序:/etc/profile-->/etc/profile.d/*.sh--> ~/.bash_profile -->/etc/bashrc-->~./.bashrc

    • 结论:

      • 对于用户的环境变量设置,常见的是用户家目录下的.bashrc和.bash_profile

      • 对于全局环境变量设置,常见的文件有:/etc/profile /etc/bashrc /etc/profile.d 这三个配置文件,常用方法是直接在/etc/profile文件中写入全局变量,如果想要在登陆后初始化或者显示加载的内容,只需要把脚本文件放在 /etc/profile.d 文件下即可

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

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

相关文章

统信UOS开发环境支持Golang

UOS为Golang开发者提供了各种编辑器和工具链的支持,助力开发者实现高质量应用的开发。 文章目录 一、环境部署Golang开发环境安装二、代码示例Golang开发案例三、常见问题1. 包导入错误2. 系统资源限制一、环境部署 Golang开发环境安装 golang开发环境安装步骤如下: 1)安装…

web前端开发--盒子属性

1、设置背景图像固定 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>设置背景图像固定</title><style type"text/css">/*p{background-attachment: scroll;/*fixed固定*//*随元素滚动还是固定*/}&…

Python数据分析NumPy和pandas(三十五、时间序列数据基础)

时间序列数据是许多不同领域的结构化数据的重要形式&#xff0c;例如金融、经济、生态学、神经科学和物理学。在许多时间点重复记录的任何内容都会形成一个时间序列。许多时间序列是固定频率的&#xff0c;也就是说&#xff0c;数据点根据某些规则定期出现&#xff0c;例如每 1…

前端开发之打印功的使用和实例(vue-print-nb)

通过插件来进行实现 前言效果图1、安装插件vue2vue32、 引入Vue项目2、 使用2.1、在项目中创建按钮并且使用v-print绑定绑定打印事件2.2、编写要打印的内容,给内容附加唯一的id2.3、绑定的时间的方法和参数3、整体代码(此代码是通过vue3来进行实现的但是逻辑都是一样的)前言…

使用Web Animations API实现复杂的网页动画效果

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂…

分享一个mysql-sql优化经验 in (xxx)的优化【 in(集合)改成not in(反集合) 】

一、优化前 如下sql&#xff0c;直接执行时间需要18.341秒 二、优化后 将 in(集合) 改成 not in(反集合)&#xff0c;如下图&#xff0c;执行性能提升至少4倍&#xff0c;需要4.643秒&#xff0c;并且查询结果不变 三、原因分析 为什么速度会变快那么多&#xff1f; in (集…

传感器页面、屏幕刷新任务学习

一、user_SensorPageTask 传感器页任务 ​ /* Private includes -----------------------------------------------------------*/ //includes #include "user_TasksInit.h" #include "user_ScrRenewTask.h" #include "user_SensorPageTask.h" …

BigQuery中jobUser和dataViewer的角色有什么不同

真题实战 Scenario: Your company utilizes BigQuery as the enterprise data warehouse, with data spread across multiple Google Cloud projects. Queries on BigQuery must be billed to a specific project, separate from where the data resides. Users should have q…

AWTK-WIDGET-WEB-VIEW 实现笔记 (3) - MacOS

MacOS 上实现 AWTK-WIDGET-WEB-VIEW 有点麻烦&#xff0c;主要原因是没有一个简单的办法将一个 WebView 嵌入到一个窗口中。所以&#xff0c;我们只能通过创建一个独立的窗口来实现。 1. 创建窗口 我对 Object-C 不熟悉&#xff0c;也不熟悉 Cocoa 框架&#xff0c;在 ChatGPT…

fiddler抓包24_App流量统计

​课程大纲 使用Fiddler可以实现“APP流量统计”功能。具体操作如下&#xff1a; ① 选中app所有请求&#xff0c;点击右侧菜单标签“Statistics”。 ② 查看请求统计数据&#xff0c;即APP流量统计&#xff1a;“Bytes Sent”&#xff08;发送的字节数&#xff09;、“Bytes R…

小白投资理财 - 解读 CCI

小白投资理财 - 解读 CCI 什么是 CCICCI 计算方法CCI 指标的使用首先超买和超卖接下来是背离 CCI 缺点总结 顺着河流能够渡河&#xff0c;逆向河流只会挂彩&#xff0c;今天就来了解一下 CCI&#xff08;Commodity Channel lndex&#xff09;中文称之为顺势指标 什么是 CCI 它…

2024 RISC-V中国峰会 安全相关议题汇总

安全之安全(security)博客目录导读 第四届 RISC-V 中国峰会&#xff08;RISC-V Summit China 2024&#xff09;于8月21日至23日在杭州成功举办。此次峰会汇聚了 RISC-V 国际基金会、百余家重点企业及研究机构&#xff0c;约3000人线下参与&#xff0c;并在19日至25日间举办了超…

Linux守护Pythom脚本运行——Supervisor学习总结

Supervisor能做什么&#xff1f; 在工作中有时会遇到在Linux服务器上编写各种脚本来实现日志的推送、数据的传输、流量的监控等&#xff0c;这些脚本在整个系统运行中也需要和其他服务端应用程序一样持续且稳定运行&#xff0c;为了达到这种目的就需要使用进程守护工具来对正在…

机器学习基础05_随机森林线性回归

一、随机森林 机器学习中有一种大类叫集成学习&#xff08;Ensemble Learning&#xff09;&#xff0c;集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。集成算法大致可以分为&#xff1a;Bagging&#xff0c;Boosting 和 Stacking…

leetcode-44-通配符匹配

题解&#xff1a; 代码&#xff1a; 参考&#xff1a; (1)牛客华为机试HJ71字符串通配符 (2)leetcode-10-正则表达式匹配

C++类和对象介绍

目录 一、类的创建 二、访问权限 三、struct与class 四、类域 五、类的大小 一、类的创建 C中【class】为定义类的关键字&#xff0c;【{}】中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略。一般来说&#xff0c;类规范由两部分组成&#xff1a; 类的声明&…

【自学笔记】推荐系统

文章目录 引入一些记号原理 协同过滤算法使用均值归一化 基于内容的推荐原理基于TensorFlow的代码 从大目录里推荐检索排名 引入 一些记号 记号含义其他 n n n总人数 m m m总样本数 k k k特征数 y i ( j ) y_{i}^{(j)} yi(j)​第 j j j个人对第 i i i个样本的评分 y i , j ∈ …

vue基础

1. vue是什么&#xff1f; Vue.js &#xff08;读音 /vju ː /, 类似于 view &#xff09; 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 官…

简单学点位运算(Java)

1. 位运算符 Java中常用的位运算符如下&#xff1a; 2. 详解 &#xff08;1&#xff09;按位与 & 规则&#xff1a;同一位上全是 1 时&#xff0c;结果为 1&#xff0c;否则为 0。用途&#xff1a; 清零某些位&#xff1a;x & 0xF0可以保留高 4 位&#xff0c;清除…

637. 二叉树的层平均值【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 637. 二叉树的层平均值 一、题目描述 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 二、测试用例 示例 1&a…