Linux基础入门 --12 DAY(SHELL脚本编程基础)

news2024/9/29 9:29:33

shell脚本编程

声明:首行shebang机制

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl

变量 

        变量类型 

        变量类型:

        内置变量 : 如 PS1 , PATH ,HISTSIZE

        用户自定义变量

        不同变量存放数据不同,决定了以下

        1.数据存储方式

        2.参与的运算

        3.表示的数据范围

        变量数据类型:

        1.字符

        2.数值:整型,浮点型,bash不支持浮点数

        变量的定义和引用:

        变量的生效范围等标准划分变量类型

        1.普通变量:生效范围当前shell进程,对当前shell之外的其它shell进程,包括当前shell进程的shell子进程均无效

        2.环境变量:生效范围为当前shell进程及其子进程

        3.本地变量:生效范围为当前shell进程的某代码片段.

        变量赋值

name=‘value’

        value可以是一下多种形式 

value=‘root’

value="$USER"

value=`COMMEND`  ||  value=$(COMMEND)

        范例:

[root@localhost ~]# name="
> love
> wtj
> zyf
> "
[root@localhost ~]# echo $name
love wtj zyf
[root@localhost ~]# echo "$name"

love
wtj
zyf

[root@localhost ~]# 

        注意:变量赋值时临时生效的,当退出终端后,变量会被删除,无法永久保存,脚本中的变量也会随着脚本的结束而结束. 

        变量引用

$name

${name} 

        弱引用:其中的变量会被替换为变量值.

        强引用: 其中的变量不会被替换为变量值,保持原字符串.

        范例:

[root@localhost ~]# love=wtj
[root@localhost ~]# lover='$love'
[root@localhost ~]# liker="$love"
[root@localhost ~]# echo $lover
$love
[root@localhost ~]# echo $liker
wtj 

        显示已定义的所有变量

set 

        范例:

[root@localhost ~]# set
ABRT_DEBUG_LOG=/dev/null
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
 

        删除变量

unset  name 

        示例:

[root@localhost ~]# echo $name
love wtj zyf
[root@localhost ~]# unset name
[root@localhost ~]# echo $name

[root@localhost ~]# 

        环境变量 

        环境变量可以使子进程继承父进程的变量,但是父进程无法继承子进程,同时一旦子进程修改变量,则子进程会将新定义的变量赋值给孙子进程.

        变量声明和赋值

export name=lover

declare -x name=lover

OR

name=lover

export name

        变量引用

$name

${name} 

        显示所有环境变量

env

printenv

export

declare -x

        删除变量

unset name 

        bash内创建的环境变量

PATH 

SHELL

USER

UID

HOME

PWD

SHLVL

_        表示前一个命令的最后一个参数

        只读变量 

        只读变量:只能声明定义,但后续不能修改删除

        声明只读变量:

readonly name

declcare -r name

        查看只读变量

readonly [ -p ]

declare -r 

        位置变量 

        位置变量:在bash shell中的内置变量,在脚本代码中调用通过命令行传递给脚本的参数

$1,$2.... 对应第1个,第2个等参数,shift [n] 换位置

$0 命令本身,包括路径

$* 传递给脚本的所有参数,全部参数合为一个字符串

$@ 传递给脚本的所有参数,每个参数为独立字符串

$# 传递给脚本的参数的个数

注意:$a $* 只在被双引号包起来的时候才会有差异 

        清空所所有位置变量

set -- 

        退出状态码变量 

$?的值为0        代表成功

$?的值为1-255 代表失败

        范例:

[root@localhost ~]# ls
anaconda-ks.cfg  original-ks.cfg
[root@localhost ~]# echo $?
0
[root@localhost ~]# aa
bash: aa: command not found...
[root@localhost ~]# echo $?
127 

        用户可以在脚本中使用以下命令自定义退出状态码

exit [ n ] 

        注意:

        1.脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态码取决于exit命令后面的数字

        2.如果为给脚本指定退出状态码,整个脚本退出状态码取决于脚本中执行的最后一条命令状态 

        展开命令执行

        展开命令执行顺序

把命令分成单个单词

展开别名

展开大括号的声明{ }

展开波浪符声明~

命令替换$()和``

把命令行分成命令词

展开文件通配*,?, [abc]等

准备I/O重定向 < , >

运行命令

         防止扩展

反斜线(\)会使后面的字符按照原意进行解释

        范例:

[root@localhost ~]# echo \$name
$name 

        加引号来防止扩展

