变量
- 定义变量的时候,变量名无需添加
$; 使用变量的时候才加$。 - 变量名和等号之间不能有空格;
- 命名只能英文字母、数字、下划线组合。不能数字开头;
- 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
your_name='test' #定义
echo $your_name
echo ${your_name}
- 只读变量: 使用
readonly
myUrl='www.juejin.cn'
readony myUrl
- 删除变量:
unset, 变量被删除后不能被再次使用,unset命名不能删除只读变量。
unset your_name
字符串
- 单引号: 原样输出,变量无效;
- 双引号: 可引用变量,可以出现转义字符;
- 字符串拼接:
name='juejin'
message='hello,'$name' !' #单引号拼接
message="hello,"$name" !" #双引号拼接
message="hello, ${name} !"
- 获取字符串长度:
${#name} - 提取子字符串
str='https://juejin.cn/editor/drafts'
# 从左边第几个字符开始,及字符的个数(从下标为8开始的字符截取6个字符串)
echo ${str:8:6}
# 从左边第几个字符开始,一直到结束。
echo ${str:8}
# 从右边第几个字符开始,及字符的个数
echo ${str:0-13:6}
# 从右边第几个字符开始,一直到结束。
echo ${str:0-13}
# 删除左边的,保留右边的 # 左边第一个/
echo '删除左边' ${str#*/}
echo '删除左边' ${str#*/editor}
# 删除左边,保留右边 ## 右边第一个/
echo '删除左边' ${str##*/}
# 删除右边,保留左边 % 第一个
echo '删除右边' ${str%/*}
echo '删除右边' ${str%/drafts}
# 删除右边字符,保留左边字符 %% 最后一个
echo '删除右边' ${str%%/*}
数组
- 支持一维数组(不支持多维数组),并且没有限定数组的大小。
数字名=(值1 值2);
arr=(1 2 3); - 可以不使用连续的下标,而且下标的范围没有限制。
arr[10]=10 - 数组元素读取:
${数组名[下标]}
${arr[0]} - 获取全部元素:
@*echo ${arr[@]}
echo ${arr[*]} - 获取数组长度:和获取字符串长度方法相同
arr=(1 2 3)
echo ${#arr[@]}
echo ${#arr[*]}
注释
- 单行注释:
# - 多行注释:
:<<EOF
注释
注释
EOF
:<<'
注释1
注释1
'
:<<!
注释2
注释2
!
参数传递
- $n:脚本内获取参数。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数;
- $0:为执行的文件名(包含文件路径);
- $?:显示最后命令的退出状态。0:没有错误。
- $#:参数的个数
echo '第一个参数:' $0
echo '参数的个数' $#
echo '最后命名的退出状态:' $?
if [ $? ];then echo '成功' ; else echo '失败'; fi ;
echo '脚本运行的当前进程ID号' $$
echo '后台运行的最后一个进程的ID号' $!
- $:以一个单字符串显示所有向脚本传递的参数。
- ***相同,但是使用时加引号,并在引号中返回每个参数。
function a(){
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
}
function b(){
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
}
a 1 2 3
b 2 4 6
- 判断参数
echo '第一个参数:' $1
if [ -n "$1" ]; then
echo "包含第一个参数";
else
echo "没有包含第一参数";
fi;
echo '第一个参数:' $1
if [ "$1" ]; then
echo "包含第一个参数";
else
echo "没有包含第一参数";
fi;
运算符
算数运算符
- 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如
awk和expr,expr 最常用。 - 乘号
*前边必须加反斜杠\才能实现乘法运算;
a=11
b=5
echo '和' `expr $a + $b`
echo '差' `expr $a - $b`
echo '积' `expr $a \* $b` # *需要进行转义
echo '商' `expr $a / $b`
echo '余' `expr $a % $b`
关系运算符
-eq -ne -gt -ge -lt -le
布尔运算符
- ! 非
- -o : 或or
- -a : 与and
逻辑运算符
- &&:逻辑and
- ||: 逻辑OR
字符串运算符
=检测两个字符串是否相等,相等返回true。!=检测两个字符串是否不相等,不相等返回true。-z检测字符串长度是否为0,为0返回true。-n检测字符串长度是否不为0,不为0返回true。$检测字符串是否为空,不为空返回true。
str1="123456"
str2="efg"
if [ $str1 = $str2 ]
then
echo "$str1 = $str2 : str1 等于 str2"
else
echo "$str1 = $str2: str1 不等于 str2"
fi
if [ $str1 != $str2 ]
then
echo "$str1 != $str2 : str1 不等于 str2"
else
echo "$str1 != $str2: str1 等于 str2"
fi
if [ -z $str1 ]
then
echo "-z $str1 : 字符串长度为 0"
else
echo "-z $str1 : 字符串长度不为 0"
fi
if [ -n "$str1" ]
then
echo "-n $str1 : 字符串长度不为 0"
else
echo "-n $str1 : 字符串长度为 0"
fi
if [ $str1 ]
then
echo "$str1 : 字符串不为空"
else
echo "$str1 : 字符串为空"
fi
if 判断
if的基本语法:
if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi
文件/文件夹(目录)判断
- [ -d DIR ] 如果 FILE 存在且是一个目录则为真。
- [ -e FILE ] 如果 FILE 存在则为真。
字符串判断
- [ -z STRING ] 如果长度为零则为真 ,即判断是否为空,空即是真。
- [ -n STRING ] 如果长度非零则为真 ,即判断是否为非空,非空即是真。
- [ STRING1 = STRING2 ] 如果两个字符串相同则为真。
- [ STRING1 != STRING2 ] 如果字符串不相同则为真。
- [ STRING1 ] 如果字符串不为空则为真,与-n类似。
str1='123'
str2='123'
str3='1234'
if [ $str1 = $str2 ]
then
echo '相等';
else
echo '不相等';
fi
if [ $str1 != $str3 ]
then
echo '不相等';
else
echo '相等';
fi
数值判断
-eq: = equal to 等于-ne: != not equal to 不等于-ge: >= greater than or equal to 大于等于-gt: > greater than 大于-le: <= less than or equal to 小于等于-lt: = less than 小于
for循环
for的基本语法:
for 循环变量
do
循环语句
done
数字型
# for ((i=1;i<10;i++)) #方式一
# for i in $(seq 2 8) #seq 开始 结束
for i in {2..9} #{开始..结束}
do
echo $i
done
字符型
# for i in `ls`
# for i in '1 23 45' #空格作为分隔
for i in 1 23 45
do
echo $i
done
for in语句与` `和$( )合用,利用` `或$( )的将多行合为一行的缺陷,实际是合为一个字符串。