学习中遇到的知识点,做个记录。
#!告诉系统其后面的可执行程序即是解释运行此脚本的shell
如
#!/bin/sh
#1/bin/bash
变量
变量命名
变量命名必须遵守如下规则
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
使用变量
定义变量时,变量名和等号间不能有空格。
使用变量时只需要在变量前加$符号即可
如:
test_var="hello"
echo $test_var
echo ${test_var}
变量名外的{}是为了更好的区分变量名的边界
变量类型
运行shell时,以变量作用域划分,会同时存在三种变量:
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- 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[*]}
使用
:<<字符
字符
来进行多行注释,其中的符号可以是任意字符或者符号(<除外)