Shell 从入门到精通系列 (第一章 Shell编程基础)

2023-10-27

1.什么是变量

从本质上讲,变量就是在程序中保存用户数据的一块内存空间,变量名就是这块内存空间的地址。在程序执行过程当中,保存数据的内存空间内容可能会不断发生变化,但是代表内存地址的变量名却保持不变,由于变量的值时在计算机的内存中,所以当计算机重启后,变量的值会丢失。

2.变量的命名

命名规范:

变量名由字母,数字,下划线组成,并且只能以字母或者下划线开头,用户应该选择有明确意义的英文单词作为变量名,尽量避免使用拼音或者毫无意义的字符串作为变量名

2.1 可读性好的变量名

HISTCONTROL=ignoredups:ignorespace

HISTSIZE=1000

2.2 可读性差的变量名

 abc=123

str1="hello,world"

2.3 变量名的大小写敏感

 java=1.8

JAVA=1.9

两个变量的结果是不一样的

3. 变量的类型

  shell是一种动态类型语言和弱类型语言,即在shell中,变量的类型无需显示的声明,变量的数据类型会根据不同的操作有所变化,准确的讲,shell中的变量是不分数据类型的,统一地按照字符串存储

 3.1 案例

 #!/bin/bash

#定义变量x,并且赋值为123

x=123

#变量x加1

let "x += 1"

#输出变量x的值

echo "x = $x"

#把变量x中的1替换为abc

y=${x/1/abc}

#输出变量y的值

echo "y = $y"

#声明变量y

declare -i y

#输出变量y的值

echo "y = $y"

#变量y的值加1

let "y += 1"

#输出变量y的值

echo "y = $y"

#将字符串赋值给变量z

z=abc22

#输出变量z的值

echo "z = $z"

#把变量x中的1替换为abc

m=${z/abc/11}

#输出变量m的值

echo "m = $m"

#变量m的值加1

 4.变量的定义

  通常情况下,用户可以直接使用变量,无需先进行定义,在用户第一次使用使用某个变量名时,实际上就同时定义了这个变量。

 4.1 案例

 #!/bin/bash

#定义变量a

a=1

#定义变量b

b="hello"

#定义变量c,如果变量的值包括空格,一定要用引号引起来

c="hello world"

 4.2 declare 声明变量

 格式: declare  属性  变量名

属性分类:

-p 显示所有变量的值

-i 将变量定义为整数

-r 将变量声明为只读变量

-a 将变量声明为数组

-f 显示所有自定义函数

-x 将变量设置为环境变量

 案例

 #!/bin/bash

#定义变量x,并将一个算术式赋值给x

x=6/3

echo "$x"

#定义变量x为整数

declare -i x

echo "$x"

#将算术式赋值给变量x

x=6/3

echo "$x"

#将字符串赋值给变量x

x=hello

echo "$x"

#将浮点数赋值给变量x

x=3.14

echo "$x"

#取消变量x的整数属性

declare +i x

#重新将算术式赋值给变量x

x=6/3

echo "$x"

#声明只读变量

declare -r x

echo "$x"

#尝试为只读变量赋值

x=5

echo "$x"
 

 结果:

 5.变量和引号

 shell语言中一共有三种引号,单引号,双引号,反引号,这三种引号的作用不同

5.1 单引号('')

单引号引起来的都是普通字符,例如:

str='hello'

 5.2 双引号("")

双引号括起来的字符除了 "$" , "\" , "'" , """ 这几个字符仍是特殊字符保留起特殊功能外,其余字符仍作为普通字符对待,例如:

root@k8s-master:~# b=123

root@k8s-master:~# str="$b"

root@k8s-master:~# echo $str

$符号在这里有特殊意义,$b代表变量b的值

 5.3 反引号(``)

反引号括起来的字符串被shell解释为命令,例如:

#!/bin/bash

#输出当前目录

echo "current directory is `pwd`"​​​​

`pwd`列出当前目录

 6.变量的作用域

shell中的变量分为全局变量和局部变量两种

 6.1 全局变量

 在shell脚本中,全局变量可以在脚本中定义,也可以在某个函数中定义,在脚本中定义的变量都是全局变量,其作用域为从定义的地方开始,到脚本结束或者被显示的删除

 案例:

#!/bin/bash

#定义函数

func()

{

 #输出变量v1的值

 echo "$v1"

 #修改变量x的值

 v1=200

}

#在脚本中定义变量x

