RHCE---Shell基础 2

news2024/11/17 9:58:19

文章目录

  • 目录

    文章目录

    前言

    一.变量

    概述

    定义

     自定义变量

    环境变量 

     概述:

    定义环境变量: 

    位置变量

    "$*"会把所有位置参数当成一个整体(或者说当成一个单词 

     变量的赋值和作用域 

     read 命令

    变量和引号 

    变量的作用域  

     变量的运算符

    总结


前言

前文初步介绍了shell脚本的基础知识,本章我们将通过引入一些新的知识和例题,学会完成一些简单的shell脚本编写。


一.变量

概述

       在shell脚本中,变量是一个可用于存储或检索值的名称。变量可以是数字、字符串或其他类型的数据。在shell脚本中,变量通常以美元符号($)开头,后跟变量名称。

定义

  • 原则:直接使用,不需要变量声明
  • 格式:变量名=变量的值

例 1:

[root@server ~]# vim test2.sh
#脚本抬头
#!/bin/bash
# 定义变量c
c="hello world"
# 定义路径
bak_dir=/data/backup
[root@server ~]# bash test2.sh
hello world

例2: 

在shell脚本中,let命令用于执行整数运算,并将结果赋值给变量。可以理解为是一种执行算术运算的快捷方式。

[root@timeserver ~]# bash test3.sh
x=123
let "x=x+1"  #let:使shell脚本识别变量,不使用let时x会被识别为字符串
y=$x         
echo "$y"
[root@timeserver ~]# 
124 #不加let 输出为 x+1
  •  = 前后不能收空格
[root@server ~]# a= 3
bash: 3: command not found...
[root@server ~]# b =5
bash: b: command not found...
  •  字符串类型建议使用双引好作为定界符引起,尤其是字符串中有空格
[root@server ~]# stu_name=zhang san
bash: san: command not found...
[root@server ~]# stu_name="zhang san"
[root@server ~]# stu_name='zhang san'

 自定义变量

  • 概念:上述以赋值形态形成的变量定义形式称为自定义变量

 查看变量:set 

取消环境变量:unset 

环境变量 

 概述:

    环境变量是操作系统中一个重要的概念,它用来存储一些在操作系统级别下用到的值,比如路径、用户名、密码等。在Linux系统中,环境变量存储在系统中的一个地方,每个终端都可以访问它们。

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

  1. PATH:用于指定可执行程序的搜索路径。
  2. HOME:指定当前用户的主目录。
  3. SHELL:指定当前用户使用的Shell程序。
  4. USER:指定当前用户的用户名。
  5. LANG:指定当前系统使用的语言环境。

定义环境变量: 

方法 1:export 环境变量=值

方法 2 :变量名=值

               export 变量名

方法 3:declare  -x   变量名=值

显示当前用户的环境变量:env  

位置变量

 概念:当一条命令或脚本执行时,后面可以跟多个参数,可以使用位置变量来表示该参数

[root@timeserver ~]# vim test3.sh
echo "第2个位置参数时:$2"
echo "第1个位置参数时:$1"
echo "第4个位置参数时:$4"
echo "所有位置参数时:$*"
echo "位置参数个数时:$#"
echo "当前进程的PID值:$$
[root@timeserver ~]# bash test3.sh 1 2 3 4 5
第2个位置参数时:2
第1个位置参数时:1
第4个位置参数时:4
所有位置参数时:1 2 3 4 5
位置参数个数时:5
当前进程的PID值:36113

常见的位置变量:

  • $0 : 脚本名
  • $1-$9 : 1-9个参数
  • ${10} :10以上的参数需要大花括号括起
  • $* : 所有参数
  • $@ : 所有参数
  • $# : 参数个数
  • $$ : 当前进程的PID
  • $! : 上一个后台进程的PID
  • $? : 上一个命令
  • 的返回值状态码,0为成功

$*和$#区别

  • "$@"会把所有位置参数当成一个单独的字段 
  • "$*"会把所有位置参数当成一个整体(或者说当成一个单词 

 [root@server ~]# set  --  I am test  command 
 [root@server ~]# for  i  in  "$@"; do  echo  $i; done
 I
 am5
 test
 command
 [root@server ~]# for  i  in  "$*"; do  echo  $i; done 
 I am test command

 变量的赋值和作用域 

 read 命令

概述:

  • read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
  • 量格式:read -参数 变量名
  • 参数
-p   “提示语句:”   屏幕打印出一行提示语句。
-n数字:当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量,如:-n1 , 只要接受到 
     一个字符就退出。只要按下一个字符进行回答,read命令立即接受输入并将其传给变量。无需按回车键
-t   等待时间 :计时输入,使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果 
     无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个计时器。-t选项指定read命令等 
     待输入的秒数。当计时满时,read命令返回一个非零退出状态
-s :关闭回显,使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜 
     色设置成与背景相同的颜色)常用格式:
     read  变量名 
     read  -p  "提示信息:"   变量名

例1:

[root@server ~]# read -p "Enter Numbers: " num
Enter Numbers: 9527
[root@server ~]# echo $num
9527
[root@server ~]# read -t 3 n1   # 不要输入内容,等待3秒后自动结束输入
[root@server ~]# read -s -p "Enter your password: " passw
Enter your password: [root@server ~]# echo $passw 
123456
[root@server ~]# echo $REPLY
[root@server ~]# read
100
[root@server ~]# echo $REPLY   # 当输入时没有指定变量接收,会默认存储到REPLY变量中
100
# 一次性输入多个变量的值
[root@server ~]# read t1 t2
12 35
[root@server ~]# echo $t1 $t2
12 35

 面试题总结四种复制方法:

1.直接赋值:name="li si"
2.read命令: read name
3.使用位置参数($1 $2 $3…) : name=$1
4.命令输入:name=$(whoami)  

变量和引号 

  1. 单引号(' '):单引号中的内容被视为纯文本,其中任何其他特殊字符(包括变量和命令替换)都会被视为普通字符。例如,单引号中的'$VAR'将被视为字符串'$VAR',而不是变量$VAR的值。
  2. 双引号(" "):双引号中的内容可以包含变量和命令替换,这些替换将被执行并被替换为其对应的值。双引号还可以用于转义特殊字符,例如$和\。
  3. 反引号/反撇号( 或者$()):在反引号或反撇号中的内容将被视为命令,该命令将被执行并返回其输出。该输出将被替换为反引号或反撇号中的内容。

变量的作用域  

全局变量:

全局变量指的是在整个脚本中都可访问的变量。这些变量可以在脚本的任何位置进行声明和赋值,并且可以在整个脚本的任何地方使用。

[root@server ~]# vim test5.sh
#!/bin/bash
func()   # 定义函数              1
{                                
        echo   "$v1"
        v1=200
}                                2
v1=100 
func    #调用函数                 3           
echo  "$v1"                      4
[root@server ~]# bash test5.sh 
100
200
#程序执行顺序:1-2之间为函数,首先装入内存,不调用,首先执行v1=100 接着调用函数
#当函数被调用后:首先执行echo   "$v1" 输出V1 由于函数内部没有定义V1 则到函数外部
#查找V1=100 输出100 接着执行V1=200,此时函数执行结束,接着执行echo  "$v1"  输出200

 局部变量:范围更小,仅限于某个程序段中,如:函数、shell等,通过local关键字定义

# 上例修改
[root@server ~]# vim test5.sh
#!/bin/bash
func()   # 定义函数
{
       local v3=200  # 使用local关键字声明为局部变量
}
func
echo  "$v3"
[root@server ~]# bash test5.sh

#没有内容

 变量的运算符

例 1:

[root@server ~]# expr 1 + 1 # 注意+左右必须要有空格
2
[root@server ~]# expr 1+1   # 否则原样显示
1+1
[root@server ~]# a=1
[root@server ~]# b=2
[root@server ~]# expr $a + $b # 支持变量
3
[root@server ~]# let num=1+2   # let+echo 等价于expr
[root@server ~]# echo $num
3
[root@server ~]# let num=1 + 2   # 注意let中运算符左右不能由空格
-bash: let: +:语法错误: 需要操作数 (错误符号是 "+")
[root@server ~]# echo $((1+2))
3
[root@server ~]# echo $((5%3))
2
[root@server ~]# echo $((3%5))
3
[root@server ~]# echo $((1-5))
-4
[root@server ~]# echo $((2 * 5))   # 可以有空格
10
[root@server ~]# echo $((5.2-5))   # 只支持整数运算
-bash: 5.2-5:语法错误: 无效的算术运算符 (错误符号是 ".2-5")
[root@server ~]# echo $[2+3]   # [] 等价于 (())
5
[root@server ~]# echo $[2.5+3] # # 只支持整数运算
-bash: 2.5+3:语法错误: 无效的算术运算符 (错误符号是 ".5+3")
[root@server ~]# bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software 
Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1.1+2
3.1
2.5-3.9
-1.4
1.5>4
0
5>3
1
quit  # 退出交互模式
# 不进入交互模式直接使用,bc需要放在最后
[root@server ~]# echo "scale=3;11/3" | bc   
3.66

 例 2:

# 返回变量长度
[root@server ~]# str1="hello world"
[root@server ~]# echo ${#str1}
11
# 变量截取
[root@server ~]# echo ${str1:0:3} # 从左边第1个字符开始截取3个
hel
[root@server ~]# echo ${str1::3} # 可以省略起始0
hel
[root@server ~]# echo ${str1:1} # 从下标1开始截取到尾部
ello world
[root@server ~]# echo ${str1:0-1:1} # 从右边第一个字符开始截取1个,左边第一个为0,右边第
一个为0-1
d
[root@server ~]# echo ${str1:0-5} # 从右边第5个开始截取到尾部
world
[root@server ~]# echo ${str1: -5} # 使用空格替代0,同上
world
[root@server ~]# echo ${str1:-5} # 没有空格表示提取整串
hello world

总结

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

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

相关文章

Java SOAP 调用 C# 的WebService

Java SOAP 调用 C# 的WebService,C# 的WebService方法的创建可以参考上一篇文章。IntelliJ IDEA Community Edition 2021.2.3的idea64.exe新建项目,导入需要的jar,代码如下: import org.apache.axis.client.Service; import org.…

微信小程序 picker-view 组件构建一个上下拖动选择器

picker-view是官方的一个选择器组件 支持多级选择 当然也可以单项选择 我们先来看看是个什么东西吧 简单写一个 wxml代码 <view><picker-view bindchange"pickerChange" style"width: 300rpx; height: 200rpx; font-size: 20px;"><!-- pic…

1.顺序表-头插、头删、尾插、尾删

文章目录 简介1.头插功能2.头删功能3.尾插功能4.尾删功能5.此程序共包含4个文件&#xff0c;2个.c文件和2个.h文件5.1 SeqList.h文件5.2 SeqList.c文件5.3 test.h文件5.4 test.c文件 6.测试结果6.1 测试尾插和尾删的运行结果6.2 测试头插和头删的运行结果 7.温馨提示 简介 本文…

实战:打造一个开箱即用的超丝滑超漂亮hexo博客网站-v4-(通过百度网盘同步空间来同步source核心数据)

实战&#xff1a;打造一个开箱即用的超丝滑超漂亮hexo博客网站-v4-(通过百度网盘同步空间来同步source核心数据) 目录 文章目录 实战&#xff1a;打造一个开箱即用的超丝滑超漂亮hexo博客网站-v4-(通过百度网盘同步空间来同步source核心数据)目录写在前面本次更新方案背景方案官…

C语言每日一题(17)老人的数目

力扣 2678 老人的数目 给你一个下标从 0 开始的字符串 details 。details 中每个元素都是一位乘客的信息&#xff0c;信息用长度为 15 的字符串表示&#xff0c;表示方式如下&#xff1a; 前十个字符是乘客的手机号码。接下来的一个字符是乘客的性别。接下来两个字符是乘客的…

测开不得不会的python之re模块正则表达式匹配

学习目录 正则表达式介绍 正则表达式的常用符号 python的re模块 findall()函数 finditer()函数 match()函数 search()函数 split()函数 正则表达式的介绍 Python 通过标准库中的 re 模块来支持正则表达式。 正则表达式作为高级的文本模式匹配、抽取、和搜索。简单地说…

Python OpenCV将n×n的小图拼接成m×m的大图

Python OpenCV将nn的小图拼接成mm的大图 前言前提条件相关介绍实验环境n \times n的小图拼接成m \times m的大图代码实现 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、OpenCV-Python小…

独立企业签名和共享企业签名的区别

最近两天&#xff0c;小编注意到行业内的一则消息&#xff0c;市面上有好几本企业签名证书又被封了。毋庸置疑&#xff0c;这些肯定是共享的证书。理由很简单&#xff0c;市面上的用来做共享证书的企业签名&#xff0c;基本上都是不会限制应用类型以及签名的数量。据鲲分发平台…

计算机考研自命题(6)

1、C语言–奇数求和 1、使用函数求奇数和&#xff1a;输入一批正整数&#xff08;以零或负数为结束标志&#xff09;&#xff0c;求其中的奇数和。要求定义和调用函数 odd(n) 判断数的奇偶 性&#xff0c;当 n 为偶数时返回 0 &#xff0c;否则返回 1 。试编写相应程序。 /* 解…

yolov7改进优化之蒸馏(二)

续yolov7改进优化之蒸馏&#xff08;一&#xff09;-CSDN博客 上一篇已经基本写出来yolov7/v5蒸馏的整个过程&#xff0c;不过要真的训起来我们还需要进行一些修改。 Model修改 蒸馏需要对teacher和student网络的特征层进行loss计算&#xff0c;因此我们forward时要能够返回需…

Lua入门使用与基础语法

文章目录 目的基础说明开发环境基础语法注释数据类型变量流程控制函数 总结 目的 Lua是一种非常小巧的脚本语言&#xff0c;基于C构建并且完全开源&#xff0c;可以方便的嵌入到各种项目中&#xff0c;当然也可以单独使用。Lua经常被用在很多非脚本语言的项目中&#xff0c;用…

组件通信$refs | $parent |$root

父组件传值子组件用Props 子组件传值父组件用$emit 父组件直接还可以直接取子组件的值用$refs 父组件直接从子子组件中获取值$refs 不建议使用会增加组件之间的耦合度&#xff0c;一般用于第三方插件的封装 ref如果绑定在dom节点上&#xff0c;拿到的就是原生dom节点。 ref如…

【智能家居】

面向Apple developer学习&#xff1a;AirPlay | Apple Developer Documentation Airplay AirPlay允许人们将媒体内容从iOS、ipad、macOS和tvOS设备无线传输到支持AirPlay的Apple TV、HomePod以及电视和扬声器上。 网页链接的最佳实践 首选系统提供的媒体播放器。内置的媒体播…

VRPTW(MATLAB):蜘蛛蜂优化算法SWO求解带时间窗的车辆路径问题VRPTW(提供参考文献及MATLAB代码)

一、VRPTW简介 带时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows, VRPTW)是车辆路径问题(VRP)的一种拓展类型。VRPTW一般指具有容量约束的车辆在客户指定的时间内提供配送或取货服务&#xff0c;在物流领域应用广泛&#xff0c;具有重要的实际意义。VRPTW常…

