shell——变量

发布时间:2023年12月20日

shell是C语言编写的程序,所以shell脚本和其他变成语言一样,都存在变量。shell编程中,变量是用来存储数值的名称。

变量名的规范

变量名和其他语言一样,由字母数字下划线构成。

?但是,任然有需要遵循的其它规则:

1.不能以数字开头。

2.避免使用shell关键字:如if、then、else、fi、for、while等,容易引起混淆。

3.常量一般用大写字母表示:PI=3.14

4.避免使用特殊符号:使用符号就选择下划线,不然可能与语法冲突。

5.避免使用空格:空格一般用于分隔命令和参数。

有效变量实例:

user="atong"
password="123456"
LD_LIBRARY_PATH="/bin/"
_add="abcd"
var3="abc"

无效实例:

if="where"
variable_$=11
!?var=111
user@name=atong
variable and kinds="dasa"

?等号赋值时也要注意空格不要随意使用

#有效赋值
variable_name=value
#无效赋值
variable_name = value

变量的使用

需要使用或调用定义了的变量,只需在变量名前加$符号即可,表示取它的值,如

my_name="atong"
echo $my_name
echo ${my_name}

变量名花括号{}是可选的,一般单独使用或独立成行不加,加上是为了使解释器识别变量边界,如

for fruit in China_fruit;do
    echo "I like to drink ${fruit}juice!"
done

这个很容易理解,不加{}变量就成了另一个变量,习惯加上{}既可以识别变量边界,也方便在多行代码迷糊眼睛时帮助区分出变量。

变量名重定义

在shell脚本中变量名的定义使用不唯一,已经定义过的变量可以被重新定义,可以理解为定义覆盖,也就是定义结果由后来的定义决定,验证:

cat myfirst_name.sh
#!/bin/bash
myfirst_name="dawang"
myfirst_name="xiaowang"
echo $myfirst_name
# sh myfirst_name.sh
xiaowang

只读变量

若要将定义过的变量设为不可再重定义,就将其为只读变量,使用readonly,其值就不能再被改变。验证:

cat test_for.sh
#!/bin/bash
myfirst_name="dawang"
readonly myfirst_name
myfirst_name="xiaowang"
echo $myfirst_name
# sh test_for.sh
test_for.sh: line 7: myfirst_name: readonly variable

删除变量

在脚本中加入unset可以删除已经定义的变量。

myfirst_name="atong"
unset myfirst_name
echo ${myfirst_name}

运行之后是没有输出的

变量类型

shell支持不同类型的变量,主要包括:

字符串变量

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

定义字符串,使用单引号''或者双引号"",如

first_string='The first step to success!Believe yourself!'
first_string="The first step to success!Believe yourself!"

整型变量

在shell中,你可以使用declare或者typeset命令来声明整数变量。

这种变量只包括整数值,如

declare -i my_integer=42

声明已经告知shell将my_integer视为整数,如果尝试将非整数值赋给它,shell会尝试将其转换为整数。

数组变量

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

支持的数组分为整数索引数组关联数组

整数索引数组

first_array=(1 2 3 4 5 6 7 11)

关联数组

declare -A test_array
test_array["name"]="atong"
test_array["gender"]="male"

环境变量

环境变量是由操作系统或者用户设置的特殊变量,用来配置shell的行为和影响程序执行环境。

如PATH包含了操作系统搜索可执行文件路径

echo $PATH

库文件的引用路径

echo $LD_LIBRARY_PATH

特殊变量

shell中有一些特殊变量具有其特殊含义,$0表示脚本名称,$1,$2等表示脚本参数,$#表示传递给脚本的参数数量,$?表示上一个命令退出状态等。

shell字符串

字符串是shell变成最有用最常用的数据类型,字符串可以用单引号,也可以用双引号。

单引号

str='this is a string'

单引号中的任何字符都会原样输出,当然单引号字符串中变量也就是无效的。

单引号字符串中不能出现单独的单引号(转义符转义也不行),但是可以成对出现,作为字符串拼接使用。

双引号

my_name="atong"
str="Welcome to Guiyang,\"$my_name\"! \n"
echo -e $str
# sh test.sh
Welcome to Guiyang,"atong"!

注意观察无转义符的变化,echo -e开启转义

my_name="atong"
str="Welcome to Guiyang,"$my_name"! \n"
echo -e $str
# sh test.sh
Welcome to Guiyang,atong!

双引号里可以有变量

双引号里可以出现转义符

拼接字符串?

双引号拼接

my_name="atong"
pinjie1="hello,"$my_name"!"
pinjie2="hello,${my_name}!"
echo $pinjie1 $pinjie2
hello,atong! hello,atong!

单引号拼接

my_name="atong"
pinjie1='hello,'$my_name'!'
pinjie2='hello,$my_name!'
echo $pinjie1 $pinjie2
hello,atong!hello,${my_name}!

获取字符串长度

echo ${#}字符串

str="1we3"
echo ${#str}

输出为4

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

?提取字符串

str="wo ai beijing tiananmen"
echo ${str:3:10}

输出为ai beijing,意为从第4个字符开始截取10个字符。

索引值从0开始

查找子字符

查找字符e位置(默认计算优先出现的字符)

str="I love you"
echo `expr index "$str" e`

输出出现位置为6(expr查找位置从1开始)

脚本中``是反单引号,用来引用命令,不是''

shell数组?

bash支持一维数组,且没有限定数组大小。

与其他语言类似,数组元素下标由0开始。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值大于等于0。

定义数组

在shell中用括号来表示数组,数组元素用空格隔开。

array_name=(v0 v1 v2 v3 v4)

也可以换行

array_name=(
v1
v2
v3
v4
)

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

array_name[0]=v0
array_name[1]=v1
array_name[2]=v2
array_name[3]=v3
array_name[4]=v4

可以不使用连续的下标,下标范围无限制

读取数组?

读取数组格式

value=${array_name[n]}

使用@符号获取数组中的所有元素

echo ${array_name[@]}

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

获取数组元素个数

length=${#array_name[@]}
#或者
length=${#array_name[*]}

获取数组单个元素的长度

length=${array_name[n]}

注释?

shell脚本在行首加#号就是注释,加上后该行会被解释器忽略。

#version:v1
#author:atong
#date:2023-11-11

当然,当遇到注释的行需进行代码调试,不断加#注释很麻烦,如果需要,可以将需要注释的内容用花括号括起来,第一为函数,需要时对其调用,不调用也就不会生效,也能达到注释的效果。

?多行注释

使用Here文档

:<<EOF
需要注释的内容
需要注释的内容
需要注释的内容
EOF

:是一个空命令,用于执行后面的Here文档,<<EOF表示开启Here文档,COMMENT是Here文档中的标识符,在这两个标识符之间的内容都会被视为注释,不会被执行。

:<<'COMMENT'
这是注释的内容
随便吧,我有点累了
COMMENT

:<<'
这是一个示例
这是一个示例
'

:<<!
还是示例
还是示例
!

直接使用:号,用单引号将多行括起来也可以注释。

格式 冒号+空格+单引号

: '
这依然是注释的部分,
想写多少行就写多少行
估计学累了,马上这部分就完了
'

文章来源:https://blog.csdn.net/T3212379478/article/details/135081125
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。