回到: "Linux系列文章" "Shell系列文章" "Awk系列文章" 流程式控制制語句 註:awk中語句塊沒有作用域,都是全局變數。 代碼塊 if...else 搞笑題:妻子告訴程式員老公,去買一斤包子,如果看見賣西瓜的,就買兩個。結果是買了兩個包子回來。 switch...case awk 中的 ...
回到:
流程式控制制語句
註:awk中語句塊沒有作用域,都是全局變數。
if (condition) statement [ else statement ]
expr1?expr2:expr3
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
next
nextfile
exit [ expression ]
{ statements }
switch (expression) {
case value|regex : statement
...
[ default: statement ]
}
代碼塊
{statement}
if...else
# 單獨的if
if(cond){
statements
}
# if...else
if(cond1){
statements1
} else {
statements2
}
# if...else if...else
if(cond1){
statements1
} else if(cond2){
statements2
} else if(cond3){
statements3
} else{
statements4
}
搞笑題:妻子告訴程式員老公,去買一斤包子,如果看見賣西瓜的,就買兩個。結果是買了兩個包子回來。
# 自然語言的語義
買一斤包子
if(有西瓜){
買兩個西瓜
}
# 程式員理解的語義
if(沒有西瓜){
買一斤包子
}else{
買兩個包子
}
awk '
BEGIN{
mark = 999
if (mark >=0 && mark < 60) {
print "學渣"
} else if (mark >= 60 && mark < 90) {
print "還不錯"
} else if (mark >= 90 && mark <= 100) {
print "學霸"
} else {
print "錯誤分數"
}
}
'
三目運算符?:
expr1 ? expr2 : expr3
if(expr1){
expr2
} else {
expr3
}
awk 'BEGIN{a=50;b=(a>60) ? "及格" : "不及格";print(b)}'
awk 'BEGIN{a=50; a>60 ? b="及格" : b="不及格";print(b)}'
switch...case
switch (expression) {
case value1|regex1 : statements1
case value2|regex2 : statements2
case value3|regex3 : statements3
...
[ default: statement ]
}
awk 中的switch分支語句功能較弱,只能進行等值比較或正則匹配。
各分支結尾需使用break來終止。
{
switch($1){
case 1:
print("Monday")
break
case 2:
print("Tuesday")
break
case 3:
print("Wednesday")
break
case 4:
print("Thursday")
break
case 5:
print("Friday")
break
case 6:
print("Saturday")
break
case 7:
print("Sunday")
break
default:
print("What day?")
break
}
}
分支穿透:
{
switch($1){
case 1:
case 2:
case 3:
case 4:
case 5:
print("Weekday")
break
case 6:
case 7:
print("Weekend")
break
default:
print("What day?")
break
}
}
while和do...while
while(condition){
statements
}
do {
statements
} while(condition)
while先判斷條件再決定是否執行statements,do...while先執行statements再判斷條件決定下次是否再執行statements。
awk 'BEGIN{i=0;while(i<5){print i;i++}}'
awk 'BEGIN{i=0;do {print i;i++} while(i<5)}'
多數時候,while和do...while是等價的,但如果第一次條件判斷失敗,則do...while和while不同。
awk 'BEGIN{i=0;while(i == 2){print i;i++}}'
awk 'BEGIN{i=0;do {print i;i++} while(i ==2 )}'
所以,while可能一次也不會執行,do...while至少會執行一次。
一般用while,do...while相比while來說,用的頻率非常低。
for迴圈
for (expr1; expr2; expr3) {
statement
}
for (idx in array) {
statement
}