在shell脚本的开头使用#!/bin/bash
,系统会自动使用bash
作为解释器进行解释执行。
一、变量
1. 定义、赋值和使用
1 | your_name="wl" |
注意:
- 变量名和等号之间不能有空格
- 只能使用英文字母、数字和下划线,不能以数字开头,不能使用保留关键字
在变量名前加上$即可以使用该变量
1 | my_name="wl" |
变量是否使用{}
包起来都是可以的,只是大括号可以更好地区分变量名的边界,比如在下面情况下不使用{}
则会误以为引用的是skillScript
变量
1 | for skill in Ada Coffe Action Java; do |
变量赋值和定义类似:
1 | my_name="wl" |
使用readonly
关键字可以定义只读变量,无法对变量进行修改和删除1
2
3my_name="wl"
readonly my_name
my_name="wangliu" # 报错
可以使用unset
删除变量
1 | my_name="wl" |
2. shell字符串
单引号和双引号
1 | str='this is a string' |
单引号限制:
- 原样输出,单引号字符串中的变量是无效的
- 不可以单独出现单引号,即使转义也不OK,但是用单引号做字符串拼接除外
对应的,双引号的优点:
- 可以用变量
- 可以出现转义字符
字符串拼接时可以使用单引号或者双引号,比如:
1 | your_name="runoob" |
字符串操作
使用#
获取长度
1 | string="abcd" |
使用 :
截取字符串
1 | string="runoob is a great site" |
查找字符串:
1 | string="runoob is a great site" |
3. shell 数组
bash只支持一维数组,不支持多维数组。
在shell中用括号表示数组,使用空格分隔数组元素,使用[]
下标获取数组元素,下标从0开始,@表示所有,不支持获取连续下标;#
可以获取数组长度。
1 | names=("wangliu" "wl") |
二、命令行参数处理
处理命令行参数的主要几种用法如下所示:
1 |
|
运行结果为:
1 | $ ./test.sh 1 2 3 |
$*
和$@
的区别:
- 仅仅在双引号中使用两者时才有区别
$*
会以"$1 $2 $3"
的形式输出,是一个参数$@
会以"$1" "$2" "$3"
的形式输出,是三个参数
示例代码为:
1 | echo "-- \$* 演示 ---" |
运行结果为:
1 | $ ./test.sh 1 2 3 |
三、运算符
原生的bash不支持简单的数学运算,可以通过awk和expr命令实现,其中expr较为常见。
1. 算数运算符
普通加减乘除取余运算符:
1 | a=10 |
运行结果:
1 | $ ./test.sh |
条件表达式 == 和 != 需要放在方括号之间使用,只用于数字的比较,且数字前后必须有空格。
1 | a=10 |
1 | $ ./test.sh |
2. 关系运算符
关系运算符只是用于数字之间的比较,值非数字的字符串不支持。和条件表达式类似,数字前后均需要有空格。
1 | a=10 |
1 | $ ./test.sh |
3. 布尔运算符
主要包括 !(非)、-o(或)、-a(与)
1 | a=10 |
1 | $ ./test.sh |
四、echo和printf
echo
显示换行等需要使用 -e 开启转义字符。
1 | echo -e "test \n" |
1 | test |
输出raw字符串,不进行转义和取变量:使用单引号。
1 | echo '$name \"' |
显示为
1 | $name \" |
printf
printf类似C中的printf函数,可以格式化字符串、设定对齐方式,且不自动添加换行符,而echo是会自动添加换行符的。
1 | printf "%-6s %-6s %-10s\n" name age height |
1 | $ ./test.sh |
- %s %d %f的用法和其他语言是相同的,分别表示字符串、整数、浮点数。
- -表示左对齐,如果缺省则表示右对齐。
- 6和10表示宽度为6字符和10字符,待显示字符串不足时则以空格填充,超过仍然会显示。
- .2f的用法和其他语言也相同,表示保留两位小数。
注意:
- 如果参数数量超过格式化字符串中的占位符,则多出的参数仍然会输出,且重复利用之前的格式
- 如果参数数量少于格式化字符串中的占位符,则 %s 使用 NULL 替代, %d 使用 0 替代。
- 格式化字符可以用双引号,单引号,也可以都不使用。
1 | # 双引号 |
1 | wl 25 |
五、test
test一般用于判断某个条件是否成立,可以进行数值、字符串和文件的判断。
数值
数值判断的参数:
- -eq 相等为真
- -ne 不等于为真
- -gt 大于为真
- -ge 大于等于为真
- -lt 小于为真
- -le 小于等于为真
1 | age1=10 |
1 | $ ./test.sh |
字符串
字符串判断时,只可以使用以下四种参数:
- = 或 == 等于为真(这个与大多数编程里不同)
- != 不等于为真
- -z 字符串长度为0时为真
- -n 字符串长度不为0时为真
1 | name1=wl |
1 | $ ./test.sh |
如果需要进行字符串之间的比较,可以使用转义形式,即 \<
和 \>
进行判断:
1 | name1=wl |
1 | $ ./test.sh |
文件
文件判断时,主要的参数有:
- -e 文件存在为真
- -r 文件存在且可读为真
- -w 文件存在且可写为真
- -x 文件存在且可执行为真
- -d 文件存在且为目录为真
- -f 文件存在且为普通文件为真
1 | cd ../ |
1 | $ ./test.sh |
逻辑操作符和[]
test一般会与if一起使用,可以使用[]代替test,比如
1 | cd ../ |
1 | $ ./test.sh |
在test和[]判断的条件中,可以使用与(-a)、或(-o)和非(!)进行条件逻辑连接,优先级方面,非(!)最高,与(-a)其次,或(-o)最低。
1 | cd ../ |
1 | $ ./test.sh |