linux-shell之流程式控制制
## shell編程之流程式控制制 ##
```
概述:
流程式控制制在每一門編程語言裡面都有,無論是低級語言還是高級語言,這個是我們日常中最基礎的操作,在shell腳本中也不例外,今天我們談談流程式控制制。
```
### shell之if ###
```
語法結構:
if condition1
then
conmand1
command2
...
[elif] condition2
[then]
command3
...
[else]
command4
...
fi
notice:
跟其他語言的if差不多,可以把每一塊代碼,看成是一個分支,這個字每個流程就很清楚了。當condition1滿足的話,就去找他後邊的then中的代碼塊去執行,如果condition1不滿足,再去看下一個分支。都不滿足執行else
```
代碼測試:
```
我們以查找某個用戶為例進行測試:
首先查看下我們系統的用戶,全部的用戶是放在/etc/passwd這個文件的,我們將用戶名篩選出來:
cat /etc/passwd | awk -F: ""
命令解釋:
awk一個文本處理的,感興趣的可以去學一下,我這裡介紹我裡面有的
-F: 指明:作為分隔符
$1: 代表的是分隔後的第一個域
我們在找一下我們要測試的用戶test,只要將上述的命令通過管道給grep就好了:
cat /etc/passwd | awk -F: "" | grep "test"
命令解釋:
grep幫助我們篩選出含有test的行
我這裡是什麼都沒有輸出的,之後創建我們的腳本如下:
```
測試代碼:
```
#!/bin/bash
if cat /etc/passwd |grep "test"
then
echo "test user exists"
else
echo "no this user"
fi
notice:
注意默認的是沒有許可權的,先加許可權在執行
```
運行代碼:
```
結果:
no this user
```
現在我們開始創建用戶:
```
useradd test #請確保你有足夠的許可權
之後我們在通過上邊的那個用戶查看下當前用戶是否有test:
cat /etc/passwd | awk -F: "" | grep "test"
結果:
test(說明當前有這個用戶了)
```
我們在運行我們的腳本,結果如下:
```
test user exists
```
到此if語句介紹結束
---
### shell編程之for循環: ###
```
語法如下:
for item in a b c d e
do
command
done
研究一下for:
首先我們看到in後邊是空格分隔的一系列字元,我們想大概是用空格符分隔的一個list,我們可以去猜想是不是只要是空白符就會認為是一項。我們可以進行嘗試,發現就是空白符就行分割的,但是換行不行。
```
測試代碼:
```
#!/bin/bash
for a in h e l l o
do
echo $a
done
```
```
其實吧,是IFS這個環境變數在作怪,我們可以修改其然後使用其他分割。我們測試下回車分割。
```
測試代碼:
```
我們輸出/etc/passwd中的每一行。
#!/bin/bash
IFS=$"
"
i=0
for a in `cat /etc/passwd`
do
echo $i
echo $a
i=$[ $i +1 ]
done
```
坑:
```
在測試:分割的時候,我使用如下代碼測試結果比較奇怪:懂原因的可以給我回復下,小弟非常感謝。
IFS=$":"
test="a:b:c:d:"
for a in $test#當在$test的位置直接放a:b:c:d的時候輸出為a b c d很奇怪
do
echo $a
done
```
另一中c語言風格的for
```
語法格式:
for((i=0;i
do
command
done
```
### while語句 ###
```
語法格式:
while condition
do
conmmand
done
```
condition:
```
測試命令和平時我們語言所使用的不太一樣,測試成功的話,返回0,失敗返回非0
測試命令的兩種結構:
test expression
expression是一個表達式,可以進行算數和文本的比較
[ expression ]#記得前後都有一個空格
```
測試代碼:
```
#!/bin/bash
i=0
while [ $i -lt 9 ]
do
echo $i
i=$[$i+1]
done
```
### until ###
```
語法格式:
until condition
do
command
done
```
測試代碼:
```
#!/bin/bash
i=0
until [ $i -gt 8 ]
do
echo $i
i=$[$i+1]
done
```
### case ###
```
這是應該也是分之處理的,語法格式:
case value in
模式1)
command1
command2;;#注意在命令的結束是兩個;
模式2)
command1
command2;;
*)#匹配其他的
command1
command2;;
esac
```
測試代碼:
```
#!/bin/bash
a=tesddsat
case $a in
"test")
echo "testtest"
echo 1;;
"test11")
echo "testtest"
echo 2;;
*)
echo "3";;
esac
```
### 退出循環 ###
```
退出循環包括兩個命令:
continue#退出一次
break#z終止循環
```
測試代碼:
```
任務進行一個1~10的循環,每次循環獲取用戶輸入,得到m跳過一次循環,得到n終止循環
#!/bin/bash
for((i=0;i
do
read test
if [ $test == m ]#注意此處的比較==前後記得加空格,要不然和預期的不一樣
then
echo "enter $test"
continue
echo "mmmmmmmmm"
elif [ $test == n ]
then
echo "enter $test"
break
echo "nnnnnn"
fi
echo $i
done
```
**既然都看到這兒了,老鐵關注一波吧,小弟謝過了**
TAG:菜鳥ai |