编程是一种思想。
为什么这几天我都是下午才,,无语
续行符
vim escaped03.sh
1 #!/bin/bash
2 echo "foo
3 what" # 没区别
4 #foo
5 #what
6 echo
7 echo 'foo
8 what' # 续行
9 #foo
10 #what
11 echo foo\
12 bar # 与上边一样,\还是作为续行符
13 # footbar
14 echo
15 echo "foo\
16 bar"
17 echo 'foot\
18 bar' # 由于是强引用,所以\没被解释成续行符
19
20
2,退出和退出状态
exit 命令被用来结束脚本,就像 C 语言一样.他也会返回一个值来传给父进程,父进程会判断是否可用.每个命令都会返回一个 exit 状态(有时候也叫 return 状态).成功返回 0,如果返回一个非 0 值,通常情况下都会被认为是一个错误码.一个编写良好的 UNIX 命令,程序,和工具都会返回一个 0 作为退出码来表示成功,虽然偶尔也会有例外.
同样的,脚本中的函数和脚本本身都会返回退出状态.在脚本或者是脚本函数中执行的最后的命令会决定退出状态.在脚本中,exit nnn 命令将会把 nnn 退出码传递给 shell(nnn 必须是 10 进制数0-255).当一个脚本以不带参数 exit 来结束时,脚本的退出状态就由脚本中最后执行命令来决定.
读取最后执行命令的退出码.函数返回后,$?给出函数最后执行的那条命令的退出码.这种给函数返回值的方法是 Bash 的方法.对于脚本来说也一样.总之,一般情况下,0 为成功,非 0 失败 W.
vim exit0.sh
1 #!/bin/bash
2
3 echo hello
4 echo $? # 返回 0,因为执行成功
5
6 lskdf # 不认识的命令.
7 echo $? # 返回非 0 值,因为失败了.
8
9 echo
10
11 exit 113 # 将返回 113 给 shell.
12 # To verify this, type "echo $?" after script terminates.
12 # 为了验证这个,在脚本结束的地方使用"echo $?"
效果如:
对于测试脚本中的命令的结果特别有用.
注意: !逻辑非操作,将会反转 test 命令的结果,并且这会影响 exit 状态.
否定一个条件使用!
vim exit1.sh
1 #!/bin/bash
2
3 true # true 是 shell 内建命令,什么事都不做,就是 shell 返回 0
4 echo "exit status of \"true\" = $?" # 0
5
6 ! true # ! 需要一个空格
7 echo "exit state of \"! true\" =$?" #1
8
9 # !true 将导致一个"command not found"错误
10 # 如果一个命令以'!'开头,那么将使用 Bash 的历史机制.就是显示这个命令被使用的历史.
11
12 true
13 ! true
14 # 这次就没有错误了.
15 # 他不过是重复了之前的命令(true).
效果:
exit status of "true" = 0
exit state of "! true" =1
3,Test 结构
每个完整的合理的编程语言都具有条件判断的功能.Bash 具有 test 命令,不同的[]和()操作,和if/then 结构.
1 什么情况下为真?
vim testWtrue.sh
1 # !/bin/bash
2
3 # 如果不确定一个特定的条件如何判定
4 # + 在一个 if-test 结构中测试它.
5
6 echo
7 echo "Testing \"0\""
8 if [ 0 ] # zero
9 then
10 echo "0 is true."
11 else
12 echo "0 is false."
13 fi # 0 is true
14
15 echo
16 echo "Testing \"1\""
17 if [ 1 ] # 1
18 then
19 echo "1 is true."
20 else
21 echo "i is flase,"
22 fi
23
24 echo
25 echo "Testing \"-1\""
26 if [ -1 ]
27 then
28 echo "-1 is true."
29 else
30 echo "-1 is false"
31 fi
32
33 echo
34 echo "Testing \"NUll\""
35 if [ ] # NULL (控状态)
36 then
37 echo "NULL is true."
38 else
39 echo "NULL is false"
40 fi
41
42 echo
43
44 echo "Testing \"xyz\""
45 if [ xyz ] # 字符串
46 then
47 echo "Random string is true."
48 else
49 echo "Random string is false."
50 fi # Random string is true.
51
52 echo
53
54 echo "Testing \"\$xyz\""
55 if [ $xyz ] # 测试$xyz 是否为 null,但是...(明显没人定义么!)
56 # 只不过是一个未定义的变量
57 then
58 echo "Uninitialized variable is true."
59 else
echo "Uninitialized variable is false."
61 fi # Uninitialized variable is false.
62
63 echo
64
65 echo "Testing \"-n \$xyz\""
66 if [ -n "$xyz" ] # 更学究的的检查
67 then
68 echo "Uninitialized variable is true."
69 else
70 echo "Uninitialized variable is false."
71 fi # Uninitialized variable is false.
72
73 echo
74 xyz= # 初始化了,但是将其设为空值
75
76 echo "Testing \"-n \$xyz\""
77 if [ -n "$xyz" ]
78 then
79 echo "Null variable is true."
80 else
81 echo "Null variable is false."
82 fi # Null variable is false.
83
84 echo
85 # 什么时候"flase"为 true?
86 echo "Testing \"false\""
87 if [ "false" ] # 看起来"false"只不过是个字符串而已.
88 then
89 echo "\"false\" is true." #+ 并且它 test 的结果就是 true.
90 else
91 echo "\"false\" is false."
92 fi # "false" is true.
93
94 echo
95 echo "Testing \"\$false\"" # 再来一个,未声明的变量
96 if [ "$false" ]
97 then
98 echo "\"\$false\" is true."
99 else
100 echo "\"\$false\" is false."
101 fi # "$false" is false.
102 # 现在我们终于得到了期望的结果
103
104 # 如果我们 test 这个变量"$true"会发生什么结果?答案是和"$flase"一样,都为空,因为我
105 #+ 们并没有定义它.
106 echo
107 exit 0
Testing "0"
0 is true.
Testing "1"
1 is true.
Testing "-1"
-1 is true.
Testing "NUll"
NULL is false
Testing "xyz"
Random string is true.
Testing "$xyz"
Uninitialized variable is false.
Testing "-n $xyz"
Uninitialized variable is false.
Testing "-n $xyz"
Null variable is false.
Testing "false"
"false" is true.
Testing "$false"
"$false" is false.