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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
123下一頁(yè)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 16383 | 回復(fù): 29
打印 上一主題 下一主題

網(wǎng)中人“shell十三問(wèn)之變量替換” 外傳(初學(xué)shell必看)  關(guān)閉 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2004-09-02 16:52 |只看該作者 |倒序?yàn)g覽
說(shuō)明:這篇文原理本不是“長(zhǎng)”這個(gè)樣子?上в捎跀嚯娋壒 ,只好根據(jù)記憶克隆了,同時(shí)也簡(jiǎn)單很多。希望起到拋磚引玉的作用!

初看第八問(wèn),不解。想:其它初學(xué)shell者亦同。故解之!

變量替換:
一:簡(jiǎn)單賦值和替換
a=bcd
$ echo $a  
bcd
$ echo ${a}
bcd

二:變量擴(kuò)充
除了shell中的meta,其它的[^a-zA-Z0-9_]幾乎都可以作單詞邊界。
同sed中關(guān)于單詞邊界[^a-zA-Z0-9_]的描述。
http://72891.cn/forum/24/20040825/393964.html
這些功能有時(shí)候會(huì)在程序中有意想不到的作用!
例如:
$ a=bcd
$ echo ${a}.b
bcd.b
$ echo $a.php
bcd.php
$ echo $a%b
bcd%b
$ echo /$a/bc
/bcd/bc
對(duì)于shell中的meta字符,則backslash。
$ echo $a\*b
bcd*b

三:變量中的變量
$ a=bcd
$ b=efg
$ c=$a$b
$ echo $c
bcdefg
$ d=$c.ghi
$ echo $d
bcdefg.ghi

思考:若變量互相嵌套,會(huì)怎樣呢?

