Shell Lưu các giá trị phần tử mảng trong các biến


0

Tôi cần sao chép các tệp từ thư mục này sang thư mục khác, ở đây thông tin nguồn và đích nằm trong tệp văn bản.

Nội dung tệp: res.txt

/ var / lib / jenkins / công việc kiểm tra \ build / workspace / MainApp / app / src / main / res / drawable / logo_Station.png

Ở đây tôi đang cố gắng phân tách chuỗi với dấu phân cách "=" và gán nó cho các biến tương ứng. Và, cần kích hoạt lệnh sao chép.

Để thực hiện điều trên, tôi đang cố gắng tách chuỗi thành một mảng và gán giá trị phần tử chỉ mục mảng cho các biến cục bộ

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]}

bị lỗi như

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

và cho echo Nhận đầu ra là

+ echo

+ echo

@Gombai Sandor, tôi đã thay đổi ở trên theo đề xuất của bạn và nó hoạt động.

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

Câu trả lời:


1

Bạn đang trộn vỏ if [...] ... elif [...] ... fi cú pháp vào mã của awk. awk sẽ sử dụng

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

trong ngữ cảnh này.

Ngoài ra, bạn mong đợi mảng của awk xuất hiện trong shell cha của awk tại đây

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

Điều này sẽ không xảy ra. Bạn có thể viết các chuỗi trong awk và phân tích đầu ra trên shell, đặt awk (hoặc bất kỳ chương trình nào khác) sẽ không xử lý môi trường gọi của nó.

Trường hợp lỗi cú pháp được chỉ định là một hỗn hợp khác:

${numbers[1]}

là một tham chiếu phần tử bash ... trong một mã awk (nó gần như có ý nghĩa gì đó với awk nhưng tôi đề nghị không ép buộc điều này).

Tôi khuyên bạn nên mô tả chính xác CÁI GÌ của bạn là gì và hỏi gợi ý vì CÁCH BẠN muốn giải quyết nó ở đây và giải thích lý do tại sao nó không hoạt động sẽ hơi lâu. Nhưng trước hết bạn nên tiêu hóa thứ mà shell (và ngôn ngữ của nó) là một thứ và awk (và ngôn ngữ của nó) chạy bên trong nó là một thứ khác. Họ có các yếu tố tương tự nhưng đó là sự tương tự CHỈ.

Chỉ cần chia một chuỗi thành hai phần nếu chúng được kết nối thông qua một ký tự là khá dễ dàng và không cần awk. cắt là chương trình tách cơ bản.

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

sẽ đặt trường đầu tiên vào SOURCE nơi các trường được phân tách bằng = trong đầu vào của cắt tỉa Đôi khi, bạn có thể bắt gặp các mã như,

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

cái nào cũng vậy DEST có thể được chỉ định tương tự với cả hai phương pháp nhưng nhắm mục tiêu vào trường thứ hai.


awk không sử dụng "then" nhưng nó mong đợi {} xung quanh các khối lệnh của if / other nếu chúng chứa nhiều hơn một lệnh
Gombai Sándor

Cảm ơn, thêm mô tả cho yêu cầu chính xác
Nagaraj ks

Cảm ơn Nó hoạt động. Tôi mắc kẹt trong này hơn nhiều giờ, bạn đã tiết kiệm thời gian của tôi.
Nagaraj ks

Vui mừng được giúp đỡ. Hãy vui vẻ với nó!
Gombai Sándor

cp -f / var / lib / jenkins / jobs / Android \ Gradle \ test \ build / workspace / MainApp / app / src / main / res / drawable-hdpi / logo_Station.png / var / lib / jenkins / jobs / Android \ Gradle \ test \ build / workspace / MainApp / app / src / main / res / drawable / logo_Station.png Trước đây tôi đã cố đọc dòng trên từ tệp và thực thi lệnh, nhưng luôn gặp lỗi "dòng 21: / src / main / res / drawable / logo_Station.png: Không có tệp hoặc thư mục như vậy "
Nagaraj ks
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.