亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
打印 上一主題 下一主題

[學(xué)習(xí)共享] shell 十三問? [復(fù)制鏈接]

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
41 [報告]
發(fā)表于 2003-12-23 14:04 |只看該作者

shell 十三問?

IFS=; 其實就是 IFS=
請記著﹗

當(dāng) IFS 為 null 時,在 $* (也就是 positional parameter)將被視為單一的 word ,因為跟本沒區(qū)隔嘛(想想 IFS 作啥用?)....
a=" abc"
之後,若 IFS 沒改變的話,那下面兩行是有差別的:
echo $a
echo "$a"
差別就在 quoting ! (自己再想想 space 在 soft quote 是否為 IFS ?)

若 IFS=
再跑上兩行 echo ,那就沒差了,
因為不管 space 在 quoting 內(nèi)還是外,都不是 IFS ﹗

論壇徽章:
0
42 [報告]
發(fā)表于 2003-12-23 15:36 |只看該作者

shell 十三問?

漸漸清楚了一些,也就是說
IFS=
就是說command_line無間隔,把command_line當(dāng)作一個整體,對行處理,因為處理用的分隔符為空,就是沒有.
網(wǎng)中人兄:
    我是這樣認為的,請問對嗎!!!

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
43 [報告]
發(fā)表于 2003-12-23 15:45 |只看該作者

shell 十三問?

[quote]原帖由 "黑駿馬"]就是說command_line無間隔,把command_line當(dāng)作一個整體[/quote 發(fā)表:

精確來說,不是整行 command line ,而是 $1 這個 positional parameter 之後的部份。
$0 與 $1 之間那個 space 還是 IFS ,但後面的就不是了...

(要是對 $0 $1 ... 這些 positional parameter 不了解,請看我日後的續(xù)貼吧...)

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
44 [報告]
發(fā)表于 2003-12-29 08:19 |只看該作者

shell 十三問?

5) var=value?export 前後差在哪?

這次讓我們暫時丟開 command line ,先來了解一下 bash 變量(variable)吧...

所謂的變量,就是利用一個特定的"名稱"(name)來存取一段可以變化的"值"(value)。

*設(shè)定(set)*
在 bash 中,你可以用 "=" 來設(shè)定或重新定義變量的內(nèi)容:
        name=value
在設(shè)定變量的時侯,得遵守如下規(guī)則:
        * 等號左右兩邊不能使用區(qū)隔符號(IFS),也應(yīng)避免使用 shell 的保留字元(meta charactor)。
        * 變量名稱不能使用 $ 符號。
        * 變量名稱的第一個字母不能是數(shù)字(number)。
        * 變量名稱長度不可超過 256 個字母。
        * 變量名稱及變量值之大小寫是有區(qū)別的(case sensitive)。

如下是一些變量設(shè)定時常見的錯誤:
        A= B        :不能有 IFS
        1A=B        :不能以數(shù)字開頭
        $A=B        :名稱不能有 $
        a=B                :這跟 a=b 是不同的(這不是錯誤,提醒 windows 的使用者要特別注意)
如下則是可以接受的設(shè)定:
        A=" B"        :IFS 被關(guān)閉了 (請參考前面的 quoting 章節(jié))
        A1=B        :並非以數(shù)字開頭
        A=$B        :$ 可用在變量值內(nèi)
        This_Is_A_Long_Name=b        :可用 _ 連接較長的名稱或值,且大小寫有別。

*變量替換(substitution)*
Shell 之所以強大,其中的一個因素是它可以在命令行中對變量作替換(substitution)處理。
在命令行中使用者可以使用 $ 符號加上變量名稱(除了在用 = 號定義變量名稱之外),
將變量值給替換出來,然後再重新組建命令行。
比方:
  1.         $ A=ls
  2.         $ B=la
  3.         $ C=/tmp
  4.         $ $A -$B $C
復(fù)制代碼

        (注意:以上命令行的第一個 $ 是 shell prompt ,並不在命令行之內(nèi)。)
必需強調(diào)的是,我們所提的變量替換,只發(fā)生在 command line 上面。(是的,讓我們再回到 command line 吧﹗)
仔細分析最後那行 command line ,不難發(fā)現(xiàn)在被執(zhí)行之前(在輸入 CR 字符之前),
$ 符號會對每一個變量作替換處理(將變量值替換出來再重組命令行),最後會得出如下命令行:
  1.         ls -la /tmp
