[英]looping through array in bash does not work
我有一個數組filesToDelete
並為echo $filesToDelete
獲取以下輸出
value1 value2 value3 value4
當我嘗試遍歷數組以從當前文件夾中刪除文件時:
for i in '${filesToDelete[@]}'
do
# rm $i
rm $i*.*;
done
它說如下:
rm: ”${filesToDelete[@]}*.*” can not be deleted: no such file or directroy
這些文件存在,並且我在正確的目錄中能夠執行delete方法,但仍然收到錯誤。
如果我更改循環為:
for i in "${filesToDelete[@]}"
我收到包含done
的行的Bad substitution
錯誤
當我查找google時,建議在第一行中使用#!/bin/bash
,這對我來說也是一樣。
任何想法如何從陣列中刪除文件?
如果echo $filesToDelete
打印元素列表,則它不是數組; 如果它是僅打印第一個元素的實際數組。 我很確定您實際擁有的只是一個字符串,空格之間用空格隔開。
您遇到的直接問題是,已將變量(/ array)引用放在單引號中,而shell在單引號內不執行變量擴展。 實際上,它不對單引號的內容進行任何解析(除了查找右引號之外)。 在外殼程序中,有3個主要的引用上下文:
$
開頭的事情),以及帶反引號的命令和一些轉義( \\
)序列。 一旦變量(等)被替換,就不會對替換值進行解析(這幾乎總是您想要的)。 由於filesToDelete顯然是純文本字符串,文件名之間用空格分隔,因此您需要引用該文件時不要用引號將其拆分為單詞。 但是,如果任何文件名包含空格和/或通配符,這將導致災難性的失敗。 我的標准示例是Apple的iTunes 2.0安裝程序,其中包含刪除舊版本的命令。 類似於rm -R $1
。 如果舊版本位於/ Volumes / Data 2 / Applications / iTunes.app,則將刪除/ Volumes / Data的全部內容 ,然后抱怨2 / Applications / iTunes.app不存在。 之后,蘋果很快就發布了2.0.1版本,唯一的變化是在$1
的引用周圍添加了雙引號。 IIRC他們還為一些客戶購買了數據恢復軟件。
如果您需要安全地存儲多個文件名,請使用一個實數數組。 使用filesToDelete=(value1 value2 value3 value4)
類的東西創建它(請注意,這里也執行了單詞拆分和通配符擴展,因此filesToDelete=(value1 value2 value3 value4)
所有變量引用都用雙引號引起來)。 然后將其與以下內容一起使用:
for i in "${filesToDelete[@]}"; do
rm "$i"*.*
done
請注意,在rm
命令中,我在變量引用周圍加上了雙引號,但沒有將需要解釋為通配符的部分。 (此外,在shell中,不需要在行尾使用分號,因此我將其省略。)
這里有一個簡單的答案,但是用戶由於某種原因將其刪除了,所以這里的內容很簡單,也很出色:)
for file in $filesToDelete
do
rm "$file"*.*;
done
這比我的方法要簡單得多。 謝謝他,無論他是誰!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.