2 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
for 語(yǔ)句中的 in 后面的內(nèi)容就是需要被循環(huán)的哪些項(xiàng)。 比如?for i in A B C 在循環(huán)時(shí),i 就分別是 A、B、C 這三個(gè)單詞。
你理解這個(gè) for 循環(huán)里的 i 是要在哪些項(xiàng)里循環(huán)嗎?
你的例子中這些項(xiàng)就是?$(ls *.tar.gz *.gz) 這個(gè)東西。
先不管 $ 和 (),單看?ls *.tar.gz *.gz,這是一個(gè) ls 命令,會(huì)列出當(dāng)前目錄下所有的 .tar.gz .gz 結(jié)尾的文件。而所列出的這些文件名就是需要循環(huán)的項(xiàng)。
也就是說(shuō)你想要的循環(huán)項(xiàng)不是“l(fā)s *.tar.gz *.gz”這三個(gè)字,而是這句 ls 命令的執(zhí)行結(jié)果。
像這樣,想要在 bash 腳本中得到一個(gè)命令的執(zhí)行結(jié)果,叫做“命令替換”。它的語(yǔ)法就是用 $( ?) 把命令括起來(lái),到腳本運(yùn)行時(shí)這里就會(huì)替換為該命令的執(zhí)行結(jié)果了。
所以你這里既然需要的是 ls 的執(zhí)行結(jié)果,那就要寫?$(ls *.tar.gz *.gz)。
既然 $(...) 是“命令替換”的語(yǔ)法格式,那當(dāng)然不能去掉 $ 了。
多說(shuō)一些:
如果去掉 $ 會(huì)怎么樣呢? ?只剩下 (ls *.tar.gz *.gz),這里出現(xiàn)小括號(hào)是不合法的,所以腳本在執(zhí)行到這里時(shí)會(huì)直接報(bào)錯(cuò)。
再多說(shuō)一些:
前面說(shuō) in 后面的這些“字”就是循環(huán)項(xiàng)。 其實(shí)呢,for 語(yǔ)句會(huì)嘗試對(duì)這些“字”做“路徑名展開(kāi)”?!奥窂矫归_(kāi)”就是指展開(kāi)那些路徑通配符 * ? 什么的。
所以如果你在 in 后面直接寫?*.tar.gz,這里會(huì)直接被替換為所有 *.tar.gz 結(jié)尾的文件名,這樣你甚至不需要用 ls 命令來(lái)幫你列出它們。
所以這句你直接寫成?for i in *.tar.gz *.gz 也是可以的。
但有一點(diǎn):如果沒(méi)能成功進(jìn)行路徑名展開(kāi)(也就是說(shuō)目錄下沒(méi)有這樣的文件),那 *tar.gz(或 *.gz)還是會(huì)被當(dāng)作一個(gè)單純的字來(lái)用。
最后多說(shuō)一點(diǎn):
對(duì)于前面一人的回答。$ 放在變量名前才是“變量展開(kāi)”。而這里根本就沒(méi)有變量的事,這只是“命令替換”而已。

TA貢獻(xiàn)232條經(jīng)驗(yàn) 獲得超302個(gè)贊
不加$符號(hào)當(dāng)然不可以了,shell里面加$符號(hào)才知道這是變量,想得到返回值
添加回答
舉報(bào)