IPD集成产品开发TR技术评审详解

IPD&#xff08;Integrated Product Development&#xff09;集成产品开发是一种跨部门协同的、利用先进技术和管理方法来快速推出新产品并满足客户需求的开发模式。华为利用IPD也非常出名。在IPD集成产品开发的过程中&#xff0c;TR&#xff08;Technical Review&#xff09;技…

【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 刷题篇 一、只出现一次的数字1.1 题目描述1…

1024程序员节特辑 | 深度解析C/C++内存管理(建议收藏!!)

1024程序员节特辑 | 深度解析C/C内存管理&#xff08;建议收藏&#xff01;&#xff01;&#xff09; 一、C/C内存分布1.1 相关例题 二、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free2.1 相关面试题 三、C内存管理方式3.1 new/delete操作内置类型3.2 new和…

通过字符设备驱动的分步实现编写LED驱动,另外实现特备文件和设备的绑定

头文件.h文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; } gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X5000700…

程序员网上接单盛行,到底该怎样选择一个好用不坑的接单平台?

现在&#xff0c;选择在网上接单的程序员是越来越多了&#xff0c;与此同时&#xff0c;网上接单的平台也是越来越多了&#xff0c;五花八门的平台&#xff0c;哪个最靠谱&#xff1f;哪个资源丰富一些&#xff1f; 这些问题是不是也让你犹豫了呢&#xff1f;不用担心&#xf…

红队打靶:Misdirection打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现与端口扫描 第二步&#xff1a;Web渗透&#xff08;80端口&#xff0c;战术放弃&#xff09; 第三步&#xff1a;Web渗透&#xff08;8080端口&#xff09; 第四步&#xff1a;sudo bash提权 第五步&#xff1a;/etc/passwd利…