v1=100

#调用函数

func

#输出变量x的值

echo "$v1"

 结果:

 分析:

 在脚本中定义了一个全局变量v1=100, 然后调用函数,函数中打印v1的值为100,在函数中修改v1=200,最后在脚本中打印修改后的v1为200

 案例:

在函数内部定义的变量也是全局变量

#!/bin/bash

#定义函数

func()

{

 #在函数内部定义变量

 v2=200

}

#调用函数

func

#输出变量的值

echo "$v2"

 结果:

 6.2 局部变量

 在shell中,可以在函数内部通过local关键字来定义局部变量,函数的参数也是局部变量

 ​local关键字定义局部变量

#!/bin/bash

#定义函数

func()

{

 #使用local关键字定义局部变量

 local v2=200

}

#调用函数

func

#输出变量的值

echo "$v2"

 

 结果:

​分析:

在函数内部定义了局部变量,无法在函数外面获取,所以结果为空

6.3 全局变量和局部变量名称相同时

 函数内部的局部变量会屏蔽函数外部定义的全局变量,在出现同名的情况下,函数内部的局部变量会优先被使用

 案例:

#!/bin/bash

#定义函数

func()

{

 #输出全局变量v1的值

 echo "global variable v1 is $v1"

 #定义局部变量v1

 local v1=2

 #输出局部变量v1的值

 echo "local variable v1 is $v1"

}

#定义全局变量v1

v1=1

#调用函数

func

#输出全局变量v1的值

echo "global variable v1 is $v1"

 结果:

 7. 系统变量

 shell中常用的系统变量:

变量 说明
$n     
n是一个整数,从0开始,表示参数的位置,$1表示第一个参数,$2表示第二个参数
$# 命令行参数的个数
$0 当前shell脚本的名称
$? 前一个命令或者函数的返回状态码
$* 以"参数1 参数2..."的形式将所有参数通过一个字符串返回
$@ 以"参数1" “参数2”的形式返回每个参数
$$ 返回本程序的进程ID(PID)

 #!/bin/bash

#输出脚本的参数个数

echo "the number of parameters is $#"

#输出上一个命令的退出状态码

echo "the return code of last command is $?"

#输出当前脚本的名称

echo "the script name is $0"

#输出所有的参数

echo "the parameters are $*"

#输出其中的几个参数

echo "\$1=$1;\$2=$2;\$11=${11}"

​执行结果:

[root@k8s-master tmp]# bash test.sh a b c d e f g h i j k l m n

 8.环境变量

Shell 的环境变量是所有Shell程序都可以使用的变量,Shell中的环境变量全部用大写字母表示

 常用的Shell环境变量:

PATH:  命令搜索路径,以冒号为分隔符

HOME: 用户主目录的路径名

COLUMNS: 命令编辑模式下可使用命令行的长度

HISTFILE: 命令历史文件

HISTSIZE: 命令历史文件中最多可包含的命令条数

HISTFILESIZE: 命令历史文件中包含的最大行数

IFS: 定义shell使用的分隔符

LOGNAME: 当前的登录名

SHELL: Shell的全路径名

TERM:终端类型

TMOUT: Shell自动退出的时间,单位为秒,若设置为0,则禁止Shell自动退出

PWD: 当前工作目录

 SET可以列出当前系统所有的环境变量:

 案例:

#!/bin/bash

#输出命令搜索路径

echo "commands path is $PATH"

#输出当前的登录名

echo "current login name is $LOGNAME"

#输出当前用户的主目录

echo "current user's home is $HOME"

#输出当前的shell

echo "current shell is $SHELL"

#输出当前的工作目录

echo "current path is $PWD"

结果:

9.变量赋值和清空

9.1 变量赋值

 在shell中,变量并不需要专门的定义和初始化语言,一个没有初始化的shell变量被认为是一个空字符串。

 ​语法:

​variable_name=value

variable_name表示变量名,value表示要赋给变量的值

案例: 

​v1=Linux

v2='Centos7 Linux'

v3="current user's home is $HOME"

v4=123

 9.2 变量的引用

 在shell中,可以通过在变量名前面加上 “$” 来获取变量的值。

 ​案例:

#!/bin/bash

v1=Linux

v2='Centos7 Linux'

v3="current user's home is $HOME"

v4=123

#输出变量v1的值

echo $v1

#输出变量v2的值

echo $v2

#输出变量v3的值

echo $v3

#输出变量v1的值

