近期在编写一个 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