shell-7.shell 字符串的使用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章