Linux shell 变量

294 阅读3分钟

Shell变量

定义变量

定义变量时,变量名不加美元符号,如:

name="xiaodouzi"

注意,变量名和等号之间不能有空格。

除了显式直接赋值,还可以用语句给变量赋值,如将/etc 下目录的文件名循环出来

 for file in 'ls /etc'for file in $(ls /ect)

使用变量

使用一个定义过的变量,只要在变量名前加美元符好即可,如:

name="xiaodouzi"
echo $name
echo ${name}

变量名外面的花括号是可选的,,加花括号是为了帮助解释器识别变量的边界,如下面这种情况:

for skill in ada coffe action java;do
    echo  "I am good at ${skill}script"
done

如果不给skill变量加花括号,写成 echo "I am good at $skillscript",解释器就会把$skillscript 当成一个变量,代码执行结果就不是预期的样子了

已定义的变量,可以被重新定义,如:

name=xiaodouzi"
echo ${name}
name="pangpang"
echo ${name}

这样写是合法的,但注意,第二次赋值的时候不能写成name="pangpang",使用变量的时候才加美元符号()

只读变量

使用readonly命令可以将变量定义为只读变量,只读变量的值不能被该变,如下:

readonly name="xiaodouzi"
echo ${name}
name="吃饭睡觉打豆豆"
echo ${name}

运行脚本,结果如下:

xiaodouzi
script.sh: line 8: name: readonly variable

删除变量

使用unset删除变量。语法

unset variable_name 变量被删除后不能再次使用,unset命令不能删除只读变量,如下:

#!/bin/bash
readonly id=000001
name="xiaooduzi"
sex=0
echo ${id},${name},${sex}
unset sex # 删除变量
echo ${sex}
unset i

运行脚本,结果如下:

000001,xiaooduzi,0

script.sh: line 8: unset: id: cannot unset: readonly variable

变量的类型

运行shell时,会同时存在三种变量:

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

shell 字符串

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

单引号

str='this is string'

单引号字符串的限制:

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

双引号

#! /bin/bash
name='runoob'
str="hello, I know you are \"${name}\"!\n"
echo -e $str

输出结果为:

hello, I know you are "runoob"!

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串

name="xiaodouzi"
string="hello,\"${name}\"!"
string1='hello,'${name}'!'
echo $string,$string1

执行结果:

hello,"xiaodouzi"!,hello,xiaodouzi!

获取字符串长度

name="xiaodouzi"
echo ${#name}

输出 9

提取子字符串

一下实例从字符串第3个字符开始截取取4个字符:

name="xiaodouzi"
echo ${name:2:4}

输出 aodo

第一个字符的索引值为0

查找子字符串

查找字符i或o的位置

name="xiaodouzi"
echo `expr index ${name} io`

输出 2

shell 数组

bash 支持以为数组(不支持多为数组),并且没有限定数组的大小

定义数组

在shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 值n)
或者
array_name=(
value0
value1
value2
value3
)

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

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用连续的下标,而且下标的范围没有限制

读取数组

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

{数组名[下标]}
使用@符号可以获取数组中的所有元素,例如:
echo{array_name[@]}

获取数组的长度

#获取数组元素的个数
length=${#array_name[@]}
length=${#array_name[*]}
#获取数组单个元素的长度
length=${#array_name[n]}

shell 注释

单行注释

以#开头的就是行注释,会被解释器忽略

多行注释

多行注释还可以使用一下格式:

:<<EOF
注释内容
EOF

EOF也可以使用其他符号:

:<<!
注释内容
!