
我需要將文件從一個資料夾複製到另一個資料夾,這裡來源和目標資訊位於文字檔案中。
文件內容: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,但目標是第二個欄位。