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
相关推荐
pr_note8 小时前
legality检查
shell·tcl
啥都不懂的小小白1 天前
Shell脚本编程入门:从零基础到实战掌握
前端·shell
dingdingfish5 天前
GNU Parallel 学习 - 第1章:How to read this book
bash·shell·gnu·parallel
似霰8 天前
Linux Shell 脚本编程——核心基础语法
linux·shell
似霰8 天前
Linux Shell 脚本编程——脚本自动化基础
linux·自动化·shell
偷学技术的梁胖胖yo9 天前
Shell脚本中连接数据库查询数据报错 “No such file or directory“以及函数传参数组
linux·mysql·shell
纵有疾風起18 天前
【Linux 系统开发】基础开发工具详解:软件包管理器、编辑器。编译器开发实战
linux·服务器·开发语言·经验分享·bash·shell
gis分享者20 天前
Shell 脚本中如何使用 here document 实现多行文本输入? (中等)
shell·脚本·document·多行·文本输入·here
柏木乃一20 天前
基础IO(上)
linux·服务器·c语言·c++·shell
angushine21 天前
CPU脚本并远程部署
shell