shell-7.shell 字符串的使用
1.查看字符串的長度
${#var} 可計算出變量值的長度:
[root@10-222 ~]# var='yuanji'
[root@10-222 ~]# echo ${#var}
6
2.再論單引號,雙引號區別
1> 單引號
變量名稱,或者任何其他文本都會不經修改而原樣傳出來。
單引號字串中不能出現單引號(對單引號使用轉義符後也不行)。
2>雙引號
變量名稱,或者任何其他文本都會不經修改而傳出來
(雙引號裏可以有變量名, 雙引號裏可以有轉義字符)
3.對比 echo $變量名 和 echo "$變量名"
【實例】
[root@10-222 html]# mystr="a b f exit"
[root@10-222 html]# echo $mystr
a b f exit
[root@10-222 html]# echo "$mystr"
a b f exit
可以看到
echo $變量名 和 echo "$變量名" 的不同
4.用常使用 "$變量名" 或 ${變量名},儘量不要使用 $變量名,在很多地方會報錯或者出現意想不到的結果
【實例】
[root@10-222 home]# name="yuan ji"
[root@10-222 home]# if [ -z $name ];then echo "empty";fi
-bash: [: yuan: binary operator expected
-z:判斷制定的變量是否存在值
改成這樣正常
if [ -z "$name" ];then echo "empty";fi
當name="yuan ji"時,[ -z $name ]變成 [ -z yuan ji ],這時-z後有兩個參數,而-z只需要一個參數。這時shell解釋器會報錯:[: too many arguments 等類似的錯誤。
所以當這類條件判斷語句時,最好採用"$變量名"方法,這樣無論變量的值是什麼?在執行時會將值看成一個整體。
5.拼接字符
"要連接的字符串"${變量名}"要連接的字符串"
【實例】
[root@10-222 home]# name="yuanji"
[root@10-222 home]# address="ShenZhen"
[root@10-222 home]# info="Name is :"$name".Address is :"$address
[root@10-222 home]# echo $info
Name is :yuanji.Address is :ShenZhen
${變量名}${變量名}
【實例】
[root@10-222 home]# name="yuanji"
[root@10-222 home]# address="ShenZhen"
[root@10-222 home]# info=${name}${address}
[root@10-222 home]# echo $info
yuanjiShenZhen
6.字符串截取
方法一:
1>從左邊第幾個字符開始以及字符的個數,用法爲:start:len
[root@10-222 log]# mystr="hello world"
[root@10-222 log]# echo ${mystr:1:4}
ello
其中的 1 表示左邊第一個字符開始,4 表示字符的總個數。
2>從左邊第幾個字符開始一直到結束,用法爲:start
[root@10-222 log]# mystr="hello world"
[root@10-222 log]# echo ${mystr:6}
world
其中的 6 表示左邊第7個字符開始
3>從右邊第幾個字符開始以及字符的個數,用法:0-start:len
[root@10-222 log]# mystr="hello world"
[root@10-222 log]# echo ${mystr:0-5:3}
wor
其中的 0-5 表示右邊算起第5個字符開始,3 表示字符的個數。
4>、從右邊第幾個字符開始一直到結束,用法:0-start
[root@10-222 log]# mystr="hello world"
[root@10-222 log]# echo ${mystr:0-5}
world
注:(左邊的第一個字符是用 0 表示,右邊的第一個字符用 0-1 表示)
方法二:
url="http://yuanji6699.blog.51cto.com/11568362/1771741"
1> # 號截取,刪除左邊字符,保留右邊字符。
echo ${url#*//}
其中 var 是變量名,# 號是運算符,*// 表示從左邊開始刪除第一個 // 號及左邊的所有字符
即刪除 http://
結果是 :yuanji6699.blog.51cto.com/11568362/1771741
2> ## 號截取,刪除左邊字符,保留右邊字符。
echo ${url##*/}
##*/ 表示從左邊開始刪除最後(最右邊)一個 / 號及左邊的所有字符
即刪除 http://yuanji6699.blog.51cto.com/11568362/
結果是 1771741
3> %號截取,刪除右邊字符,保留左邊字符
echo ${url%/*}
%/* 表示從右邊開始,刪除第一個 / 號及右邊的字符
結果是:http://yuanji6699.blog.51cto.com/11568362
4> %% 號截取,刪除右邊字符,保留左邊字符
echo ${url%%/*}
%%/* 表示從右邊開始,刪除最後(最左邊)一個 / 號及右邊的字符
結果是:http:
【實例】
[root@10-222 log]# file_path="d:/log/192.168.10.222/syslog.txt"
[root@10-222 log]# echo ${file_path##*/}
syslog.txt
[root@10-222 log]# echo ${file_path%/*}
d:/log/192.168.10.222
${file_path##*/},${file_path%/*} 分別是得到文件名,和目錄地址的方法
${變量名#substring正則表達式}從字符串開頭開始配備substring,刪除匹配上的表達式。
${變量名%substring正則表達式}從字符串結尾開始配備substring,刪除匹配上的表達式。
方法三:
用cut,sed,awk命令 【後續說明】
[root@10-222 log]# file_path="d:/log/192.168.10.222/syslog.txt"
[root@10-222 log]# echo ${file_path} | cut -d "/" -f 4
syslog.txt
[root@10-222 log]# echo ${file_path} | awk -F '/' '{print NF-=1}'
syslog.txt
7.字符串替換
${變量/查找/替換值} 一個“/”表示替換第一個,”//”表示替換所有,當查找中出現了:”/”請加轉義符”\/”表示
[root@10-222 log]# file_path="d:/log/192.168.10.222/syslog.txt"
[root@10-222 log]# echo ${file_path/\//\\}
d:\log/192.168.10.222/syslog.txt
[root@10-222 log]# echo ${file_path//\//\\}
d:\log\192.168.10.222\syslog.txt
也可用用awk,sed
[root@10-222 log]# echo $file_path | sed -e 's/\//\\/'
d:\log/192.168.10.222/syslog.txt
[root@10-222 log]# echo $file_path | sed -e 's/\//\\/g'
d:\log\192.168.10.222\syslog.txt
[root@10-222 log]# echo $file_path | awk '{sub("/","\\",$0);printf("%s\n",$0)}'
d:\log/192.168.10.222/syslog.txt
[root@10-222 log]# echo $file_path | awk '{gsub("/","\\",$0);printf("%s\n",$0)}'
d:\log\192.168.10.222\syslog.txt
[root@10-222 log]# echo $file_path | tr "/" "\\"
tr: warning: an unescaped backslash at end of string is not portable
d:\log\192.168.10.222\syslog.txt
8.查找子字符串
[root@10-222 log]# string="this is my shell script"
[root@10-222 log]# echo `expr index "$string" is`
3
[root@10-222 log]# echo `expr index "$string" h`
2
僅僅可以返回某個字符或者多個字符中第一個字符出現的位置【這個很不好用,不推薦用】
使用下面的方法
[root@10-222 log]# string="this is my shell script"
[root@10-222 log]# echo $string | awk '{printf("%d\n", match($0,"shell"));}'
12
以下幾個部分在後續內容介紹
sed,awk,cut,等
以上是個人點點總結和理解,水平不高,文筆水平很爛,請各位大大見諒。
可以一起交流學習。
我的QQ:610851588
可以加入我建的羣(現在羣人很少,希望慢慢多起來)
Linux 羣:183932302
Python ,shell 交流羣:469094734