目录
- 语法
- 引号
- expr
- test
- if...then...fi
- if...elseif...else
- if嵌套
- case…esac
- for
- while
- break 和 continue
- 函数
语法
引号
-
" "
:如果有字符串,字符串原样输出,如果有$变量则查看变量的值 -
' '
:所有的字符无论是否有变量都原样输出 -
ˋˋ:在该引号包含的范围内部都按照命令执行
1 + 1
==>expr 1 + 1
expr
expr
命令一般用于整数值,但也可用于字符串。
-
算术运算
+ - \* \
num=9
sum=`expr $num \* 6`
echo $sum
注意:
1、不能用()
,使用\( \)
2、乘法运算\*
需要屏蔽原*号含义(匹配字符),例如expr 12 + 5 \* 1
3、在运算符与运算数之间要有空格
-
逻辑运算
& |
-
比较运算
< <= = == != >= >
,其中< >
要用\< \>
-
字符串匹配
string : REGEX
, 使用REGEX
匹配string
,REGEX
被视为正则表达式(REGEX
隐含了^
,匹配从首字母开始)expr test.txt : \(.*\).txt # 输出匹配到的字符串 expr test.txt : te. # 输出匹配到的字符串数量
-
返回字符出现位置
index string chars
在shring
中查找chars
出现的位置expr index helloworld w
-
截取字符串
substr string pos len
从string
中取出从pos
位置开始长度为len
的子字符串expr substr helloworld 5 5
-
获取字符串长度
length string
获取string
的长度expr length helloworld
-
将关键字转为普通字符串
+
expr index + length g
test
test
语句可测试三种对象: 字符串、整数、文件属性
-
字符串:
s1 = s2
测试两个字符串的内容是否完全一样 s1 != s2
测试两个字符串的内容是否有差异 -z s1
测试s1 字符串的长度是否为0 -n s1
测试s1 字符串的长度是否不为0 -
整数:
a -eq b
测试a 与b 是否相等 a -ne b
测试a 与b 是否不相等 a -gt b
测试a 是否大于b a -ge b
测试a 是否大于等于b a -lt b
测试a 是否小于b a -le b
测试a 是否小于等于b -
文件属性:
-b name
测试name 文件是否是块设备文件
-c name
测试name 文件是否是字符设备文件
-d name
测试name 文件是否是目录文件
-f name
测试name 文件是否是普通文件
-L name
测试name 文件是否是连接文件
-S name
测试name 文件是否是套接字文件
-p name
测试name 文件是否是管道文件
-r name
测试name 文件是否存在且为可读
-w name
测试name 文件是否存在且为可写
-x name
测试name 文件是否存在且为可执行
-s name
测试name 文件是否存在且其长度不为0
f1 -nt f2
测试文件f1 是否比文件f2 更新
f1 -ot f2
测试文件f1 是否比文件f2 更旧
if…then…fi
语法结构为:
if 表达式
then 命令表1
else 命令表2
fi
例:
read A B
if [ $A -gt $B ]
then
echo "A 大于 B"
fi
注意:[]中的内容和[]要有间隔
if…elseif…else
if [ $A -gt $B ]
then
echo "A 大于 B"
elif [ $A -gt $B ]
then
echo "A 等于 B"
else
echo "A 小于 B"
fi
注意:else if(C语言) == elif
if嵌套
if [ $A -gt $B ]
then
echo "A 大于 B"
else
if [ $A -gt $B ]
then
echo "A 等于 B"
else
echo "A 小于 B"
fi
fi
注意:每一个if就对应一个fi ; if后面要加then,elif后面也要加then
case…esac
case $字符串变量名 in
模式1)
命令表1
;;
模式2)
命令表2
;;
……
模式n)
命令表n
;;
esac
case $SUM in
"10")
echo "score is A"
;;
*)
echo "sorry!you lost"
;;
esac
注意:
1、模式如果是字符串或者字符,用"“括起来
2、”;;"相当于C语言switch语句中的break
3、“*”代表除各种模式以外的其他情况,相当于C语言switch中的default
4、如果模式是文件名或者文件夹,直接以文件或者文件夹名作为模式名
5、case语句中的变量名要用“$”引用
for
for 变量名 in 单词表
do
命令表
done
for i in 1 2 3 4 5
for i in {1..5}
for ((i = 1;i <= 10;i++))
for i in `seq 100`
seq 用于产生从某个数到另外一个数之间的所有整数 例:seq 1 10 -w
表示生成的数位宽相同
注意:
1、{}表示单词表,其中内容与{}两头没有空格
2、单词表可以列出来
3、可以写成C语言格式的for循环,但是需要双()括起来
4、for循环这条语句中用到的变量名不用$引用
while
while 命令或表达式
do
命令表
done
例:
while [ $I -le 10 ]
do
SUM=`expr $SUM + $I`
I=`expr $I + 1`
done
break 和 continue
-
不带参数:
break循环只能退出最内层的循环。
continue只能去掉本次循环的剩余代码 -
带参数:
break N 可以退出N层循环
continue N 将会把N层循环剩余代码都去掉,单循环次数不变。
函数
定义格式:
(1)
function_name ( )
{
command1
……
commandn
}
(2)
function function_name ( )
{
command1
……
commandn
}
函数调用:
value_name=`function_name [arg1 arg2 … ]`