한 폴더에서 다른 폴더로 파일을 복사해야 합니다. 여기서 소스 및 대상 정보는 텍스트 파일에 있습니다.
파일 내용: 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
if [...] ... elif [...] ... fi
쉘의 구문을 awk의 코드에 혼합하고 있습니다 . awk는 사용할 것이다
if (...) {
...
} else if (...) {
...
}
이 맥락에서.
또한 awk의 배열이 여기에서 awk의 상위 쉘에 나타날 것으로 예상합니다.
echo ${numbers[1]}
echo ${numbers[2]}
이런 일은 일어나지 않을 것입니다. awk에 문자열을 작성하고 쉘 put awk(또는 다른 프로그램)의 출력을 구문 분석하면 호출 환경이 엉망이 되지 않습니다.
구문 오류가 표시된 곳에는 또 다른 혼합이 있습니다.
${numbers[1]}
awk 코드의 bash 배열 요소 참조입니다(awk에는 거의 의미가 있지만 강제로 적용하지 않는 것이 좋습니다).
여기서는 문제를 어떻게 해결하고 싶은지, 작동하지 않는 이유를 설명하는 것이 약간 길기 때문에 작업이 정확히 무엇인지 설명하고 힌트를 요청하는 것이 좋습니다. 하지만 먼저 쉘(및 해당 언어)이 하나이고 그 내부에서 실행되는 awk(및 해당 언어)가 다른 것이라는 점을 이해해야 합니다. 그들은 유사한 요소를 가지고 있지만 그것은 단지 유사성일 뿐입니다.
문자열이 단일 문자를 통해 연결된 경우 문자열을 두 부분으로 나누는 것은 매우 쉽고 awk가 필요하지 않습니다. cut은 기본적인 분할 프로그램입니다.
SOURCE=$(echo $lines | cut -f1 -d=)
첫 번째 필드를 SOURCE에 입력합니다. 여기서 필드는 입력에서 =로 구분됩니다.자르다 때때로 다음과 같은 코드를 접할 수 있습니다.
SOURCE=$(echo $lines | awk -F= '{print $1}')
그것은 동일합니다. DEST는 두 방법 모두와 비슷하게 할당할 수 있지만 두 번째 필드를 대상으로 합니다.