Shell 將陣列元素值保存在變數中

Shell 將陣列元素值保存在變數中

我需要將文件從一個資料夾複製到另一個資料夾,這裡來源和目標資訊位於文字檔案中。

文件內容:res.txt

/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable-hdpi/logo_splash.png=/var/lib/jenkins/jobs/Android\ Gradle\測試\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png

在這裡,我嘗試用分隔符號“=”分割字串並將其分配給相應的變數。並且,需要觸發複製命令。

為了完成上述任務,我嘗試將字串拆分為數組並將數組索引元素值分配給局部變量

lines=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable-hdpi/logo_splash.png=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png
SOURCE=""
DEST=""
echo $lines | awk '{split($0,numbers,"=")} END {
for(n in numbers){
   if (n == 1) { 
      SOURCE = ${numbers[1]}
   }
   else if (n == 2) {
      DEST= ${numbers[2]}
   }
}}'
echo ${numbers[1]}
echo ${numbers[2]}

得到錯誤為

awk: {split($0,numbers,"=")} END {for(n in numbers){ SOURCE = ${numbers[1]}}
awk:                                                           ^ syntax error

對於 echo 獲取輸出為

+ echo

+ echo

@Gombai Sandor,我已按照您的建議更改了上述內容,並且有效。

SOURCE=$(echo $lines | awk -F= '{print $1}')
echo "source is " $SOURCE
DESTINATION=$(echo $lines | awk -F= '{print $2}')
echo "destination is " $DESTINATION

答案1

您正在將 shell 的if [...] ... elif [...] ... fi語法混合到 awk 的程式碼中。 awk 會使用

if (...) {
   ...
} else if (...) {
   ...
}

在此背景下。

另外,您期望 awk 的陣列出現在 awk 的父 shell 中

echo ${numbers[1]}
echo ${numbers[2]}

這不會發生。您可以在 awk 中編寫字串並解析 shell 中的輸出,awk(或任何其他程式)不會破壞其呼叫環境。

指出語法錯誤的地方是另一種混合:

${numbers[1]}

是 awk 程式碼中的 bash 數組元素引用...(它幾乎對 awk 有一些意義,但我建議不要強迫這樣做)。

我建議描述您的任務到底是什麼並尋求提示,因為您希望如何在這裡解決它並解釋為什麼它不起作用會有點長。但首先您應該理解 shell(及其語言)是一回事,而在其中運行的 awk(及其語言)是另一回事。它們具有相似的元素,但這只是相似之處。

如果字串透過單一字元連接,則將字串分成兩部分非常簡單,並且不需要 awk。 cut 是基本的分割程序。

SOURCE=$(echo $lines | cut -f1 -d=)

將把第一個欄位放入 SOURCE,其中欄位在輸入中以 = 分隔 有時,您可能會遇到類似的程式碼,

SOURCE=$(echo $lines | awk -F= '{print $1}')

這是一樣的。可以使用這兩種方法類似地分配 DEST,但目標是第二個欄位。

相關內容