近期在編寫一個 sh 腳本時,又被 for 循環取兩個變量卡住了,雖然以前用 Python 實現過,可是 sh 總歸實現不了,今天又看了看 Python 的實現過程,發現原來 sh 也能夠這樣。html
現一文件內有以下內容,咱們將經過編寫 sh 腳原本逐行打印截取後的每一行內容centos
[root@centos-master string]# cat Ddate.txt startDate=2018-01-01 00:00:00=endDate=2018-01-31 23:59:59 startDate=2018-02-01 00:00:00=endDate=2018-02-31 23:59:59 startDate=2018-03-01 00:00:00=endDate=2018-03-31 23:59:59 startDate=2018-04-01 00:00:00=endDate=2018-04-31 23:59:59 startDate=2018-05-01 00:00:00=endDate=2018-05-31 23:59:59 startDate=2018-06-01 00:00:00=endDate=2018-06-31 23:59:59 startDate=2018-07-01 00:00:00=endDate=2018-07-31 23:59:59 startDate=2018-08-01 00:00:00=endDate=2018-08-31 23:59:59 startDate=2018-09-01 00:00:00=endDate=2018-09-31 23:59:59
首先咱們先編寫出逐行打印出文件內容的腳本以下bash
#!/bin/bash cat /home/zyy/string/Ddate.txt | while read line do startDate=${line} echo "$startDate" done
運行結果以下所示spa
[root@centos-master string]# sh idate.sh startDate=2018-01-01 00:00:00=endDate=2018-01-31 23:59:59 startDate=2018-02-01 00:00:00=endDate=2018-02-31 23:59:59 startDate=2018-03-01 00:00:00=endDate=2018-03-31 23:59:59 startDate=2018-04-01 00:00:00=endDate=2018-04-31 23:59:59 startDate=2018-05-01 00:00:00=endDate=2018-05-31 23:59:59 startDate=2018-06-01 00:00:00=endDate=2018-06-31 23:59:59 startDate=2018-07-01 00:00:00=endDate=2018-07-31 23:59:59 startDate=2018-08-01 00:00:00=endDate=2018-08-31 23:59:59 startDate=2018-09-01 00:00:00=endDate=2018-09-31 23:59:59
接下來咱們就開始對遍歷出來的字符串進行截取操做。code
一、= 號截取,刪除左邊字符,保留右邊字符htm
startDate=${line#*=} 其中 line 是變量名,# 號是運算符,*= 表示從左邊開始刪除第一個 = 號及左邊的全部字符
完整腳本以下blog
#!/bin/bash cat /home/zyy/string/Ddate.txt | while read line do startDate=${line#*=} echo "$startDate" done
運行結果字符串
[root@centos-master string]# sh idate.sh 2018-01-01 00:00:00=endDate=2018-01-31 23:59:59 2018-02-01 00:00:00=endDate=2018-02-31 23:59:59 2018-03-01 00:00:00=endDate=2018-03-31 23:59:59 2018-04-01 00:00:00=endDate=2018-04-31 23:59:59 2018-05-01 00:00:00=endDate=2018-05-31 23:59:59 2018-06-01 00:00:00=endDate=2018-06-31 23:59:59 2018-07-01 00:00:00=endDate=2018-07-31 23:59:59 2018-08-01 00:00:00=endDate=2018-08-31 23:59:59 2018-09-01 00:00:00=endDate=2018-09-31 23:59:59
二、## 號截取,刪除左邊字符,保留右邊字符get
startDate=${line##*=} 其中 line 是變量名,## 是運算符,*= 表示從左邊開始刪除最後(最右邊)一個 = 號及左邊的全部字符
完整腳本以下string
#!/bin/bash cat /home/zyy/string/Ddate.txt | while read line do startDate=${line##*=} echo "$startDate" done
運行結果
[root@centos-master string]# sh idate.sh 2018-01-31 23:59:59 2018-02-31 23:59:59 2018-03-31 23:59:59 2018-04-31 23:59:59 2018-05-31 23:59:59 2018-06-31 23:59:59 2018-07-31 23:59:59 2018-08-31 23:59:59 2018-09-31 23:59:59
三、% 號截取,刪除右邊字符,保留左邊字符
startDate=${line%=*} 其中 line 是變量名,% 是運算符,=* 表示從右邊開始,刪除第一個 = 號及右邊的字符
完整腳本以下
#!/bin/bash cat /home/zyy/string/Ddate.txt | while read line do startDate=${line%=*} echo "$startDate" done
運行結果
[root@centos-master string]# sh idate.sh startDate=2018-01-01 00:00:00=endDate startDate=2018-02-01 00:00:00=endDate startDate=2018-03-01 00:00:00=endDate startDate=2018-04-01 00:00:00=endDate startDate=2018-05-01 00:00:00=endDate startDate=2018-06-01 00:00:00=endDate startDate=2018-07-01 00:00:00=endDate startDate=2018-08-01 00:00:00=endDate startDate=2018-09-01 00:00:00=endDate
四、%% 號截取,刪除右邊字符,保留左邊字符
startDate=${line%%=*} 其中 line 是字符串,%% 是運算符,=* 表示從右邊開始,刪除最後(最左邊)一個 = 號及右邊的字符
完整腳本以下
#!/bin/bash cat /home/zyy/string/Ddate.txt | while read line do startDate=${line%%=*} echo "$startDate" done
運行結果
[root@centos-master string]# sh idate.sh startDate startDate startDate startDate startDate startDate startDate startDate startDate
五、從左邊第幾個字符開始,及字符的個數
startDate=${line:0:20} 其中 0 表示從左邊第一個字符開始,20 表示字符的總個數
完整腳本以下
#!/bin/bash cat /home/zyy/string/Ddate.txt | while read line do startDate=${line:0:20} echo "$startDate" done
運行結果
[root@centos-master string]# sh idate.sh startDate=2018-01-01 startDate=2018-02-01 startDate=2018-03-01 startDate=2018-04-01 startDate=2018-05-01 startDate=2018-06-01 startDate=2018-07-01 startDate=2018-08-01 startDate=2018-09-01
六、從左邊第幾個字符開始,一直到結束
startDate=${line:30} 其中 30 表示從左邊第 31 個字符開始,一直到結束
完整腳本以下
#!/bin/bash cat /home/zyy/string/Ddate.txt | while read line do startDate=${line:30} echo "$startDate" done
運行結果
[root@centos-master string]# sh idate.sh endDate=2018-01-31 23:59:59 endDate=2018-02-31 23:59:59 endDate=2018-03-31 23:59:59 endDate=2018-04-31 23:59:59 endDate=2018-05-31 23:59:59 endDate=2018-06-31 23:59:59 endDate=2018-07-31 23:59:59 endDate=2018-08-31 23:59:59 endDate=2018-09-31 23:59:59
七、從右邊第幾個字符開始,及字符的個數
startDate=${line:0-19:10} 其中 0-19 表示從右邊算起第十九個字符開始,10 表示字符的個數
完整腳本以下
#!/bin/bash cat /home/zyy/string/Ddate.txt | while read line do startDate=${line:0-19:10} echo "$startDate" done
運行結果
[root@centos-master string]# sh idate.sh 2018-01-31 2018-02-31 2018-03-31 2018-04-31 2018-05-31 2018-06-31 2018-07-31 2018-08-31 2018-09-31
八、從右邊第幾個字符開始,一直到結束
startDate=${line:0-19} 其中 0-19 表示從右邊開始第 19 個字符起,一直到結束 # 注: 左邊的第一個字符是用 0 表示,右邊的第一個字符用 0-1 表示
完整腳本以下
#!/bin/bash cat /home/zyy/string/Ddate.txt | while read line do startDate=${line:0-19} echo "$startDate" done
運行結果
[root@centos-master string]# sh idate.sh 2018-01-31 23:59:59 2018-02-31 23:59:59 2018-03-31 23:59:59 2018-04-31 23:59:59 2018-05-31 23:59:59 2018-06-31 23:59:59 2018-07-31 23:59:59 2018-08-31 23:59:59 2018-09-31 23:59:59