復(fù)制代碼

還記得第二章我請大家"務(wù)必理解"的那兩句嗎?若你忘了,那我這裡再重貼一遍:
若從技術(shù)細節(jié)來看,shell 會依據(jù) IFS(Internal Field Seperator) 將 command line 所輸入的文字給拆解為"字段"(word)。
然後再針對特殊字符(meta)先作處理,最後再重組整行 command line 。

這裡的 $ 就是 command line 中最經(jīng)典的 meta 之一了,就是作變量替換的﹗
在日常的 shell 操作中,我們常會使用 echo 命令來查看特定變量的值,例如:
  1.         $ echo $A -$B $C
復(fù)制代碼

我們已學(xué)過, echo 命令只單純將其 argument 送至"標(biāo)準(zhǔn)輸出"(STDOUT,通常是我們的熒幕)。
所以上面的命令會在熒幕上得到如下結(jié)果:
  1.         ls -la /tmp
復(fù)制代碼

這是由於 echo 命令在執(zhí)行時,會先將 $A(ls)、$B(la)、跟 $C(/tmp) 給替換出來的結(jié)果。

利用 shell 對變量的替換處理能力,我們在設(shè)定變量時就更為靈活了:
        A=B
        B=$A
這樣,B 的變量值就可繼承 A 變量"當(dāng)時"的變量值了。
不過,不要以"數(shù)學(xué)羅輯"來套用變量的設(shè)定,比方說:
        A=B
        B=C
這樣並不會讓 A 的變量值變成 C 。再如:
        A=B
        B=$A
        A=C
同樣也不會讓 B 的值換成 C 。
上面是單純定義了兩個不同名稱的變量:A 與  B ,它們的值分別是 B 與  C 。
若變量被重復(fù)定義的話,則原有舊值將被新值所取代。(這不正是"可變的量"嗎?  ^_^)
當(dāng)我們在設(shè)定變量的時侯,請記著這點:
        * 用一個名稱儲存一個數(shù)值
僅此而已。

此外,我們也可利用命令行的變量替換能力來"擴充"(append)變量值:
        A=B:C:D
        A=$A:E
這樣,第一行我們設(shè)定 A 的值為 "B:C:D",然後,第二行再將值擴充為 "B:C:D:E" 。
上面的擴充範(fàn)例,我們使用區(qū)隔符號( : )來達到擴充目的,
要是沒有區(qū)隔符號的話,如下是有問題的:
        A=BCD
        A=$AE
因為第二次是將 A 的值繼承 $AE 的提換結(jié)果,而非 $A 再加 E ﹗
要解決此問題,我們可用更嚴謹?shù)奶鎿Q處理:
        A=BCD
        A=${A}E
上例中,我們使用 {} 將變量名稱的範(fàn)圍給明確定義出來,
如此一來,我們就可以將 A 的變量值從 BCD 給擴充為 BCDE 。

(提示:關(guān)於 ${name} 事實上還可做到更多的變量處理能力,這些均屬於比較進階的變量處理,
現(xiàn)階段暫時不介紹了,請大家自行參考資料。如 CU 的貼子:
http://www.chinaunix.net/forum/viewtopic.php?t=201843
)

* export *

嚴格來說,我們在當(dāng)前 shell 中所定義的變量,均屬於"本地變量"(local variable),
只有經(jīng)過 export 命令的"輸出"處理,才能成為環(huán)境變量(environment variable):
  1.         $ A=B
  2.         $ export A
復(fù)制代碼

或:
  1.         $ export A=B
復(fù)制代碼

經(jīng)過 export 輸出處理之後,變量 A 就能成為一個環(huán)境變量供其後的命令使用。
在使用 export  的時侯,請別忘記 shell 在命令行對變量的"替換"(substitution)處理,
比方說:
  1.         $ A=B
  2.         $ B=C
  3.         $ export $A
復(fù)制代碼

上面的命令並未將 A 輸出為環(huán)境變量,而是將 B 作輸出,
這是因為在這個命令行中,$A 會首先被替換為 B, 然後再"塞回"作 export 的參數(shù)。

要理解這個 export ,事實上需要從 process 的角度來理解才能透徹。
我將於下一章為大家說明 process 的觀念,敬請留意。

*取消變量*

要取消一個變量,在 bash 中可使用 unset 命令來處理:
  1.         unset A
