Shell学习——Shell变量

文章目录

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

Shell变量

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

使用变量

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

powershell 复制代码
your_name="qinjx"
echo $your_name
echo ${your_name}

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

powershell 复制代码
for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

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

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

只读变量

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

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

powershell 复制代码
#!/bin/bash

myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"

删除变量

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

复制代码
unset variable_name

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

powershell 复制代码
#!/bin/sh

myUrl="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'
  • 单引号字符串的限制:
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号

powershell 复制代码
your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
复制代码
输出结果为:

Hello, I know you are "runoob"! 
  • 双引号的优点:
    • 双引号里可以有变量
    • 双引号里可以出现转义字符

拼接字符串

powershell 复制代码
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} !

获取字符串长度

powershell 复制代码
string="abcd"
复制代码
echo ${#string}   # 输出 4

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

powershell 复制代码
string="abcd"
echo ${#string[0]}   # 输出 4

提取子字符串

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

powershell 复制代码
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

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

powershell 复制代码
string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

数组

定义数组

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

复制代码
数组名=(值1 值2 ... 值n)

例如:

powershell 复制代码
array_name=(value0 value1 value2 value3)

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

复制代码
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

读取数组

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

复制代码
${数组名[下标]}

例如:

powershell 复制代码
valuen=${array_name[n]}

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

powershell 复制代码
echo ${array_name[@]}

获取数组的长度

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

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

传递参数

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

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

实例

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

powershell 复制代码
#!/bin/bash

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

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

复制代码
$ chmod +x test.sh 
$ ./test.sh 1 2 3

Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
相关推荐
码农秋12 小时前
快刀集(1): 一刀斩断视频片头广告
shell·快刀集·一闪
vortex521 小时前
探索 Shell:选择适合你的命令行利器 bash, zsh, fish, dash, sh...
linux·开发语言·bash·shell·dash
itachi-uchiha2 天前
awk处理xml文件&&封装集合变量和调用
xml·shell·awk
粉红色回忆3 天前
在bash中进行基本数值计算
shell
粉红色回忆4 天前
linux 如何自定义文件描述符
shell
薛定谔的猫_C8T64 天前
程序人生-Hello’s P2P
c语言·汇编·程序人生·shell·二进制·计算机系统·hello
孙克旭_5 天前
day027-Shell自动化编程-基础
linux·运维·自动化·shell
shut up5 天前
Git的使用技巧
gitee·github·shell
粉红色回忆5 天前
linux简单理解输入输出重定向
shell
开挖掘机上班6 天前
Bash shell四则运算
linux·开发语言·bash·shell