单引号可以防止所有扩展

双引号也可以防止扩展,但是以下情况例外:$USER 

        变量扩展

`` :  命令替换

\  :  禁止单个字符扩展 

!:历史命令替换

        脚本安全和set 

        $-

[root@localhost ~]# echo $-
himBH

h: hashall - 启用哈希表功能,使得命令查找更快。
i: interactive - 表示这是一个交互式 shell。
m: monitor - 启用作业控制。
B: braceexpand - 启用大括号扩展。
H: histexpand - 启用历史扩展(例如 ! 符号的使用)。

        set

set命令是Linux系统中常用的一个命令,主要用于设置或显示shell环境变量以及控制shell的行为。以下是对set命令的详细解释:

一、基本用法

  1. 显示环境变量
    • 不带任何参数运行set命令时,它会显示当前shell会话中的所有环境变量及其值。这对于调试和查看当前设置的环境变量非常有用。
  2. 设置环境变量
    • 可以通过set 变量名=值的形式来设置环境变量。但需要注意的是,通过这种方式设置的环境变量只在当前shell会话中有效,并不会影响到其他shell会话或子shell。
    • 如果想要让环境变量在所有shell会话中持久生效,需要将set命令(实际上是export命令,因为set命令本身不用于持久化环境变量)写入用户的配置文件中,如~/.bashrc~/.bash_profile

二、常用选项

set命令还提供了多个选项,用于控制shell的行为:

  • -a:将当前环境中定义的变量导出为环境变量。
  • -b:启用或禁用脚本的历史记录功能(在某些shell版本中可能不适用)。
  • -C:启用或禁用shell调用命令时的大小写敏感(在某些shell版本中可能不适用)。
  • -e:如果命令执行出错,则立即退出shell。这对于脚本的错误处理非常有用。
  • -f:禁用文件名扩展(即通配符扩展)。
  • -h:显示set命令的帮助信息(在某些shell版本中可能不适用,通常使用man sethelp set查看帮助)。
  • -i:将shell设置为交互模式,通常用于登录shell。
  • -n:将shell设置为非交互模式,通常用于执行脚本。在这种模式下,读取命令但不执行它们(仅用于语法检查)。
  • -o:显示当前shell的选项设置。
  • -p:显示当前环境中定义的所有变量。
  • -u:如果使用未定义的变量,则显示错误信息并退出shell。这有助于避免由于错误的环境变量导致的问题。
  • -v:显示每次执行的命令及其参数(但通常用于显示输入值,而不是命令本身)。
  • -x:在执行命令之前,打印出该命令及其参数。这对于调试脚本非常有用。

三、注意事项

  • set命令本身并不用于定义新的shell变量(尽管它可以用来设置环境变量的值)。定义新的shell变量通常使用declarelocal(在函数内部)命令。
  • set命令设置的环境变量只在当前shell会话中有效,除非使用export命令将其导出为环境变量,或者将其写入用户的配置文件中以持久化。
  • set命令的某些选项和行为可能因不同的shell(如Bash、Zsh等)而有所不同。因此,在使用时最好参考特定shell的文档。

        示例:

[root@localhost ~]# set -o
allexport          off
braceexpand        on
emacs              on
errexit            off
errtrace           off
functrace          off
hashall            on
histexpand         on
history            on
ignoreeof          off
interactive-comments    on
keyword            off
monitor            on
noclobber          off
noexec             off
noglob             off
nolog              off
notify             off
nounset            off
onecmd             off
physical           off
pipefail           off
posix              off
privileged         off
verbose            off
vi                 off
xtrace             off 

printf

Linux中的printf命令是一个功能强大的格式化输出命令,它模仿了C语言中的printf()函数,用于将指定的字符串、变量、表达式等按照一定的格式输出到终端或文件中。以下是printf命令的详细解析:

基本语法

printf命令的基本语法为:

printf format-string [arguments...]
  • format-string:格式化字符串,使用引号括起来,可以包含普通字符和格式控制符。格式控制符以百分号(%)开头,后面跟一个或多个控制字符,用于指定输出的格式。
  • arguments:可选参数,用于填充格式字符串中的格式控制符。参数的个数和类型应与格式控制符相匹配。