復(fù)制代碼

與 export 一樣,unset 命令行也同樣會作變量替換(這其實就是 shell 的功能之一),
因此:
  1.         $ A=B
  2.         $ B=C
  3.         $ unset $A
復(fù)制代碼

事實上所取消的變量是 B 而不是 A 。

此外,變量一旦經(jīng)過 unset 取消之後,其結(jié)果是將整個變量拿掉,而不僅是取消其變量值。
如下兩行其實是很不一樣的:
  1.         $ A=
  2.         $ unset A
復(fù)制代碼

第一行只是將變量 A 設(shè)定為"空值"(null  value),但第二行則讓變量 A 不在存在。
雖然用眼睛來看,這兩種變量狀態(tài)在如下命令結(jié)果中都是一樣的:
  1.         $ A=
  2.         $ echo $A

  3.         $ unset A
  4.         $ echo $A
  5.        
復(fù)制代碼

請學(xué)員務(wù)必能識別 null value 與 unset 的本質(zhì)區(qū)別,這在一些進階的變量處理上是很嚴格的。
比方說:
  1.         $ str=                # 設(shè)為 null
  2.         $ var=${str=expr}        # 定義 var
  3.         $ echo $var
  4.        
  5.         $ echo $str
  6.        
  7.         $ unset str        # 取消
  8.         $ var=${str=expr}        # 定義 var
  9.         $ echo $var
  10.         expr
  11.         $ echo $str
  12.         expr
復(fù)制代碼

聰明的讀者(yes, you!),稍加思考的話,
應(yīng)該不難發(fā)現(xiàn)為何同樣的 var=${str=expr} 在 null 與 unset 之下的不同吧?
若你看不出來,那可能是如下原因之一:
a. 你太笨了
b. 不了解  var=${str=expr}        這個進階處理
c. 對本篇說明還沒來得及消化吸收
e. 我講得不好
不知,你選哪個呢?....  ^_^

[ 本帖最后由 網(wǎng)中人 于 2008-10-30 02:12 編輯 ]

論壇徽章:
0
45 [報告]
發(fā)表于 2003-12-30 16:54 |只看該作者

shell 十三問?

support好文章

論壇徽章:
0
46 [報告]
發(fā)表于 2003-12-30 22:58 |只看該作者

shell 十三問?

$ var=${str=expr}   # 定義 var

這個是啥用法,只見過${str:=expr}

麻煩網(wǎng)中人解釋一下,man bash沒說你這個用法

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
47 [報告]
發(fā)表于 2003-12-31 00:45 |只看該作者

shell 十三問?

嗯... 好吧,我就解釋一下 var=${str=expr} :

首先,var=$str 這個大家都可理解吧。
而接下來的思考方向是,究竟 $str 這個變量是如下哪一種情況呢:
1) unset
2) null
3) not null

1) 假如是 unset ,那麼 var=${str=expr} 的結(jié)果將是:
var=expr
str=expr

2) 假如是 null ,那 var=${str=expr} 的結(jié)果是:
var=
str=

3) 假如是 not null (比方為 xyz ),那 var=${str=expr} 之結(jié)果是:
var=xyz
str=xyz

論壇徽章:
0
48 [報告]
發(fā)表于 2003-12-31 10:53 |只看該作者

shell 十三問?

${str=expr}還是不大懂.他是先判斷str的值?然后把expr付給str?

還是其他的方式?

他是${str:=expr}的變種嘛?

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
49 [報告]
發(fā)表于 2003-12-31 15:38 |只看該作者

shell 十三問?

嗯?不是抓著 ${str} 是 not set, null, not null 這三種狀態(tài)來理解就行了嗎?
不用急,你先自己逐一試試嘛:

  1. showvar() {
  2.     var=${str=expr}
  3.     echo \$var is $var
  4.     echo \$str is $str
  5. }
  6. unset str
  7. showvar
  8. str=
  9. showvar
  10. str=xyz
  11. showvar
復(fù)制代碼


接下來,再來看看 var=${str:=expr} 好了:
1) $str 為 not set :
var=expr
str=expr

2) $str 為 null :
var=expr
str=expr

3) $str 為 not null (str=xyz):
var=xyz
str=xyz

最後比教一下 ${str=expr} 與 ${str:=expr} :
* 兩者在 not set 與 not null 都一至
* 但當(dāng) null 值時,前者會將 $var 與 $str 都設(shè)為 null ,但後者則設(shè)為 expr

