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
相关推荐
病树前头1 天前
一些以前使用的linux及shell命令,gnuplot脚本
linux·shell
promise5246 天前
MySQL实现按分秒统计数据量
linux·运维·数据库·sql·mysql·shell
DoubleCui7 天前
记一次Mac 匪夷所思终端常用网络命令恢复记录
网络·macos·shell·terminal
飞的肖9 天前
在Linux实时监控某个应用是否运行,未运行,执行运行命令
linux·运维·shell
花花花113 天前
秒变 Vim 高手:必学的编辑技巧与隐藏功能大揭秘
linux·ubuntu·编辑器·vim·excel·shell
喵个咪13 天前
Windows使用PowerShell批量修改文件后缀
shell
持续更新中~14 天前
有关shell指令练习2
shell
只对您心动15 天前
【C高级】有关shell脚本的一些练习
linux·c语言·shell·脚本
DieSnowK15 天前
[项目][WebServer][Makefile & Shell]详细讲解
开发语言·c++·http·makefile·shell·项目·webserver
promise52425 天前
Linux下载压缩包:tar.gz、zip、tar.bz2格式全攻略
linux·运维·服务器·后端·bash·shell