Linux》》Shell脚本 基本语法
执行脚本的三种方式
查找变量的过程
变量引用的顺序》》先从当前进程查询变量,如果当前进程没有此变量,默认去父进程查找这个变量。如果查找到则返回,否则一直查找到 祖宗(PID为1),还没有,则就没找到。
export修饰变量,则表明这个变量对子进程是可见的。或者说 用export 修饰的变量,可以转递给子进程。
运算符
# $((算式)) 是新语法 或 $[ 算式 ] 就语法 不推荐
# $((算式)) 中的算式 可以用数学中 >=、*等 变量可省略 $ 用途场景 数学运算、数值比较 不支持浮点型
# $[ 算式 ] 大于 -gt,小于 lt等 变量可省略 $ 用途场景 文件属性 、字符串
test
test expression
或者使用方括号的简写形式:
[ expression ] 这种更常用
注意:使用方括号格式时,表达式与方括号之间必须有空格,即 [空格EXPRESSION空格]
[ ] 》》》1, 即false
[ xx ] 》》0 ,即true
当 test 判断的表达式为真时,返回状态码为 0;如果为假,则返回非 0 值。
功能
test 命令可以进行以下几种类型的测试:
数值比较:检查两个数值之间的关系。
字符串比较:检查字符串是否相等或为空。
文件测试:检查文件是否存在、是否可读、是否可写等。
常用选项
数值比较
-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
# 数值比较
#!/bin/bashnum1=10
num2=20if test $num1 -lt $num2; thenecho "$num1 小于 $num2"
elseecho "$num1 不小于 $num2"
fi
字符串比较
=:字符串相等
!=:字符串不相等
-z:字符串为空
-n:字符串非空
# 字符串比较
#!/bin/bashstr1="hello"
str2="world"if [ "$str1" = "$str2" ]; thenecho "字符串相同"
elseecho "字符串不同"
fi
文件测试
-e:文件存在 existence
-f:文件是普通文件 file 文件存在且是一个普通的文件
-d:文件是目录 directory 文件存在且是一个目录
-r:文件可读 read
-w:文件可写 write
-x:文件可执行 execute
# 文件测试
#!/bin/bashFILE="/etc/passwd"if [ -e "$FILE" ]; thenecho "文件 $FILE 存在"
elseecho "文件 $FILE 不存在"
fi
&& 、|| 跟高级语言 and ,or 一样, 还称短路 运算符
条件1 && 条件2 》》 如果条件1为 真 true,则会继续判断 条件2 》》 如果条件1为 假 false ,则不会执行 条件2
条件1 || 条件2》》 如果条件1为 真 true,则不会执行 条件2 》》 如果条件1为 假 false ,则会继续判断 条件2
》》多重判断条件
流程控制
if 判断
############# 单分支 ############
if [ condition ];thencommand
fi
# 或者
if [ condition ]
thencommand
fi
############ 多分支 ############
if [ condition ]; thencommand
elif [ condition ]
thencommand
else command
fi
case
相当于 C# 中 switch case
;; 相当于 break
*) 相当于 default
case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;
esac
#!/bin/bash
while true
do
echo "请录入成绩的等级"
read num
case $num inA) echo "优秀";;B) echo "良好";;C) echo "及格";;*) echo '不及格';;
esac
done
~
for
# 语法1
for (( 初始值; 循环控制条件; 变量变换 ))
docommand
done
# 例子
for((i=0;i<5;i++))
# 语法2
for var in item1 item2 ... itemN
docommand1command2...commandN
done
# 例子
for i in {0..4}
for i in `seq 0 4`
# 也可以写成一行
for var in item1 item2 ... itemN; do command1; command2… done;
#!/bin/bash
for (( i=1;i<=100;i++))
dosum=$((sum + i)) # 或 sum=$[ $sum + $i]
done
echo $sum
while
# 基本语法
while [ 条件判断式 ]
docommand
done# 案例
#!/bin/bash
i=0
while [ $i -lt 101 ]
do((sum2=sum2+i))((i++))#或者# let sum2+=i# let i++# 或者换成 这种是旧语法 不推荐 # sum2=$[ $sum2 + $i ]# i=$[$i + 1]
done
echo $sum2
》》# 旧语法(不推荐)
result=$[4 * (5 + 1)]
》》# 新语法(推荐)
result=$((4 * (5 + 1)))
read 读取控制台输入
# 基本语法
read (选项) (参数)
选项:-p 指定读取值时的提示符-t 指定读取值时等待的时间(单位秒),如果不加 -t,表示一直等下去
参数:变量: 指定读取值的变量名 (读取的赋给那个变量) 这个不能省略