Linux基础shell(下)以及if,for,while

熟练的运用shell及其if ,while和for

if

if
相关命令:暂无相关命令
-e 文件存在

-f 文件是一个 普通文件(不是一个目录或设备文件)

-s 文件大小不为零

-d 文件是一个 目录

-b 文件是一个 块设备(软盘 、光驱、 等)

-c 文件是一个 字符设备(键盘、调制解调器、声卡、等)

-z 字符串为空返回真,否则为假

-p 文件是一个 管道

-h 文件是一个 符号链接

-n 判断变量是否有值

-r 文件是否可读

-w 文件是否可写

-x 文件是否可执行

-z代表的是该变量是否有值

-S 文件是一个 socket

例1
if [ condition1 ]
then
if [ condition2 ]
then
do-something # But only if both “condition1” and “condition2” valid.
fi
fi
实例
if [ $? -eq 0 ];then echo T;else echo F;fi

像 while, until, 和 for 循环代码块, 甚至 if/then 测试结构的代码块都能做到标准输入的重定向. 即使函数也可以使用这种重定向的格式 (参考例子 23-11). 所有的这些依靠代码块结尾的 < 操作符来做到.

例子

while 循环的重定向

1 #!/bin/bash
2 # redir2.sh
3
4 if [ -z “$1” ]
5 then
6 Filename=names.data # 如果没有指定文件名,则指定这个默认值.
7 else
8 Filename=KaTeX parse error: Expected 'EOF', got '#' at position 18: … 9 fi 10 #̲+ Filename={1:-names.data}
11 # 这句可代替上面的测试 (参数替换).
12
13 count=0
14
15 echo
16
17 while [ “$name” != Smith ] # 为什么变量 KaTeX parse error: Expected 'EOF', got '#' at position 53: … #̲ 从Filename文件中读而非在标准输入中读.
20 echo n a m e 21 l e t &quot; c o u n t + = 1 &quot; 22 d o n e &lt; &quot; name 21 let &quot;count += 1&quot; 22 done &lt;&quot; name21let"count+=1"22done<"Filename" # 重定向标准输入到文件KaTeX parse error: Expected 'EOF', got '#' at position 17: …ilename. 23 #̲ ^^^^^^^^^^^…count names read"; echo
26
27 exit 0
28
29 # 注意在老一些的shell脚本编程语言里,
30 #+ 重定向的循环是在子shell里运行的.
31 # 因此, KaTeX parse error: Expected 'EOF', got '#' at position 35: …在循环开始前的值. 32 #̲ Bash 和 ksh 只要…l"
42 echo $abc
43 done
44 echo $abc
45 #

重定向while 循环的另一种形式

1 #!/bin/bash
2
3 # 这是前个脚本的另一个版本.
4
5 # Heiner Steven谈到
6 #+ 在重定向循环时会以子Shell运行的环境里,
7 #+ 循环内的值在循环结束后不会保持循环内的值.
8 #
9
10
11 if [ -z “$1” ]
12 then
13 Filename=names.data # 如果没有指定文件名则使用默认值.
14 else
15 Filename=KaTeX parse error: Expected 'EOF', got '&' at position 37: …8 19 exec 3<&̲0 …Filename" # 重定向标准输入.
21
22 count=0
23 echo
24
25
26 while [ "KaTeX parse error: Expected 'EOF', got '#' at position 57: … #̲ 从标准输入(Filename)中读.
29 echo KaTeX parse error: Expected 'EOF', got '#' at position 61: … #̲ 从文件Filename中循环的读
32 #+ 因为文件(译者注:指默认的文件,在这节最后面附上)有20行.
33
34 # 这个脚本原先在"while"循环的结尾是用:
35 #+ done <“KaTeX parse error: Expected 'EOF', got '#' at position 17: …ilename" 36 #̲ 练习: 37 # 为…count names read”; echo
44
45 exit 0

重定向 for 循环

1 #!/bin/bash
2
3 if [ -z “$1” ]
4 then
5 Filename=names.data # 如果没有指定文件名就使用默认值.
6 else
7 Filename=$1
8 fi
9
10 line_count=wc $Filename | awk '{ print $1 }'
11 # 目标文件的行数.
12 #
13 # 代码非常的刻意和难看,但至少展示了for循环的标准输入可以重定向…
14 #+ 当然你要足够聪明能看出来.
15 #
16 #
17 # 更简洁的办法是 line_count= ( w c − l &lt; &quot; (wc -l &lt; &quot; (wcl<"Filename")
18
19
20 for name in seq $line_count # 调用 “seq” 来打印数字序列.
21 # while [ “KaTeX parse error: Expected 'EOF', got '#' at position 95: … #̲ 从Filename文件而非标准输入读.
24 echo n a m e 25 i f [ &quot; name 25 if [ &quot; name25if["name” = Smith ] # 因为用for循环,所以需要这个累赘测试.
26 then
27 break
28 fi
29 done <"$Filename" # 重定向标准输入到文件 $Filename.
30 # ^^^^^^^^^^^^
31
32 exit 0

重定向 for 循环 (标准输入和标准输出都做重定向)

1 #!/bin/bash
2
3 if [ -z “$1” ]
4 then
5 Filename=names.data # 如果没有指定文件名,则使用默认值.
6 else
7 Filename= 18 f i 910 S a v e f i l e = 1 8 fi 9 10 Savefile= 18fi910Savefile=Filename.new # 保存结果的文件名.
11 FinalName=Jonah # 终止"read"时的名称.
12
13 line_count=wc $Filename | awk '{ print $1 }' # 目标文件的行数.
14
15
16 for name in seq $line_count
17 do
18 read name
19 echo “ n a m e &quot; 20 i f [ &quot; name&quot; 20 if [ &quot; name"20if["name” = “ F i n a l N a m e &quot; ] 21 t h e n 22 b r e a k 23 f i 24 d o n e &lt; &quot; FinalName&quot; ] 21 then 22 break 23 fi 24 done &lt; &quot; FinalName"]21then22break23fi24done<"Filename” > “$Savefile” # 重定向标准输出到文件 $Filename,
25 # ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 并保存输出到备份文件中.
26
27 exit 0

重定向 if/then 测试结构

1 #!/bin/bash
2
3 if [ -z “$1” ]
4 then
5 Filename=names.data # 如果文件名没有指定,使用默认值.
6 else
7 Filename= 18 f i 910 T R U E = 11112 i f [ &quot; 1 8 fi 9 10 TRUE=1 11 12 if [ &quot; 18fi910TRUE=11112if["TRUE" ] # if true 和 if : 都可以.
13 then
14 read name
15 echo n a m e 16 f i &lt; &quot; name 16 fi &lt;&quot; name16fi<"Filename"
17 # ^^^^^^^^^^^^
18
19 # 只读了文件的第一行.
20 # "if/then"测试结构不会自动地反复地执行,除非把它们嵌到循环里.
21
22 exit 0

练习
第一题
在这里插入图片描述
第二题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第三题
在这里插入图片描述
在这里插入图片描述
第四题
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值