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变成最有用最常用的数据类型,字符串可以用单引号,也可以用双引号。
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开始)
脚本中``是反单引号,用来引用命令,不是''
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
:<<'
这是一个示例
这是一个示例
'
:<<!
还是示例
还是示例
!
直接使用:号,用单引号将多行括起来也可以注释。
格式 冒号+空格+单引号
: '
这依然是注释的部分,
想写多少行就写多少行
估计学累了,马上这部分就完了
'