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 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=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 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=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 “name” = “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=TRUE" ] # if true 和 if : 都可以.
13 then
14 read name
15 echo Filename"
17 # ^^^^^^^^^^^^
18
19 # 只读了文件的第一行.
20 # "if/then"测试结构不会自动地反复地执行,除非把它们嵌到循环里.
21
22 exit 0
练习
第一题
第二题
第三题
第四题