move to github 点击打开链接
--------------------------------------------
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 2. 读文件不同字段 while read DEPT ITEMS ….. 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新手生存笔记的第九部分,主要讲解了shell脚本中的条件测试,包括文件条件、字符串和数值测试,并介绍了控制流的使用,如case语句、for、until和while循环,以及break和continue的使用。
2060

被折叠的 条评论
为什么被折叠?



