1,代码块和 I/O 重定向
vim test1.sh
#!/bin/bash
# 从 /etc/fstab 中读行
File=/etc/fstab
{
read line1
read line2
} <$File
echo "First line in $File is:"
echo "$line1"
echo
echo "Second line in $File is:"
echo "$line2"
exit 0
# 现在,你怎么分析每行的分割域
# 暗示: 使用 awk.
文件 /etc/fstab 内容
效果:
2,在后台运行一个循环
vim test3.sh
1 #!/bin/bash
2 #background-loop.sh
3
4 for i in 1 2 3 4 5 6 7 8 9 10 #第一个循环
5 do
6 echo -n " $i"
7 done& #在后台运行这个循环
8 #在第 2 个循环之后,将在某些时候执行.
9
10 echo #这个'echo'某些时候将不会显示.
11
12 for i in 11 12 13 14 15 16 17 18 19 20 #第二个循环
13 do
14 echo -n " $i"
15 done
16
17 echo #这个'echo'某些时候将不会显示.
18
19 #--------------------------------------------------------
20
21 #期望的输出应该是
22 #1 2 3 4 5 6 7 8 9 10
23 #11 12 13 14 15 16 17 18 19 20
24
25 #然而实际的结果有可能是
26 #11 12 13 14 15 16 17 18 19 20
27 #1 2 3 4 5 6 7 8 9 10 bozo $
28 #(第 2 个'echo'没执行,为什么?)
29
30 #也可能是
31 #1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
32 #(第 1 个'echo'没执行,为什么?)
输出结果是:
3,变量赋值和替换
vim test4.sh
#!/bin/bash
2 # 变量赋值和替换
3
4 a=375
5 hello=$a
6
7 # 强烈注意,在赋值的前后一定不要有空格.
8 # 如果有空格会发生什么?
9
10
11 # 如果"VARIABLE =value",
12 # ^
13 #+ 脚本将尝试运行一个"VARIABLE"的命令,带着一个"=value"参数.
14
15 # 如果"VARIABLE= value",
16 # ^
1 #!/bin/bash
2 # 变量赋值和替换
10
11 # 如果"VARIABLE =value",
12 # ^
13 #+ 脚本将尝试运行一个"VARIABLE"的命令,带着一个"=value"参数.
14
15 # 如果"VARIABLE= value",
16 # ^
17 #+ script tries to run "value" command with
18 #+ 脚本将尝试运行一个"value"的命令,带着
19 #+ the environmental variable "VARIABLE" set to "".
20 #^Z+ 一个被赋成""值的环境变量"VARIABLE".
21 #-------------------------------------------------------------------------
22
23 # 没有变量引用,不过是个 hello 字符串
27 echo ${hello} # 同上
28
29 echo "$hello"
30 echo "${hello}"
31
32 echo
33
34 hello="A B C D"
35 echo $hello # A B C D
36 echo "$hello" # A B C D
37 # 就象你看到的 echo $hello 和 echo "$hello" 将给出不同的结果.
38 # ^ ^
39 # Quoting a variable preserves whitespace.
40 # 引用一个变量将保留其中的空白,当然,如果是变量替换就不会保留了.
41
42 echo
43
44 echo '$hello' # $hello
45 # ^ ^
46 # 全引用的作用
47 #+ 将导致"$"变成一个单独的字符.
48
20 #^Z+ 一个被赋成""值的环境变量"VARIABLE".
21 #-------------------------------------------------------------------------
22
23 # 没有变量引用,不过是个 hello 字符串
24 echo hello
25
26 echo $hello
27 echo ${hello} # 同上
28
29 echo "$hello"
30 echo "${hello}"
31
32 echo
33
34 hello="A B C D"
35 echo $hello # A B C D
36 echo "$hello" # A B C D
37 # 就象你看到的 echo $hello 和 echo "$hello" 将给出不同的结果.
38 # ^ ^
39 # Quoting a variable preserves whitespace.
40 # 引用一个变量将保留其中的空白,当然,如果是变量替换就不会保留了.
41
42 echo
43
44 echo '$hello' # $hello
45 # ^ ^
46 # 全引用的作用
47 #+ 将导致"$"变成一个单独的字符.
48
49 # 注意两种引用不同的效果
50
51
52 hello= # 设置为空值
53 echo "\$hello (null value) = $hello"
54 # 注意设置一个变量为空,与 unset 它,不是一回事,虽然看起来一样
55 #
56 # --------------------------------------------------------------
57
58 # 可以在同一行上设置多个变量.
59 #+ 要以空白分隔
60 # 小心,这会降低可读性,和可移植性.
61
62 var1=21 var2=22 var3=$V3
63 echo
64 echo "var1=$var1 var2=$var2 var3=$var3"
65
66 # 在老版本的"sh"上,可能会有问题.
67
68 # --------------------------------------------------------------
69
70
71 echo; echo
72
73 numbers="one two three"
74 # ^ ^
75 other_numbers="1 2 3"
76 # ^ ^
77 # 如果变量中有空白,那么引用就必要了.
78 #
79 echo "numbers = $numbers"
80 echo "other_numbers = $other_numbers" # other_numbers = 1 2 3
81 echo
82
83 echo "uninitialized_variable = $uninitialized_variable"
84 # Uninitialized 变量为空值(根本就没赋值).
85 uninitialized_variable= # 声明,但是没被初始化
86 #+ 其实和前边设置为空值得作用是一样的.
87 echo "uninitialized_variable = $uninitialized_variable"
88 # 还是一个空值
89
90 uninitialized_variable=23 # 赋值
91 unset uninitialized_variable # Unset it.
92 echo "uninitialized_variable = $uninitialized_variable"
93 # 还是空值
94 echo
95
96 echo "$uninitialized" # (blank line)
97 let "uninitialized += 5" # Add 5 to it.
98 echo "$uninitialized" # 5
99
100 # 结论:
101 # 对于一个空值变量在做算术操作的时候,就好像它的值为 0 一样.
102 # This is undocumented (and probably non-portable) behavior.
103 # 这并没被文档化(可能是不可移植)的行为.
96 exit 0
效果:
4,一般的变量赋值
vim test5.sh
1 #!/bin/bash
2 # "裸体"变量
3
4 echo
5
6 # 变量什么时候是"裸体"的,比如前边少了$的时候.
7 # 当它被赋值的时候,而不是被引用的时候.
8
9 # 赋值
10 a=879
11 echo "The value of \"a\" is $a."
12
13 # 使用 let 赋值
14 let a=16+5
15 echo "The value of \"a\" is now $a."
16
17 echo
18
19 # 在 for 循环中
20 echo -n "Values of \"a\" in the loop are: "
21 for a in 7 8 9 11
22 do
23 echo -n "$a "
24 done
25
26 echo
27 echo
28
29 # 在 read 命令状态中
30 echo -n "Enter \"a\" "
31 read a
32
33 echo "The value of \"a\" is now $a."
34 echo
35
36 exit 0
5,变量赋值,一般的和比较特殊的
vim test501.sh
1 #!/bin/bash
2
3 a=23 # Simple case
4 echo $a
5 b=$a
6 echo $b
7
8 # 现在让我们来点小变化
9
10 a=`echo Hello!` # 把 echo 命令的结果传给变量 a
11 echo $a
12 # 注意,如果在命令扩展结构中使用一个(!)的话,在命令行中将不能工作
13 #+ 因为这触发了 Bash 的"历史机制".
14 # 但是,在校本里边使用的话,历史功能是被关闭的,所以就能够正常运行.
15
16
17 a=`ls -l` # 把 ls -l 的结果给 a
18 echo $a # 别忘了,这么引用的话,ls 的结果中的所有空白部分都没了(包括换行)
19 echo
20 echo "$a" # 这么引用就正常了,保留了空白
21 # (具体参阅章节"引用")
22
23 exit 0
5.2 整型还是 string?
vim test502.sh
1 #!/bin/bash
2 # int-or-string.sh: 整形还是 string?
3
4 a=2334 # 整型
5 let "a += 1"
6 echo "a = $a " # a = 2335
7 echo # 还是整型
8
9
10 b=${a/23/BB} # 将 23 替换成 BB
11 # 这将把 b 变量从整型变为 string
12 echo "b = $b" # b = BB35
13 declare -i b # 即使使用 declare 命令也不会对此有任何帮助,9.4 节有解释
14 echo "b = $b" # b = BB35
15
16 let "b += 1" # BB35 + 1 =
17 echo "b = $b" # b = 1
18 echo
19
20 c=BB34
21 echo "c = $c" # c = BB34
22 d=${c/BB/23} # S 将 BB 替换成 23
23 # 这使得$d 变为一个整形
24 echo "d = $d" # d = 2334
25 let "d += 1" # 2334 + 1 =
26 echo "d = $d" # d = 2335
27 echo
28
29 # 关于空变量怎么样?
30 e=""
31 echo "e = $e" # e =
32 let "e += 1" # 算术操作允许一个空变量?
33 echo "e = $e" # e = 1
34 echo # 空变量将转换成一个整型变量
35
36 # 关于未声明的变量怎么样?
37 echo "f = $f" # f =
38 let "f += 1" # 算术操作允许么?
39 echo "f = $f" # f = 1
40 echo # 未声明的变量将转换成一个整型变量
4。3 位置参数
vim test503.sh
1 #!/bin/bash
2
3 # 作为用例,调用这个脚本至少需要 10 个参数,如
4 # ./scriptname 1 2 3 4 5 6 7 8 9 10
5
6 MINPARAMS=10
7 echo
8
9 echo "The name of this script is \"$0\"."
10 # 添加./是为了当前目录
11
12 # echo "The name of this script is \"`basename $0`\"."
13 echo "The name of this script is \" `basename $0`\","
14 # 去掉目录信息,具体见'basename'命令
15
16 echo
17
18 if [ -n "$1" ] # 测试变量被被引用
19 then
20 echo "Parameter #1 is $1" # "#"没被转义
21 fi
22
23 if [ -n "$2" ]
24 then
25 echo "Parmeter #2 is $2" # 没被转义
26 fi
27
28 if [ -n "$3" ]
29 then
30 echo "Parmeter #3 is $3" # 没被转义
31 fi
32
33 if [ -n "$4" ]
34 then
35 echo "Parmeter #4 is $4" # 没被转义
36 fi
37
38 if [ -n "$5" ]
39 then
40 echo "Parmeter #5 is $5" # 没被转义
41 fi
42
43 if [ -n "$6" ]
44 then
45 echo "Parmeter #6 is $6" # 没被转义
46 fi
47
48 if [ -n "$6" ]
49 then
50 echo "Parmeter #6 is $6" # 没被转义
51 fi
52
53 if [ -n "$7" ]
54 then
55 echo "Parmeter #7 is $7" # 没被转义
56 fi
57
58 if [ -n "$8" ]
59 then
60 echo "Parmeter #8 is $8" # 没被转义
61 fi
62
63
64 if [ -n "$9" ]
65 then
66 echo "Parmeter #9 is $9" # 没被转义
67 fi
68
69 if [ -n "${10}" ]
70 then
71 echo "Parmeter #10 is ${10}" # 没被转义 # 大于 9 的参数必须出现在{}中.
72 fi
73
74 echo "-----------------------------------"
75 echo "All the command-line parameters are: "$*""
76
77 if [ $# -lt "$MINPARAMS" ] #$#是传到脚本里的位置参数的个数
78 then
79 echo
80 echo "This script needs at least $MINPARAMS command-line arguments!"
81 fi
82
83 echo
84
85 exit 0