echo $v4

​结果:

 ​特别注意:

​echo "$v4abc"  会报错,因为v4abc会作为一个变量名,然后我们并没有定义这个变量,所以会报错

需要更改为 echo “${v4}abc”

 ​​9.3 清除变量

 当某个变量不再使用时,可以将其清除

 语法:

​unset variable_name

 案例:

#!/bin/bash

#定义变量v1

v1="Hello world"

#输出v1的值

echo "$v1"

#清除变量

unset v1

echo "the value of v1 has been reset"

#再次输出v1的值

echo "$v1"

 ​结果:

​unset v1之后,输出变量为空

 ​​​10. 变量引用

 所谓引用,是将字符串用引用符号包括起来,以防止其中的特殊字符被shell解释为其他涵义

 ​shell中一共有4种引用符号:

双引号:  除美元符号,单引号,反引号,反斜线之外,其他所有字符都保持字面意义

单引号: 所有的字符都保持字面意义

反引号: 反引号中的字符串将被解释为shell命令

反斜线:转义字符,屏蔽后的字符的特殊意义

 10.1 全引用

 在shell中,当一个字符串被单引号引用起来之后,其中所有的字符,除单引号本身之外,都将被解释为字面意义,即字符本身的涵义。

 ​案例:

#!/bin/bash

#定义变量v1

v1="test"

#输出含有变量名的字符串

