簡體   English   中英

在bash中遍歷數組不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM