目录
前序:shell中的输入和输出
1.输入
read var
read var1 var2 两个值之间用空格或者tab键 不能用回车
read -p "提示字符串" var
read -t 秒 var 多少秒后如果没有输入就结束
read -n num var 输入num个字符后结束输入
read -s var 输入的内容不回显 类似于输入密码
2.输出 -----> echo
1.shell中的算数运算
shell进行算数运算效率不如C语言高
shell兼容C语言的所有算数运算,同时进行了扩展
**(幂运算) *(通配符) \*(乘法) ()(数组) \(\)括号
某些运算符需要进行转义才能使用
shell中所有变量都是字符串,所以要进行转换
1>(())
2>$ []
3>let
4>expr
1.(()) 进行算数运算
格式:((表达式1,表达式2,表达式3 ......))
最后一个表达式的结果是输出的结果
获取输出的结果
var=$((表达式1,表达式2,表达式3 ......))
注:
1>括号中表达式使用变量时,$可加可不加,建议加
2>运算符的前后的空格 可加可不加
3>括号内可以写C语言的任何运算,甚至更复杂的运算
2.$[]
1>格式:ret=[表达式1,表达式2,.........]最后一个表达式的结果作为整个表达式的结果
2>$[]进行运算时,必须有一个变量来接收其返回值
3>在运算符内使用变量时,$可加可不加
4>运算符前后的空格 可加可不加
3.let
1>格式:let sum=var1运算符var2
2>let必须放到最前边
3>运算符两边不可以有空格
4>使用变量时,$可加可不加
expr
1>格式
expr 表达式
2>使用变量时,必须加$
3>运算符的前后必须加空格expr $var1 + $var2
expr 是一个 命令
$var1 + $var2 是命令的3个参数
4>expr不能进行自增自减的运算
expr $var1++ #Error
expr $var1 + 1 #OK
5>expr使用部分运算符必须进行转义
\* \> \< \(\) .....
需要转义的运算符也可以加单引号''
6>expr中使用变量时,最好使用双引号将变量括起来
expr $var1" 运算符 "$var2"
7>如何将expr的结果赋值给一个变量
ret=`expr "$var1" 运算符 "$var2" `
8>算数运算符
$arg1 \> $arg2成立返回1,不成立返回0
$arg1 \< $arg2
$arg1 \>= $arg2
$arg1 \<= $arg2
$arg1 != $arg2
$arg1 = $arg2
$arg1 +|-|\*|/|% $arg2
以上运算符使用变量时可以不加双引号
"$arg1" \| "$arg2" 只要两个变量有一个不为空或者非0,就会返回arg1的值,否则返回0
"$arg1" \& "$arg2"只有两个变量都为真(变量不为空或者0),才会返回arg1的值,否则返回0
进行|和&运算时,使用变量时必须使用双引号。
字符串的运算
expr match STRING REGEXP
从STRING字符串中第一个字符开始匹配REGEXP字符串,匹配成功返回匹配的字符的个数,失败返回0
expr substr STRING POS LENGTH:从STRING字符串中第POS位置开始截取,截取的长度为LENGTH,将截取的字符串返回,(注:字符串的第一个字符从1开始)
expr index STRING CHARS:查找CHARS字符在STRING字符串出现的位置,返回值是字符串的下边(注:字符串的第一个字符从1开始)如果一个字符串中有多个相同字符,匹配到第一个就会结束
expr length STRING:计算STRING字符串的长度
${#str}---》计算字符串的长度
if语句
1.格式
if [ 表达式 ] 写到一行: if [ 表达式 ] ; then
then
语句
elif [ 表达式 ] 写到一行: elif [ 表达式 ] ; then
then
语句
else
语句
fi
[] 本质是 调用test命令,man test 里边的变量或参数要用变量隔开
if [ 表达式 ] <====> if test 表达式
(1)字符串对象(⼀定要注意在进⾏字符串的判断的时候都需要加上“”,“$a” "hello")
-z 判断字符串是否为空
-n 判断字符串是否为⾮空
=或== 都是⽤来判读字符串是否相等
!= 不等于
\> ⼤于 (防⽌误认为重定向)
\< ⼩于
(2)数字对象
-eq : 等于
-ne : 不等于
-gt : ⼤于
-lt : ⼩于
-ge : ⼤于等于
-le : ⼩于等于
(3)⽂件属性
-b filename 判断⽂件是否存在,是否是块设备
-c filename 判断⽂件是否存在,是否是字符设备
-d filename 判断⽂件是否存在,是否是⽬录
-f filename 判断⽂件是否存在,是否是普通⽂件
-p filename 判断⽂件是否存在,是否是管道⽂件
-L filename 判断⽂件是否存在,是否是链接⽂件 (经测试链接⽂件也是普通⽂件)
-S filename 判断⽂件是否存在,是否是套接字⽂件
-e filename 判断⽂件是否存在
-s filename 判断⽂件是否存在,判断⽂件是否为空
(4)⽂件权限
-r filename 判断⽂件是否存在,是否有可读权限
-w filename 判断⽂件是否存在,是否有可写权限
-x filename 判断⽂件是否存在,是否有可执⾏权限
(5)⽂件⽐较
-nt ⽂件是否更新
-ot ⽂件是否更旧
-ef ⽂件的inode是否⼀致
[ filename1 -nt filename2 ]
(6)逻辑运算
-a 与 &&
-o 或 ||
! ⾮ !
case in
等价于C语言的switch case 语句
case $var in
表达式)
语句
;; <==============> break
表达式)
语句
;;
*) <==============> default
语句
;;
esac
表达式的形式:
[a-zA-Z] ====>a-z和A-Z 之间的所有字符(通配一个)
[1-9] ====>数字1-9
* ====>所有
a|b|t|i ====>a b t i 任意一个字符
Y|y|Yes| yEs ====>通配任意一个字符串
While
while [ 表达式 ]
do
语句
done
for
方式1:
for ((表达式1;表达式2;表达式3))
do
语句
done
方式2:
for var in 单词列表 单词列表每个以空格隔开的字符赋值给var,直到全部赋值
do
语句
done
select in
为了更好的提高代码的交互性
select var in 选项列表
do
语句
done
常和case连用
shell 函数
1.shell中函数的语法格式
function 函数名(){
函数体
}
注:
1> shell中的函数使用function进行修饰,function可写可不写,建议写
2> shell中的函数没有返回类型,如果接收shell函数的返回值呢?
2.1> shell中定义的变量默认就是全局的变量,可以直接使用
2.2>如果shell中的变量使用local定义为局部的变量
可以使用return进行返回,return返回只能返回0-255之间的数。接收返回值使用$?
$?可以获取上一条指令的执行结果
2.3>在函数中可以使用echo命令输出函数的返回值
接收函数的返回值时,使用命令置换符``,获取函数的返回结果。
3>函数的形参
shell的函数不需要形参列表,但是可以给函数传递实参
在shell函数内如何获取给shell函数传递的实参值呢?使用位置变量
4> shell中的函数依然要向c中的函数遵循先声明定义,后使用的原则
但是shell中的函数都是声明和定义写到一起
及she17中的函数的定义应该写到函数调用的前边
5. shell中的函数的调用
函数名 实参列表
#!/bin/bash
function arr_sum(){
local sum=0
for p in $*
do
((sum=sum+$p))
done
echo $sum
}
read -p "请输入一个数组:>" -a arr #-a是输入一个数组的参数
value=`arr_sum ${arr[*]}`
echo $value