四:變量的特異功能
到網(wǎng)中人的啦。╬s:重寫(xiě)真是沒(méi)激情啊)
file=/dir1/dir2/dir3/my.file.txt
我們可以用 ${ } 分別替換獲得不同的值:
${file#*/}:從變量file的字符串左邊開(kāi)始,刪除字符直到第一個(gè)“/”:dir1/dir2/dir3/my.file.txt
${file##*/}:從變量file的字符串左邊開(kāi)始,刪除字符直到最后一個(gè)“/”:my.file.txt
${file#*.}:從變量file的字符串左邊開(kāi)始,刪除字符直到第一個(gè)“.”:file.txt
${file##*.}:從變量file的字符串左邊開(kāi)始,刪除字符直到最后一個(gè)“.”:txt

其實(shí),在“#”后面,無(wú)非就是一個(gè)匹配問(wèn)題,不限于兩個(gè),你可以放任意個(gè)字符,還可以用shell中另外的通配符“?”“[…]”“[!…]”,例如:
$ echo ${file#????}
1/dir2/dir3/my.file.txt
$ echo ${file#*[0-9]}
/dir2/dir3/my.file.txt
$ echo ${file#/dir1/dir[0-9]}
/dir3/my.file.txt

“#”:相當(dāng)于最小匹配,遇到一個(gè)最小的符合其后表達(dá)式的字符串(單個(gè)或多個(gè))即中止匹配動(dòng)作;
“##”:相當(dāng)于最大匹配,它盡可能的匹配更多的字符。
我們可以拿“*”來(lái)說(shuō)明:  
*  在shell中表示匹配任何符號(hào)包括空。當(dāng)它在只有一個(gè) # 的變量替換中,受最小匹配的影響,它不會(huì)匹配任何可打印字符,只匹配一個(gè)空,也就是什么也不匹配,你完全可以忽略它的存在;
當(dāng)在有兩個(gè) ## 的變量替換中,受最大匹配的影響,一個(gè) * 表示匹配整個(gè)字符串。
如果想匹配字符“*”時(shí),要在“*”前加一個(gè)“\”,其后的“*”失去通配符的功能。
但是還有一種例外情況(請(qǐng)接著看)


例:
$ file2=abcd.efgh.ijkl.oopp
$ echo ${file2#*.*.*.*}
$ echo ${file2##*.*.*.*}

想想上面兩個(gè)的輸出是什么?
$ echo ${file2#*.*.*.*}
oopp
$ echo ${file2##*.*.*.*}

??知道為什么嗎?因?yàn)椋骸?”匹配任何符號(hào)包括空。遇到一個(gè)“#”時(shí),最后一個(gè)“*”就匹配“空”去了?聪旅娴模
$ echo ${file2#*.*.*.?}
opp
$ echo ${file2#*.*.*.?*}
opp
$ echo ${file2##*.*.*.?}
opp
$ echo ${file2##*.*.*.?*}

do you know?

$ echo $file3
*ab*de*cd
看看下面將輸出什么?
$ echo ${file3#*ab}      
*de*cd
$ echo ${file3#**}
*ab*de*cd
$ echo ${file3##**}

$ echo ${file3#\*ab}
*de*cd
$ echo ${file3#\**}
ab*de*cd
$ echo ${file3##\**}

$ echo ${file3#*a}
b*de*cd
$ echo ${file3#\*a}
b*de*cd

不知各位有沒(méi)有發(fā)現(xiàn),“*”在一個(gè)“#”中時(shí),并不一定代表“空”,它可能代表一個(gè)字符“*”也可能代表其他的什么字符,如上例的:
“$ echo ${file3#*a}”輸出為“b*de*cd”,其實(shí)這還是符合最小匹配理論的。這個(gè)表達(dá)式的意思是:從變量file3的字符串左邊開(kāi)始刪除字符,直到遇到第一個(gè)字符“a”。所以不要和“$ echo ${file3#\*a}”混淆,雖然兩個(gè)結(jié)果是一樣,但意思是不一樣的。

再舉幾個(gè)例子,相信大家更容易理解這段話(huà):
$ echo $file3
*ab*de*cd*ab*de                     //注意:出現(xiàn)兩個(gè)“*ab”
$ echo ${file3#*a}
b*de*cd*ab*de                         //刪除字符,直到出現(xiàn)第一個(gè)“a”,“*”為通配符
$ echo ${file3##*a}
b*de                                           //刪除字符,直到出現(xiàn)第二個(gè)“a”,“*”為通配符
$ echo ${file3##\*a}
b*de*cd*ab*de                         //刪除字符串“*a”,“*”在“\”表示字符“*”

除了通配符“*”比較難理解一點(diǎn),其他的shell通配符就都很容易了。

至于“%”,和“#”不同的地方,就是從變量字串右部開(kāi)始。
${file%/*}:從右部開(kāi)始拿掉字符,直到遇到(從右部數(shù)起的)第一個(gè)“/” :/dir1/dir2/dir3
${file%%/*}:從右部開(kāi)始拿掉字符,直到遇到(從右部數(shù)起的)最后一個(gè)“/”:(空值)
${file%.*}:從右部開(kāi)始拿掉字符,直到遇到(從右部數(shù)起的)第一個(gè)“.”:/dir1/dir2/dir3/my.file
${file%%.*}:從右部開(kāi)始拿掉字符,直到遇到(從右部數(shù)起的)最后一個(gè)“.”:/dir1/dir2/dir3/my

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2004-09-02 18:53 |只看該作者

網(wǎng)中人“shell十三問(wèn)之變量替換” 外傳(初學(xué)shell必看)

zhichi

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2004-09-03 13:50 |只看該作者

網(wǎng)中人“shell十三問(wèn)之變量替換” 外傳(初學(xué)shell必看)

辛苦了,頂。。。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2004-09-03 17:13 |只看該作者

網(wǎng)中人“shell十三問(wèn)之變量替換” 外傳(初學(xué)shell必看)

支持

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2004-09-04 21:49 |只看該作者

網(wǎng)中人“shell十三問(wèn)之變量替換” 外傳(初學(xué)shell必看)

不錯(cuò).

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2004-09-05 18:27 |只看該作者

網(wǎng)中人“shell十三問(wèn)之變量替換” 外傳(初學(xué)shell必看)

原帖由 "shaoping0330" 發(fā)表:
dir3/my.file.txt

“#”:相當(dāng)于最小匹配,遇到一個(gè)最小的滿(mǎn)足其內(nèi)表達(dá)式的即中止刪除動(dòng)作。
“##”:相當(dāng)于最大匹配
例:
$ file2=abcd.efgh.ijkl.oopp
$ echo ${file2#*.*.*.*}
$ echo ${file2##*.*.*.*}
..........


有幾個(gè)現(xiàn)象很奇怪,請(qǐng)大俠解釋一下

[root@lfs tmp]# echo ${file3#*}
*ab*de*cd
[root@lfs tmp]# echo ${file3#**}
*ab*de*cd
[root@lfs tmp]# echo ${file3#***}
*ab*de*cd

上面的3個(gè)例子,第一個(gè)容易理解,“*”匹配空了
但是為什么第二、第三個(gè)會(huì)輸出同樣的結(jié)果?難道所有的“*”都匹配空了?

[root@lfs tmp]# echo ${file3##*}

為什么上面的“*”沒(méi)有匹配空?
是否可以這樣理解,比如變量值為“*ab*de*cd”,表達(dá)式處理的時(shí)候認(rèn)為值是“空*ab*de*cd空”上面的例子“*”匹配最后面的空,所以輸出空。

[root@lfs tmp]# echo ${file3##\*}
ab*de*cd
[root@lfs tmp]# echo ${file3#\*}
ab*de*cd

我的理解,第一條應(yīng)該輸出“cd”而不是“ab*de*cd”,因?yàn)槠ヅ渥詈笠粋(gè)“*”,可是上面的結(jié)果怎么理解?為什么第一條和第二條的結(jié)果一樣?

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2004-09-06 15:50 |只看該作者

網(wǎng)中人“shell十三問(wèn)之變量替換” 外傳(初學(xué)shell必看)

好,

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2004-09-06 20:26 |只看該作者

網(wǎng)中人“shell十三問(wèn)之變量替換” 外傳(初學(xué)shell必看)

原帖由 "whtlly" 發(fā)表:

我的理解,第一條應(yīng)該輸出“cd”而不是“ab*de*cd”,因?yàn)槠ヅ渥詈笠粋(gè)“*”,可是上面的結(jié)果怎么理解?為什么第一條和第二條的結(jié)果一樣?

[root@lfs tmp]# echo ${file3##*\*}
cd
[root@lfs tmp]# echo ${file3#*\*}
ab*de*cd


呵呵,明白了,我少了一個(gè)“*”
太多的*把我弄糊涂了
但是第一個(gè)例子還是沒(méi)有想清楚

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2004-09-07 10:02 |只看該作者

網(wǎng)中人“shell十三問(wèn)之變量替換” 外傳(初學(xué)shell必看)

這是13問(wèn)例子我怎么調(diào)不通
$ file=/dir1/dir2/dir3/my.file.txt
$ echo ${file:0:5}
替代錯(cuò)誤???????

我的本意是找出來(lái)年(eg:2004)給變量year
date '%y'
D=`date`
year=`${$D:0:4}`
echo $year
我的不對(duì),錯(cuò)在那里呀?

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2004-09-07 10:08 |只看該作者

網(wǎng)中人“shell十三問(wèn)之變量替換” 外傳(初學(xué)shell必看)

上機(jī)試試就會(huì)容易理解一些,關(guān)鍵是“#(%)”和“##(%%)”的區(qū)別。

應(yīng)該說(shuō),一個(gè)“#”:若僅出現(xiàn)通配符,如“*”,代表“空”;
而兩個(gè)“#”:若僅出現(xiàn)通配符,如“*”,代表“一切”;

若加上其它特定字符后,如“*ab”在“4abty7ab”中:
一個(gè)“#”時(shí):“*ab”盡可能匹配最小范圍,如僅匹配到“4ab”就不會(huì)往下匹配;
而兩個(gè)“#”:“*ab”盡可能匹配最大范圍,它將匹配到整個(gè)字符串。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP