shell中變數的取值與賦值

weixin_33763244發表於2017-11-14

取值是很簡單的,例如var=bbb,那麼${var}ccc的結果就是bbbccc,在包含字串的時候要用到三種引號,分別是單引號、雙引號和反引號,現來一一討論

一、整體引用


  1. mv "a ~file name.txt" another.txt 

在這種情況下,單雙引號是沒有什麼區別,它們的意義相同。

二、變數替換


  1. echo "The value of '${var}' is ${var}"

在這種情況下,當一個變數被用在雙引號括起來的句子裡面的時候,它會被替換成它的內容;而當使用單引號的時候,變數替換則不會發生。所以可以說單引號是更強的引用。像上面那個例子的輸出結果為:


  1. The value of '${var}' is bbb

三、命令替換


  1. var='uname -r' 

這樣,變數$var的值就是命令uname -r的輸出。

比變數替換更高階的是匹配,例如:${f%jpg}是用jpg對變數f從後面開始進行匹配,並把匹配上的部分(也就是副檔名)去掉,同時使用兩個百分號的時候,表示使用了最大匹配方式,比如"abcdabcd",在用a*d匹配的時候,如果是最大匹配,就會匹配所有8個字元,而用最小匹配的時候則會匹配4個。與百分號相對應,也可以使用"#"來對變數進行從前向後的匹配,同樣也可以用兩個來表示最大匹配。

來看個例子


  1. #!/bin/bash  
  2. for var in *.sh  
  3. do  
  4. echo "${var%sh}"  
  5. done  

結果如下


  1. test1.  
  2. test2.  
  3. test3.  
  4. test.  

看到了字尾都沒有了,可以用以修改字尾名


  1. #!/bin/bash  
  2. for var in *.sh  
  3. do  
  4. mv "${var}" "${var%sh}SH"  
  5. done  

這樣小寫的sh就變成大寫的了。

寫個簡單的迴圈替換


  1. grep -v "^#" /etc/passwd |\  
  2. while read i  
  3. do  
  4. echo ${i%%:*}  
  5. done 

第一行:-v是取反的意思,"^#"是取開頭非#的行,最後的"\",如果將以上程式碼直接寫成一個檔案那麼最後那個反斜槓可以不要,但是在shell視窗中一行一行的寫那麼反斜槓是必須加上的,它會告訴編譯器還沒有結束。

第四行:%%:*意思是從最後到":"進行最大匹配,這樣就只剩下第一個":"號以前的內容了,看看結果

替換前


  1. sucre@sucre-ubuntu:~$ cat /etc/passwd  
  2. root:x:0:0:root:/root:/bin/bash  
  3. daemon:x:1:1:daemon:/usr/sbin:/bin/sh  
  4. bin:x:2:2:bin:/bin:/bin/sh  
  5. sys:x:3:3:sys:/dev:/bin/sh  
  6. sync:x:4:65534:sync:/bin:/bin/sync  
  7. games:x:5:60:games:/usr/games:/bin/sh  
  8. man:x:6:12:man:/var/cache/man:/bin/sh  
  9. lp:x:7:7:lp:/var/spool/lpd:/bin/sh  
  10. mail:x:8:8:mail:/var/mail:/bin/sh  
  11. news:x:9:9:news:/var/spool/news:/bin/sh  
  12. uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh  
  13. proxy:x:13:13:proxy:/bin:/bin/sh  
  14. www-data:x:33:33:www-data:/var/www:/bin/sh  
  15. backup:x:34:34:backup:/var/backups:/bin/sh  
  16. list:x:38:38:Mailing List Manager:/var/list:/bin/sh  
  17. irc:x:39:39:ircd:/var/run/ircd:/bin/sh  
  18. gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh  
  19. nobody:x:65534:65534:nobody:/nonexistent:/bin/sh  
  20. libuuid:x:100:101::/var/lib/libuuid:/bin/sh  
  21. syslog:x:101:103::/home/syslog:/bin/false  
  22. messagebus:x:102:107::/var/run/dbus:/bin/false  
  23. avahi-autoipd:x:103:110:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false  
  24. avahi:x:104:111:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false  
  25. couchdb:x:105:113:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash  
  26. speech-dispatcher:x:106:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/sh  
  27. usbmux:x:107:46:usbmux daemon,,,:/home/usbmux:/bin/false  
  28. haldaemon:x:108:114:Hardware abstraction layer,,,:/var/run/hald:/bin/false  
  29. kernoops:x:109:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false  
  30. pulse:x:110:115:PulseAudio daemon,,,:/var/run/pulse:/bin/false  
  31. rtkit:x:111:117:RealtimeKit,,,:/proc:/bin/false  
  32. saned:x:112:118::/home/saned:/bin/false  
  33. hplip:x:113:7:HPLIP system user,,,:/var/run/hplip:/bin/false  
  34. gdm:x:114:120:Gnome Display Manager:/var/lib/gdm:/bin/false  
  35. sucre:x:1000:1000:sucre,,,:/home/sucre:/bin/bash  
  36. sshd:x:115:65534::/var/run/sshd:/usr/sbin/nologin  

替換後


  1. one  
  2. root  
  3. daemon  
  4. bin  
  5. sys  
  6. sync  
  7. games  
  8. man  
  9. lp  
  10. mail  
  11. news  
  12. uucp  
  13. proxy  
  14. www-data  
  15. backup  
  16. list  
  17. irc  
  18. gnats  
  19. nobody  
  20. libuuid  
  21. syslog  
  22. messagebus  
  23. avahi-autoipd  
  24. avahi  
  25. couchdb  
  26. speech-dispatcher  
  27. usbmux  
  28. haldaemon  
  29. kernoops  
  30. pulse  
  31. rtkit  
  32. saned  
  33. hplip  
  34. gdm  
  35. sucre  
  36. sshd  

看到了吧,效率還行吧。


本文轉自sucre03 51CTO部落格,原文連結:http://blog.51cto.com/sucre/386442,如需轉載請自行聯絡原作者

相關文章