從這個再延伸出其他類比,不防請大家"實作"觀查一下有何不同?
var=${str-expr} vs var=${str:-expr}
var=${str+expr} vs var=${str:+expr}
var=${str?expr} vs var=${strexpr}

hey you: 別偷懶﹗快做做看... hurry up!

論壇徽章:
0
50 [報告]
發(fā)表于 2003-12-31 19:54 |只看該作者

shell 十三問?

  1. showvar() {
  2.     var=${str-expr}
  3.     echo \$var is $var
  4.     echo \$str is $str
  5. }

  6. _____________________________
  7. ${str=expr}的結(jié)果
  8. [root@iamok -->root]# unset str
  9. [root@iamok -->root]# showvar
  10. $var is expr
  11. $str is expr
  12. [root@iamok -->root]# str=
  13. [root@iamok -->root]# showvar
  14. $var is
  15. $str is
  16. [root@iamok -->root]# str=999
  17. [root@iamok -->root]# showvar
  18. $var is 999
  19. $str is 999


  20. ${str:=expr}的結(jié)果
  21. [root@iamok -->root]# unset str
  22. [root@iamok -->root]# showvar
  23. $var is expr
  24. $str is expr
  25. [root@iamok -->root]# str=   
  26. [root@iamok -->root]# showvar
  27. $var is expr
  28. $str is expr
  29. [root@iamok -->root]# str=999
  30. [root@iamok -->root]# showvar
  31. $var is 999
  32. $str is 999



  33. ${str-expr}的結(jié)果
  34. [root@iamok -->root]# unset str
  35. [root@iamok -->root]# showvar
  36. $var is expr  
  37. $str is
  38. [root@iamok -->root]# str=
  39. [root@iamok -->root]# showvar
  40. $var is
  41. $str is
  42. [root@iamok -->root]# str=999
  43. [root@iamok -->root]# showvar
  44. $var is 999
  45. $str is 999


  46. ${str:-expr}的結(jié)果
  47. [root@iamok -->root]# unset str
  48. [root@iamok -->root]# showvar
  49. $var is expr
  50. $str is
  51. [root@iamok -->root]# str=
  52. [root@iamok -->root]# showvar
  53. $var is expr
  54. $str is
  55. [root@iamok -->root]# str=999
  56. [root@iamok -->root]# showvar
  57. $var is 999
  58. $str is 999


  59. ${str+expr}的結(jié)果
  60. [root@iamok -->root]# unset str
  61. [root@iamok -->root]# showvar
  62. $var is
  63. $str is
  64. [root@iamok -->root]# str=
  65. [root@iamok -->root]# showvar
  66. $var is expr
  67. $str is
  68. [root@iamok -->root]# str=999
  69. [root@iamok -->root]# showvar
  70. $var is expr
  71. $str is 999



  72. var=${str:+expr} 的結(jié)果
  73. [root@iamok -->root]# unset str
  74. [root@iamok -->root]# showvar
  75. $var is
  76. $str is
  77. [root@iamok -->root]# str=
  78. [root@iamok -->root]# showvar
  79. $var is
  80. $str is
  81. [root@iamok -->root]# str=999
  82. [root@iamok -->root]# showvar
  83. $var is expr
  84. $str is 999


  85. var=${str?expr} 的結(jié)果
  86. [root@iamok -->root]# unset str
  87. [root@iamok -->root]# showvar
  88. -bash: str: expr
  89. [root@iamok -->root]# str=
  90. [root@iamok -->root]# showvar
  91. $var is
  92. $str is
  93. [root@iamok -->root]# str=999
  94. [root@iamok -->root]# showvar
  95. $var is 999
  96. $str is 999


  97. var=${str:?expr} 的結(jié)果
  98. [root@iamok -->root]# unset str
  99. [root@iamok -->root]# showvar
  100. -bash: str: expr
  101. [root@iamok -->root]# str=
  102. [root@iamok -->root]# showvar
  103. -bash: str: expr
  104. [root@iamok -->root]# str=999
  105. [root@iamok -->root]# showvar
  106. $var is 999
  107. $str is 999
復(fù)制代碼


做了.看來${str-expr}就是${str:-expr}的變種了,沒有:在str是null或者noset的時候都是不一樣的結(jié)果.有:的都是一樣的結(jié)果.
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP