shell脚本:变量

本文详细介绍了Shell脚本中的变量使用规则,包括命名规范、赋值方式以及只读变量的设定。此外,还讲解了字符串操作,如单引号与双引号的区别、字符串拼接及长度获取。最后,阐述了Shell数组的定义、读取方法以及获取数组长度的方法,帮助读者深入理解Shell脚本编程。
摘要由CSDN通过智能技术生成

学习中遇到的知识点,做个记录。
#!告诉系统其后面的可执行程序即是解释运行此脚本的shell

#!/bin/sh
#1/bin/bash

变量

变量命名

变量命名必须遵守如下规则

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量

定义变量时,变量名和等号间不能有空格。

使用变量时只需要在变量前加$符号即可
如:

test_var="hello"
echo $test_var
echo ${test_var}

变量名外的{}是为了更好的区分变量名的边界

变量类型

运行shell时,以变量作用域划分,会同时存在三种变量:

  1. 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

只读变量

readonly命令可以将变量修改为只读变量,只读变量只可读取,不能修改
例子

echo ${string}
string="abcd"
echo ${string}
string="dcba"
echo ${string}

readonly_string="abcd"
echo ${readonly_string}
readonly readonly_string
readonly_string="dcba"
echo ${readonly_string}

输出

abcd
dcba
abcd
./test.sh: line 9: readonly_string: readonly variable
abcd

可以看到当,当想要更改一个只读变量时会报错,并且修改无效

删除变量

使用命令unset可以删除变量,此命令不可删除只读变量

echo ${string}
string="abcd"
echo ${string}
unset string
echo ${string}

readonly_string="abcd"
echo ${readonly_string}
readonly readonly_string
unset readonly_string
echo ${readonly_string}

输出:

abcd

abcd
./test.sh: line 10: unset: readonly_string: cannot unset: readonly variable
abcd

字符串

单引号

str='this is a string'

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

双引号

#!/bin/bash
test_word="world"
str="Hello, \"${test_word}\"! \n"
echo -e ${str}

输出结果为

Hello, "world"! 

双引号里可以有变量
双引号里可以出现转义字符
echo的-e参数是为了处理\n等特殊功能字符,如果不添加\n会原样打印。
如:

Hello, "world"! \n

字符串拼接

#!/bin/bash
test_word="world"
str1="Hello, "${test_word}"! \n"
echo -e str1 ${str1}
str2="Hello, '${test_word}'! \n"
echo -e str2 ${str2}
str3="Hello, ${test_word}! \n"
echo -e srt3 ${str3}
str4='Hello, "${test_word}"! \n'
echo -e str4 ${str4}
str5='Hello, '${test_word}'! \n'
echo -e str5 ${str5}
str6='Hello, ${test_word}! \n'
echo -e str6 ${str6}
str7='Hello, '${test_word}
echo -e str7 ${str7}
str8='Hello, '"world! \n"
echo -e str8 ${str8}

输出

str1 Hello, world! 

str2 Hello, 'world'! 

srt3 Hello, world! 

str4 Hello, "${test_word}"! 

str5 Hello, world! 

str6 Hello, ${test_word}! 

str7 Hello, world
str8 Hello, world! 

从上面7个例子我们可以总结出:
1.在双引号里的字符串中,可以直接引用变量,而单引号不行,如str3,str6;
2.在双引号里的字符串中的单引号是会被原样打印出来的,单引号中的双引号同样如此,如str2,str4;
3.两个字符串放到一起会被拼接,无论是双引号中的还是单引号中的,或者是变量,如str1、str5、str7、str8.

获取字符串长度

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

提取子字符串

string="test abcd"
echo ${string:5:9}
#输出
abcd

注意序号从0开始

查找子字符串

查找ba中最先出现的字符

string="test abcd"
index=`expr index "${string}" "ba"` #`是反引号,不是单引号'
echo ${index} #输出6,因为a在b前出现

数组

shell支持数组,只支持一维数组,不支持多维数组。
shell中的数组类似于c语言,数组元素的下标从0开始编号,获取数组中的元素需要引用下标,被引用的下标可以是整数或者算数表达式,其值应该大于等于0。

定义数组

shell中使用括号()来表示数组,数组元素使用“空格”分隔开。定义数组的一般形式为:

数组名=(元素1 元素2 元素3 元素4 ...元素n)
#或者
数组名=(
元素1
元素2
元素3
元素4
...
元素n
#或者单独定义数组中各个元素的分量,可以使用不连续的下标,并且下标的范围没有限制
数组名[0]=元素1
数组名[1]=元素2
...
数组名[n-1]=元素n
)

读取数组

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

${数组名[下标]}
可以使用@或者*代替下标获取数组中所有元素
${数组名[@]}
${数组名[*]}
array1=(0 1 2 3)
echo ${array1[0]}
echo ${array1[3]}
echo ${array1[@]}
echo ${array1[*]}
array2=(0
1
2
3)
echo ${array2[0]}
echo ${array2[3]}
echo ${array2[@]}
echo ${array2[*]}
array3[0]=0
array3[3]=3
echo ${array3[0]}
echo ${array3[3]}
echo ${array3[@]}
echo ${array3[*]}

输出

0
3
0 1 2 3
0 1 2 3
0
3
0 1 2 3
0 1 2 3
0
3
0 3
0 3

获取数组的长度

获取数组长度与获取字符串长度的方式相同。

array[0]="123"
array[3]="345"
echo ${#array[@]}
echo ${#array[*]}
echo ${#array[3]}

输出

2
2
3

注释

被注释的代码不会执行

单行注释

使用#加到一行开头进行单行注释

# 这是一行注释
# echo "123"

多行注释

:<<!
array1=(0 1 2 3)
echo ${array1[0]}
echo ${array1[3]}
!
echo ${array1[@]}
echo ${array1[*]}

使用

:<<字符
字符

来进行多行注释,其中的符号可以是任意字符或者符号(<除外)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值