当前位置: 首页 > news >正文

Shell学习——Shell变量

文章目录

  • Shell变量
    • 使用变量
    • 只读变量
    • 删除变量
    • 变量类型
      • 字符串变量: 在 Shell中,变量通常被视为字符串。
      • 整数变量: 在一些Shell中,你可以使用 declare 或 typeset 命令来声明整数变量。
      • 数组变量: Shell 也支持数组,允许你在一个变量中存储多个值。
      • 环境变量: 这些是由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境。
      • 特殊变量: 有一些特殊变量在 Shell 中具有特殊含义,例如 $0 表示脚本的名称,$1, $2, 等表示脚本的参数。
    • 字符串
      • 单引号
      • 双引号
      • 拼接字符串
      • 获取字符串长度
      • 提取子字符串
    • 查找子字符串
    • 数组
      • 定义数组
      • 读取数组
    • 传递参数

Shell变量

  • 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
    • 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
    • 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
    • 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
    • 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
    • 避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
    • 避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

for skill in Ada Coffe Action Java; doecho "I am good at ${skill}Script"
done

如果不给skill变量加花括号,写成echo “I am good at $skillScript”,解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号,这是个好的编程习惯。

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

#!/bin/bashmyUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"

删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

#!/bin/shmyUrl="https://www.runoob.com"
unset myUrl
echo $myUrl

变量类型

Shell 支持不同类型的变量,其中一些主要的类型包括:

字符串变量: 在 Shell中,变量通常被视为字符串。

你可以使用单引号 ’ 或双引号 " 来定义字符串,例如:

my_string='Hello, World!'

或者

my_string="Hello, World!"

整数变量: 在一些Shell中,你可以使用 declare 或 typeset 命令来声明整数变量。

这样的变量只包含整数值,例如:

declare -i my_integer=42

这样的声明告诉 Shell 将 my_integer 视为整数,如果尝试将非整数值赋给它,Shell会尝试将其转换为整数。

数组变量: Shell 也支持数组,允许你在一个变量中存储多个值。

数组可以是整数索引数组或关联数组,以下是一个简单的整数索引数组的例子:

my_array=(1 2 3 4 5)

或者关联数组:

declare -A associative_array
associative_array["name"]="John"
associative_array["age"]=30

环境变量: 这些是由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境。

例如,PATH 变量包含了操作系统搜索可执行文件的路径:

echo $PATH

特殊变量: 有一些特殊变量在 Shell 中具有特殊含义,例如 $0 表示脚本的名称,$1, $2, 等表示脚本的参数。

$#表示传递给脚本的参数数量,$? 表示上一个命令的退出状态等。

字符串

单引号

str='this is a string'
  • 单引号字符串的限制:
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号

your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
输出结果为:Hello, I know you are "runoob"! 
  • 双引号的优点:
    • 双引号里可以有变量
    • 双引号里可以出现转义字符

拼接字符串

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3
输出结果为:hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

获取字符串长度

string="abcd"
echo ${#string}   # 输出 4

变量为字符串时,${#string} 等价于 ${#string[0]}:

string="abcd"
echo ${#string[0]}   # 输出 4

提取子字符串

以下实例从字符串第 2 个字符开始截取 4 个字符:

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

数组

定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

还可以单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

读取数组

读取数组元素值的一般格式是:

${数组名[下标]}

例如:

valuen=${array_name[n]}

使用 @ 符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
length=${#array_name[n]}

传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为 $n,n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数。

例如可以使用 $1、$2 等来引用传递给脚本的参数,其中 $1 表示第一个参数,$2 表示第二个参数,依此类推。

实例
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):

#!/bin/bashecho "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

为脚本设置可执行权限,并执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
http://www.lryc.cn/news/392740.html

相关文章:

  • Java中的持续集成与持续部署(CI/CD)
  • 极狐GitLab 将亮相2024空天信息大会暨数字地球生态峰会,携手中科星图赋能空天行业开发者
  • Beats:使用 Filebeat 从 Python 应用程序中提取日志
  • 51单片机第23步_定时器1工作在模式0(13位定时器)
  • linux的服务管理
  • 动手学深度学习(Pytorch版)代码实践 -循环神经网络-53语言模型和数据集
  • Python 学习之自动化运维技术(八)
  • 【python】PyQt5可视化开发,如何设计鼠标显示的形状?
  • 利用大模型知识库,优化智能客服问答效果 | 创新场景
  • 物联网协议都包含哪些协议?
  • 面试专区|【52道微服务架构高频题整理(附答案背诵版)】
  • 数据结构之算法的时间复杂度
  • unity中物体被激活自动执行挂载代码
  • Pandas数据可视化详解:大案例解析(第27天)
  • Redis基础教程(七):redis列表(List)
  • 鸿蒙开发:Universal Keystore Kit(密钥管理服务)【生成密钥(C/C++)】
  • ssm“落雪”动漫网站-计算机毕业设计源码81664
  • 【面试题】Reactor模型
  • RedHat9 | kickstart无人值守批量安装
  • k8s-第五节-StatefulSet
  • ai机器狗
  • 数据库关键字执行顺序
  • Linux 永久挂载磁盘
  • windows启动Docker闪退Docker desktop stopped
  • 探索Redis GEOMETRY数据结构:地理空间索引与查询(基于Redis GEO和Java实现附近商户查找功能)
  • DP学习——策略模式
  • 0701_ARM5
  • Python用户宝典:了解并实现遗传算法
  • 如何使用深度学习进行实时目标检测:速度与精度的双重挑战
  • 创新引领,构筑产业新高地