变量使用echo $aecho ${b}echo "$a"
使用$var或${var}来访问变量。后者更为严谨。$var_x ${var}_x 是不同的。
变量不需要定义也可以使用。引用未定义的变量,默认为空值。
数组变量array=(1 3 4 6)array=(``、``ls``、)echo ${array[2]}echo ${array[*]}echo ${#array[*]}
使用0来定义数组变量,中间使用空格隔开
特殊符号的使用
双引号用于括起一段字符串值,支持$var形式的变量替换
单引号也表示其内容是字符串值,不支持转义
\反斜线,某些情况下表示转义
((a=a+3))是整数扩展。把里面的变量当作整数去处理。
{1..10}等价于seq 1 10,表示1到10
seq 1 3 10表示生成一个1到10,步进为3
变量类型
字符串a=”xx”
数字 i=1314
布尔 a=true b=false
字符串操作
取值
${value:offset} ${value:offset:length}从变量中提取子串
${#value}字符串长度
${#array[]}和${#array[@]}表示数组中元素的个数
*掐头去尾与内容替换
${value#pattern} ${value##pattern} #表示掐头
${value%pattern} ${value%%pattern} %表示去尾
${value/pattern/string} ${value//pattern/string} / 表示替换
#与## %与%% /与//的区别:最短匹配模式VS最长匹配模式
${var/#Pattern/Replacement} ${var/%Pattern/Replacement}
算术判断
[ 2 -eq 2 ]相等
[ 2 -ne 2 ]不等
[ 3 -gt 1 ]大于
[ 3 -ge 3 ]大于等于
[ 3 -lt 4 ]小于
[ 3 -le 3 ]小于等于
(())也可以表示算术比较o ((10>=8)),((10==10))
字符串⽐较
[ string1 = string2 ] 如果两字符串相同,则结果为真
[ string1 != string2 ] 如果两字符串不相同,则结果为真
[ -n “$var” ] 如果字符串不是空,则结果为真
[ -z “$var” ] 如果字符串是空,则结果为真
[[ “xxxx” == x* ]] 在表达式中表⽰0或者多个字符
[[ xxx == x?? ]] 在表达式中表⽰单个字符
在引⽤变量的时候要记得加双引号[ -z “$a”] 否则当a未定义时会语法报错
逻辑判断
[ 2 -ge 1 -a 3 -ge 4 ];echo $?与
[ 2 -ge 1 -o 3 -ge 4 ];echo $?或
[[ 2 -ge 1 && 3 -ge 4 ]];echo $?与
[[ 2 -ge 1 II 3 -ge 4 ]];echo $?或
[ ! 2 -ge 1 ];echo $?非
内置判断
-e file如果文件存在,则结果为真
-d file如果文件是一个子目录,则结果为真
-f file如果文件是一个普通文件,则结果为真
-r file如果文件可读,则结果为真
-s file如果文件的长度不为0,则结果为真
-w file如果文件可写,则结果为真
-x file如果文件可执行,则结果为真
[[]]是[]的扩展语法,在老的sh里并不支持。推荐用[]
逻辑控制
条件if
分支case
循环 for while until select
Break 和 continue
有生之年也许你只需要用到if、for、while
if结构
if [ condition ] ;then
if [ condition ] ;then …;else …;fi
if [ condition ] ;then …;elif …;fi
简单的逻辑可以使用&& ||去替代
条件可以用命令返回值代替
For循环
for(( cl ; c2 ; c3 ));
do
…;
done
for((i=0;i<10;i++));do echo $i;done
While循环
i=0;while [ $i -lt 3 ] ;
do echo $i;
((i=i+1));done
一个有用的小技巧。一行行的读取文件内容
while read line;
do echo $line;
done < /tmp /tmp