echo 'hello,$v1'

 ​结果:

 10.2 部分引用

 用双引号引起来的字符串,其中所包含的字符除了美元符号($),反引号(`),反斜线(\)之外的所有其他字符,都将被解释为字面意义,这成为部分引用

 案例:

#!/bin/bash

#定义变量v1

v1="test"

#输出含有变量名的字符串

echo "hello,$v1"

 结果:

 11. 命令替换

所谓命令替换,是指在shell中,将某个shell命令执行的结果赋给某个变量。

 ​语法:

`shell_command`

$(shell_command)

 案例:

#!/bin/bash

#变量替换

v1=`pwd`

#输出变量的值

echo "current working directory is $v1"

或者

#!/bin/bash

#变量替换

v1=$(pwd)

#输出变量的值

echo "current working directory is $v1"

12. 转义

 转义的作用是转换某些特殊字符的意义,转义用反斜线表示,当反斜线后面的一个字符具有特殊的意义时,反斜线将屏蔽字符的特殊意义,使得shell按照该字符的字面意义来解释

 ​案例:

 链接: ​ ​https://ke.qq.com/course/4300856?tuin=d8aedf68​

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell 从入门到精通系列 (第一章 Shell编程基础) 的相关文章

随机推荐

  • 1.3.6 手写数字识别之训练调试与优化.md

    文章目录 概述 一 计算模型的分类准确率 二 检查模型训练过程 三 加入校验或测试 四 加入正则化项 4 1 过拟合现象 4 2 导致过拟合原因 4 3 过拟合的成因与防控 4 4 正则化项 五 可视化分析 5 1 使用Matplotlib
  • 2022最新软件测试八股文,能不能拿心仪Offer就看你背得怎样了

    前言 鉴于目前测试就业越来越严峻 内卷也成了测试领域的代名词了 我的一个HR朋友告诉我 由于门槛较低 现在普通测试岗 偏功能 的投递比已经将近100 也就是一个岗位差不多有百分简历投进来 所以现在还想从事软件测试行业的小伙伴们 想要心仪的工
  • qt QTimer 提示 不能在另外一个线程停止

    发送 信号 停止 timer 提示 QObject killTimer Timers cannot be stopped from another threadQObject QObject Timers cannot be stopped
  • Spring之Ioc工作流程

    springIoc容器创建流程 在AbstractApplicationContext refresh 中描述了创建ioc的过程 1 前期准备校验参数等 prepareRefresh 2 创建beanFactory工厂对象 还把配置文件中的
  • sort函数数组排序(c++方法)

    sort函数的调用需要头文件 include 从小到大排 例如 a 50 2 3 5 1 1 想让它按照从小到大的顺序排列 那么就可以这么写 sort a a 5 然后数组就会变成 1 1 2 3 5 具体代码如下 include
  • 小菜鸡刷CTF

    一个小菜鸡的CTF成长史 本人小菜鸡一枚 刚入门CTF 不对 应该是脚刚刚沾上了CTF的边边 就只是在刷攻防世界中的题目 无奈脑子太笨 记性太差 只好将题目整理下来 代码多有借鉴 求勿喷 新手练习 题目一 base64 题目来源 poxlo
  • Kotlin手写RxJava变换符

    Kotlin手写RxJava变换符 本文链接 点击这里进入 1 核心点 中转站存储之前的数据 2 三行代码实现RxJava 使用create map observer fun main create构造出RxJavaCore存放 lambd
  • Open3D 入门教程

    文章目录 1 概述 2 安装 3 点云读写 4 点云可视化 4 1 可视化单个点云 4 2 同一窗口可视化多个点云 4 3 可视化的属性设置 5 k d tree 与 Octree 5 1 k d tree 5 2 Octree 5 2 1
  • Redis密码相关知识总结

    背景 工作中 生产环境的Redis集群都是无密码的 存在安全隐患 现在需要对Redis集群进行密码设置 相关工作总结如下 基础知识 requirepass redis实例自身的连接密码 当客户端请求连接当前Redis服务器时 需要使用的密码
  • 【Yarn】Yarn 是如何提交 MapReducer程序到Yarn集群的

    文章目录 1 概述 3 1 案例 3 2 waitForCompletion 3 3 submit 3 4 connect 3 5 submitJobInternal 3 6 submitJob 3 7 createApplicationS
  • 第五章:多重循环及程序调试

    第五章 多重循环及程序调试 一 什么是多重循环 多重循环 一个循环体内又包含另一个完整的循环结构 例子 while 循环条件1 循环操作1 while 循环条件2 循环操作2 do 循环操作1 do 循环操作2 while 循环条件2 wh
  • 基于libVLC的视频播放器(支持RTSP协议)

    VLC Media Player是一款优秀的播放器 大多数多媒体开发人员都使用过 VLC是一款开源的 跨平台的 可扩展的 多媒体播放器 流媒体服务器及框架 可播放大多数多媒体文件 以及DVD 音频CD VCD及各类流媒体协议 现更名为VLC
  • 自学黑客(网络安全),一般人我劝你还是算了吧

    一 自学网络安全学习的误区和陷阱 1 不要试图先成为一名程序员 以编程为基础的学习 再开始学习 我在之前的回答中 我都一再强调不要以编程为基础再开始学习网络安全 一般来说 学习编程不但学习周期长 而且实际向安全过渡后可用到的关键知识并不多
  • vue深度css样式

    vue 2 gt gt gt 或者 deep 或者 v deep vue 3 deep class
  • PCL点云库学习笔记(搜索方法)

    PCL点云库学习笔记 搜索方法 一 k d tree 二 八叉树 一 k d tree 我们所有的k d树都是三维空间的 k d树的每个级都使用特定维度拆分所有子级 在树的根部 所有子项都将根据第一维进行拆分 即 如果第一维坐标小于根 则它
  • 奇数求和

    include
  • 谷歌打响全面反击战!官宣AI重构搜索、新模型比肩GPT-4,朝着ChatGPT微软开炮...

    点击上方 视学算法 选择加 星标 或 置顶 重磅干货 第一时间送达 明敏 丰色 发自 凹非寺量子位 公众号 QbitAI 万众瞩目 谷歌的反击来了 现在 谷歌搜索终于要加入AI对话功能了 排队通道已经开放 当然这还只是第一步 大的还在后面
  • 如何快速判断IP被墙

    IP被墙是指IP部分地区或者运营商无法被正常进行访问的一个情况 被墙的原因有很多种不一一列举 由于被墙的时间短的为按周按月计算 时间长的则为按年计算 所以一般这种情况下只能选择更换IP 检查办法 第一 确认IP没有封能正常出去机房 确认机器
  • android开发时常用的像素单位,Android开发里的像素单位dp、px、pt、sp的比较

    Android支持下列所有单位 px 像素 屏幕上的点 in 英寸 长度单位 mm 毫米 长度单位 pt 磅 1 72英寸 dp 与密度无关的像素 一种基于屏幕密度的抽象单位 在每英寸160点的显示器上 1dp 1px dip 与dp相同
  • Shell 从入门到精通系列 (第一章 Shell编程基础)

    1 什么是变量 从本质上讲 变量就是在程序中保存用户数据的一块内存空间 变量名就是这块内存空间的地址 在程序执行过程当中 保存数据的内存空间内容可能会不断发生变化 但是代表内存地址的变量名却保持不变 由于变量的值时在计算机的内存中 所以当计