格式控制符

  • printf命令支持多种格式控制符,用于控制不同类型数据的输出格式。以下是一些常见的格式控制符:

  • %d%i:按照有符号十进制整数格式打印参数。
  • %u:按照无符号十进制整数格式打印参数。
  • %o:按照八进制格式打印参数。
  • %x%X:按照十六进制格式打印参数,分别表示小写和大写字母。
  • %f%F:按照浮点数格式打印参数。
  • %e%E:按照科学计数法格式打印参数,分别表示小写和大写字母。
  • %g%G:根据数值大小自动选择%f%e的格式。
  • %c:按照字符格式打印参数。
  • %s:按照字符串格式打印参数。
  • %p:以指针的格式输出参数,通常用来输出内存地址。

特殊转义字符

  • 除了基本的格式控制符外,printf还支持一些特殊的转义字符,用于控制输出的格式,如:

  • \n:换行符。
  • \t:制表符。
  • \\:反斜杠。
  • \r:回车。
  • \b:退格。
  • \a:响铃。
  • \f:换页。
  • \v:垂直制表符。

常用选项和参数

  • printf命令还提供了一些选项和参数,用于控制输出的宽度、对齐方式等,如:

  • %nd:指定输出的最小宽度为n,如果实际输出的宽度小于n,则左侧填充空格(右对齐)。
  • %-nd:指定输出的最小宽度为n,如果实际输出的宽度小于n,则右侧填充空格(左对齐)。
  • %0nd:指定输出的最小宽度为n,如果实际输出的宽度小于n,则左侧填充零。
  • %.nf:指定输出的浮点数精度为n,即小数点后保留n位数字。

        示例:

[root@localhost ~]# printf "%X\n" 16
10
[root@localhost ~]# 
[root@localhost ~]# printf "%s %s\n" 1 2 3 4 
1 2
3 4
[root@localhost ~]# printf '('')
> ^C
[root@localhost ~]# printf "(%s)\n" 1 2 3 4
(1)
(2)
(3)
(4)  

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

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

相关文章

每日一练 2024.9.29(2)

目录 解题思路与代码实现 题目分析 一、解题策略 关键步骤&#xff1a; 二、代码实现 三、代码解析 四、复杂度分析 五、运行示例 示例1&#xff1a; 示例2&#xff1a; 六、总结 解题思路与代码实现 题目分析 这道题目要求我们找到字符串列表 strs 中的相似字符组…

Arch - 架构安全性_验证(Verification)

文章目录 OverView导图1. 引言&#xff1a;数据验证的重要性概述2. 数据验证的基本概念3. 数据验证的层次前端验证后端验证 4. 数据验证的标准做法5. 自定义校验注解6. 校验结果的处理7. 性能考虑与副作用8. 小结 OverView 即使只限定在“软件架构设计”这个语境下&#xff0c…

物理学基础精解【40】

文章目录 矢量积矢量积&#xff08;又称叉积、外积&#xff09;的几何意义一、面积表示二、垂直性三、方向性四、应用实例五、数学表达 矢量积&#xff08;叉积&#xff09;的坐标表示法矢量积的坐标表示法的几何意义矢量积的性质矢量积的应用 矢量积&#xff08;又称叉积、外积…

Linux——k8s组件

kubernetes 使用1.31.1 版本搭建集群核心组件&#xff0c;选择flannel 网络插件为整体集群的运行提供网络通信功能。 flannel 网络插件 kube-flannel kube-flannel-ds-9fgml 1/1 Running 1 (18m ago) 2d21h kube-flannel kube-flannel-ds-ghwbq …

<<迷雾>> 第 3 章 怎样才能让机器做加法 示例电路

全加器示意图 info::操作说明 鼠标单击开关切换开合状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch03-01-full-adder.txt 原图 由3个全加器组成的3比特加法机 info::操作说明…

Linux——pod的调度

pod的调度 控制器: rc/rs 副本数量控制器 主要保证pod的数量符合管理员要求&#xff0c;并不会对pod进行额外的管理 以下三种控制器&#xff0c;本质上是服务控制器。具备以下特性&#xff1a; 副本数量的控制服务的滚动更新&#xff08;更新pod&#xff09;支持更新失…

基于springboot vue 投票系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

基于51单片机的2路电压采集proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1oNOJJv78ecfWZkdlMyhNVQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

Linux:LCD驱动开发

目录 1.不同接口的LCD硬件操作原理 应用工程师眼中看到的LCD 1.1像素的颜色怎么表示 ​编辑 1.2怎么把颜色发给LCD 驱动工程师眼中看到的LCD 统一的LCD硬件模型 8080接口 TFTRGB接口 什么是MIPI Framebuffer驱动程序框架 怎么编写Framebuffer驱动框架 硬件LCD时序分析…

