Linux新手生存笔记[9]——shell脚本基础2-条件测试及控制流
来源:互联网 发布:c 程序员简历 知乎 编辑:程序博客网 时间:2024/04/23 18:51
回到全局目录
--------------------------------------------
1.条件测试1A.文件条件测试 2
B.字符串测试 3
C.数值测试 3
2.控制流 4
A.if-else 4
B.case语句 6
C.for循环 7
D.until循环 9
E.while循环 10
F.补充break&continue 11
1.条件测试
Test
命令用于测试字符串、文件状态和数字,也同控制流相结合
文件状态判断;
字符串比较;
数字比较;
逻辑判断;
语法
两种格式: test condition
或 [ condition ] 注意两边加了空格
中括号([])、参数之间必须有一个空格
逻辑运算符
-a
逻辑与
-o
逻辑或
!
逻辑否
&&, ||
示例:
1. 测试两文件是否均可读
$[ -w result.txt –a –w scores.txt ]
$echo $?
2. 测试两文件中其中一个是否可执行
$[ -x dream –o –x dream2 ]
3. 判断是否可写可执行
$[ -w dream –a –x dream ]
$echo $?
4. 判断文件是非可执行文件
$[ ! –x dream ]
5. [条件判断表达式1]&& [条件判断表达式2]|| [条件判断表达式3]
A.文件条件测试
文件条件测试
-d
目录
-f
普通文件(Regular file)
-L
符号链接
-r
Readable(文件、目录可读)
-b
块专用文件
-e
文件存在
-g
如果文件的set-group-id位被设置则结果为真
-s
文件长度大于0,非空
-z
文件长度=0
-w
Writable(文件、目录可写)
-u
文件有suid位设置
-x
Executable(文件可执行、目录可浏览)
-c
字符专用文件
-L
符号链接
示例
Set-uid位授予程序其拥有者的访问权限而不是其使用者的访问权限
Set-gid位授予了程序其所在组的访问权限
示例
1. 测试文件是否可写
$test –w dream
$echo $?
或者
$[ -w dream ]
2. 测试目录是否存在
$[ -d appsbin ]
3. 测试文件权限是否设置了suid
$[ -u dream]
if test –f fred.c if [ -f fred.c ]
then
…..
fi
B.字符串测试
字符串测试
字符串测试是错误捕获很重要的一部分,特别:测试用户输入或比较变量时尤为重要
五种格式:
test “str”
test str_operator “str”
test “str1” str_operator “str2”
[ string_operator str1 ]
[ string string_operator string2 ]
String_operator 字符串比较
=
两字符串相等
!=
两字符串不等
-z
空串 [zero]
-n
非空串 [nozero]
示例:
1. 测试环境变量是否为空
$[ -z $EDITOR ]
$echo $?
2. 测试是否为某字符串
$[ $EDITOR = “vi” ]
$echo $?
3. 测试
$TYPE=”/dev/rmt0”
$TYPE2=”/dev/rmt1”
$[ “$TYPE” = “$TYPE2” ]
$echo $?
C.数值测试
数值测试
格式
“number” numberic_operator “number”
或 [ “number” numberic_operator “number”]
Numberic_operator 算术比较
-eq
数值相等(equal)
-ne
不等(not equal)
-gt
A>B(greater than)
-lt
A<B(less than)
-le
A<=B(less、equal)
-ge
A>=B(greater、equal)
示例:
1. 比较相等
$NUMBER=130
$[ $NUMBER –eq 130 ] #$[ “$NUMBER” –eq “130” ]
$echo $?
2. 比较两变量
$SOURCE=13
$DEST=15
$[ “$SOURCE” –gt “$DEST”]
$echo $?
3. 直接比较数值
$[ 990 –le 995 –a 123 –gt 33 ]
2.控制流
If then else语句
格式
if 条件1
then
命令1
elif 条件2
then
命令2
else
命令3
fi
if 条件 if 条件;then
then 命令 等价 命令
fi fi
示例
1. 简单的if语句
$if [ “10” –lt “12” ]
> then
> echo “10 is less than 12”
>fi
2. 直接上命令
$if grep “dave” data.file > /dev/null 2>&1
>then
> echo “Dave in”
> else
> echo “Dave not in”
>fi
3. 测试文件拷贝是否成功
$if cp myfile myfile.bak
> then
> echo “Good copy”
> else
> echo “basename:$0:could not copy”
>fi
4. 当前目录测试
$DIRECTORY=`pwd` //反引号
$if [ “$DIRECTORY” != “/” ]
>then
> echo “Not root”
>exit 1
>fi
5. 文件权限测试
$LOGFILE=test.txt
$if [ ! –w “LOGFILE” ]
>then
> echo “you cannot write to $LOGFILE” >&2
>fi
6.变量设置测试
$if [ -z $EDITOR ]
>then
> echo “Your EDITOR environment is not set”
>else
> echo “Using $EDITOR as the default editor”
>fi
7.可以多个if 嵌套,但注意层次
$if [ -d $DIR]
>then
> cd $DIR
> if [ $? = 0 ]
> then
> do something
> fi
>fi
8.多个检测值
$if [ “$ANS” = “y” ] || [ “$ANS” = “Y” ]
注意:
if [ “$myvar” == “yes” ]; then
# do something ...
fi
检查变量
当不确定变量是否存在时,加双引号通常是安全的做法。
B.case
Case语句
格式:
case variable in
pattern [| pattern] …..)
命令….
;;
模式2)
命令…..
;;
*)
…….
;;
esac
注意,每个模式行都以双分号结尾
把最精确的匹配放在最前面
示例:
1. 简单的case语句
read ANS
case $ANS in
1)
echo “1”
;;
2)
echo “2”
;;
*)
echo “not right”
exit 1
;;
esac
2. 匹配模式使用
read ANS
case $ANS in
v100|v101)
echo “1”
;;
V102)
echo “2”
;;
*)
echo “not right”
exit 1
;;
esac
3. 提示输入y/n
read ANS
case $ANS in
y|Y|yes|Yes)
echo “yes is selected”
;;
n|N)
echo “no is selected”
;;
*)
echo “`basename $0` :Unknown response”
exit 1
;;
esac
C.for
for循环
格式
for 变量名 in 列表
do
命令1
命令2
done
示例:
1. 简单的for循环
for loop in 1 2 3 4 5
do
echo $loop
done
2. 打印字符串列表
for loop in “orange red blue grey”
do
echo $loop
done
3. 打印当前命令下的所有文件
for loop in `ls`
do
echo $loop
done
4. 对for循环使用参数
脚本中,for params in “$@” 等价于 for params
for params
do
echo “You supplied $params in $@”
done
5. 多文件转换
for files in `ls LPSO*`
do
cat $files | tr “[a-z]” “[A-Z]” >$files
done
6. 循环计数
counter=0
for files in *
do
counter = `expr $counter + 1`
done
7. for循环的嵌套
for 变量1 in 列表1
do
for 变量2 in 列表2
do
命令
done
done
8. bash中的for循环写法
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10; do
# do something
done
for i in `seq 1 10`; do
# do something
done
for i in {1..10}; do
# do something
done
示例:bash的 for 循环写法
for ((i = 1; i <= 10; i++)); do
# do something
done
C语言自诞生那天起就只有一种写法
for (i = 0; i < 10; i++) {
# do something
}
9. eg
for ((初始值;限制值;限制步长))
do
程序段
done
D.until
until循环
执行一系列命令直到条件为真时停止
Until循环与while循环处理方式上刚好相反
如果循环至少要执行一次,使用while,如果可能根本不需要执行,使用until
格式:
until condition
do
命令…..
done
测试发生在循环末尾,所以至少执行一次
示例:
1. 简单的until测试
IS_ROOT=`who | grep root`
until [ “$IS_ROOT” ]
do
sleep 5
done
2. 监视文件被删除
LOCK_FILE=”temp”
until [ ! –f $LOCK_FILE ]
do
sleep 1
done
echo “file deleted”
3. 监视磁盘空间
LOCK_OUT=`df | grep /logs | awk ‘{print $5}’| sed ‘s/%//g’ `
echo $LOCK_OUT
until [ “$LOCK_OUT” –gt “90” ]
do
echo “File system.Logs is nearly full”
exit
done
4. eg
until [condition]&&[condition]||[condition]
do
程序段落
done
E.while
while循环
用于不断执行一系列命令,也用于从输入文件中读取数据
格式:
while condition
do
命令1
命令2
done
示例:
简单的while命令
COUNTER=0
while [ $COUNTER –lt 5 ]
do
COUNTER=`expr $COUNTER + 1`
echo $COUNTER
done
1. 循环读文件
while read LINE
do
echo $LINE
done < dream
2. 读文件不同字段
while read DEPT ITEMS
do
…..
done < total.txt
3. 每次读一对记录
while read rec1
do
read rec2
echo “$rec1”
echo “$rec2”
done <record.txt
4. 忽略注释行
while read LINE
do
case $LINE in
\#*) ;;
*)
echo $LINE
;;
esac
done
5. 无限循环
while [ 1 ]
do
#dosomething
done
6.
while [condition]&&[condition]||[condition]
do
程序段落
done
F.补充break&continue
补充;break和continue控制循环
Break
允许跳出循环,通常在进行一些列处理后退出循环或case语句
若多重循环,可指定跳出的循环个数,如跳出两重循环 break 2
命令不执行当前循环体内break下面的语句
从当前循环退出.
在控制条件未满足之前,跳出for,while,until循环,可以为break提供一个额外参数来表明需要跳出的循环层数
默认只跳出一层循环
示例:
1. 跳出case
case $ANS in
1|2|3)
Do something
break;
;;
*)
;;
esac
continue
不会跳出循环,只是跳过此循环步
命令是程序在本循体内忽略下面的语句,从循环头开始执行.
跳到下一次循环继续执行
- Linux新手生存笔记[9]——shell脚本基础2-条件测试及控制流
- Linux新手生存笔记[9]——shell脚本基础2-条件测试及控制流
- Linux新手生存笔记[10]——shell脚本基础3-函数及常用命令
- Linux新手生存笔记[10]——shell脚本基础3-函数及常用命令
- Linux新手生存笔记[8]——shell脚本基础1-变量
- Linux新手生存笔记[11]——shell脚本基础4-补充
- Linux新手生存笔记[8]——shell脚本基础1-变量
- Linux新手生存笔记[11]——shell脚本基础4-补充
- 第9课shell脚本基础2-条件测试及控制流
- shell脚本及条件测试
- Linux新手生存笔记[3]——Linux常用命令(2)
- Linux新手生存笔记[3] —— Linux常用命令(2)
- Linux新手生存笔记[3]——Linux常用命令(2)
- Linux Shell 脚本应用——条件测试
- Linux新手生存笔记[2]——vim训练稿
- Linux新手生存笔记[2] —— vim训练
- Linux新手生存笔记[2]——vim训练稿
- Linux新手生存笔记[2]——vim训练稿
- tomcat7下jsp页面乱码
- Java语言中的ClassLoader与Package机制
- Linux新手生存笔记[7]——重点命令4-tr&join&cut&paste&split
- “海淘”让我们的编程设备投资更省钱
- Linux新手生存笔记[8]——shell脚本基础1-变量
- Linux新手生存笔记[9]——shell脚本基础2-条件测试及控制流
- Linux新手生存笔记[10]——shell脚本基础3-函数及常用命令
- Linux新手生存笔记[11]——shell脚本基础4-补充
- Linux新手生存笔记[12]——rpm&yum命令
- java中判断socket服务器端是否断开连接
- Linux新手生存笔记[13]——SVN命令总结
- java中判断socket网络远端是否断开连接
- ADB命令免输入工具(远程调试android设备使用)
- 毕业设计(二十二)---主页大致布局 简画