OpenAI全新多模态内容审核模型上线:基于 GPT-4o,可检测文本和图像

在数字时代&#xff0c;内容安全问题愈发受到重视。9月26日&#xff0c;OpenAI 正式推出了一款全新的多模态内容审核模型&#xff0c;名为 “omni-moderation-latest”。 该模型基于最新的 GPT-4o 技术&#xff0c;能够准确地识别检测有害文本图像。这一更新将为开发者提供强大…

Java | Leetcode Java题解之第445题两数相加II

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {Deque<Integer> stack1 new ArrayDeque<Integer>();Deque<Integer> stack2 new ArrayDeque<Integer>();while (l1 ! null) {stack1.…

AI Agent应用出路到底在哪?

1 Agent/Function Call 的定义 Overview of a LLM-powered autonomous agent system&#xff1a; Agent学会调用外部应用程序接口&#xff0c;以获取模型权重中缺失的额外信息&#xff08;预训练后通常难以更改&#xff09;&#xff0c;包括当前信息、代码执行能力、专有信息源…

《深度学习》OpenCV 角点检测、特征提取SIFT 原理及案例解析

目录 一、角点检测 1、什么是角点检测 2、检测流程 1&#xff09;输入图像 2&#xff09;图像预处理 3&#xff09;特征提取 4&#xff09;角点检测 5&#xff09;角点定位和标记 6&#xff09;角点筛选或后处理&#xff08;可选&#xff09; 7&#xff09;输出结果 3、邻域…

深度学习反向传播-过程举例

深度学习中&#xff0c;一般的参数更新方式都是梯度下降法&#xff0c;在使用梯度下降法时&#xff0c;涉及到梯度反向传播的过程&#xff0c;那么在反向传播过程中梯度到底是怎么传递的&#xff1f;结合自己最近的一点理解&#xff0c;下面举个例子简单说明&#xff01; 一、…

Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite

继续讲一些Qt开发中的技巧操作&#xff1a; 1.去掉切换按钮 QTabWidget选项卡有个自动生成按钮切换选项卡的机制&#xff0c;有时候不想看到这个烦人的切换按钮&#xff0c;可以设置usesScrollButtons为假&#xff0c;其实QTabWidget的usesScrollButtons属性最终是应用到QTabWi…

衡石分析平台系统管理手册-功能配置之AI 助手集成嵌入指南

AI 助手集成嵌入指南​ 本文档将引导您通过几个简单的步骤&#xff0c;将 AI 助手集成或嵌入到您的系统中。HENGSHI SENSE AI 助手提供了多种集成方式&#xff0c;您可以通过 iframe、JS SDK 或 API 调用等方式将 AI 助手嵌入集成到您的系统中。 1. 通过 iframe 集成​ ifra…

老板最想要的20套模板!基于 VUE 国产开源 IoT 物联网 Web 可视化大屏设计器

如有需求&#xff0c;文末联系小编 Cola-Designer 是一个基于VUE开发&#xff0c;实现拖拽和配置方式生成数据大屏&#xff0c;提供丰富的可视化模板&#xff0c;满足客户业务监控、数据统计、风险预警、地理信息分析等多种业务的展示需求。Cola-Designer 帮助工程师通过图形化…

MySQL - 单表增删改

1. MySQL 概述 MySQL 是一种流行的开源关系型数据库管理系统 (DBMS)&#xff0c;广泛应用于互联网公司和企业开发中。它支持 SQL 语句操作数据&#xff0c;并提供多种版本供选择。 1.1 MySQL 安装和连接 社区版&#xff1a;免费版本&#xff0c;适合开发者使用。商业版&…

sizeof 和 strlen

一 . sizeof 关键字 这个是我们的老朋友了昂&#xff0c;经常都在使用&#xff0c;它是专门用来计算变量所占内存空间大小的&#xff0c;单位是字节&#xff0c;当然&#xff0c;如果我们的操作对象是类型的话&#xff0c;计算的就是类型所创建的变量所占内存的大小&#xff0…

【笔记】神领物流day1.1.13前后端部署【未完】

使用jenkins 前端部署 需要将前端开发的vue进行编译&#xff0c;发布成html&#xff0c;然后通过nginx进行访问&#xff0c;这个过程已经在Jenkins中配置&#xff0c;执行点击发布即可 网址栏输入神领TMS管理系统 (sl-express.com)即可看见启动成功 后端部署看linux 回到Jenki…