awk 명령을 사용할 때 스크립트가 루프에 걸리거나 정지됩니다.

awk 명령을 사용할 때 스크립트가 루프에 걸리거나 정지됩니다.

내 프로그램에서 입력의 하위 문자열을 가져와 비교하고 변수로 저장하고 싶지만 내 스크립트가 루프에 고정/고착된 것 같습니다.

#!/bin/bash

ram="5G";
file="forge.jar"
dir="MC/Eternal/"

echo $@

for var in $@
do
    begin= `awk -v awkvar="$var" '{print substr($awkvar,1,2)}'`
    end= `awk -v awkvar="$var" '{print substr($awkvar,3)}'`
    echo $begin $end
    if [ $begin = "-r" ]
    then
        echo Setting ram to $end
        ram=$end
    elif [ $begin = "-d" ]
    then
        echo "Looking for directory MC/$out"
        directory=$end
    elif [ $begin = "-f" ]
    then
        echo "Looking for file $out"
        file=$end
    fi
done
echo running command: java -Xms1G -Xmx$ram -jar $dir$file
echo Do you want to run it? [Y/n]:
read input
if [ input = "y" ]
    java -Xms1G -Xmx$ram -jar $dir$file
else
    echo cancelled
fi

입력할 때 을(를) ./runserver.sh -r10G -dfoo -fmc.jar얻을 것으로 예상 java -Xms1G -Xmx10G -jar MC/foo/mc.jar ...하지만 프로그램이 줄에서 멈춘 것 같습니다 begin= .... 나는 begin = awk '{print substr($awkvar,1,2)}단지 성명 begin = awk '{substr($awkvar,1,2)}'주위에 백틱을 넣어 보았습니다 awk. 저는 Linux를 처음 접했고 방금 성공적으로 부팅하여 Minecraft 서버에 연결했습니다. 모든 도움에 감사드립니다.

"${var:x:y}"편집: 함수 대신 을 사용하면 awk하위 문자열을 얻을 수 있다는 것을 알았습니다. 그러나 프로그램은 나에게 제공되는 오류를 통해 인수를 문자열로 변환하는 대신 인수를 실행하려고 시도하는 것 같습니다../runserver.sh: line 11: -r: command not found

답변1

쉘 변수 할당에는 공백이 허용되지 않습니다. 따라서 begin= ``awk... 초기화를 시작하고 비우기 시작한 다음 awk의 출력을 명령으로 실행해 보십시오. 끝과 동일 =

파일이나 표준 입력에서 입력을 제공하지 않았기 때문에 두 awk가 모두 중단되었습니다. 실제 데이터를 기반으로 하지 않고 BEGIN 규칙에서만 이 작업을 수행하고 싶을 수도 있습니다.

아마도 $var에서 몇 개의 문자를 가져오기 위해 awk를 사용할 계획일 것입니다. 하위 문자열과 잘 작동하는 몇 가지 쉘 옵션이 있습니다. 이를 위해 awk를 실행할 필요가 없습니다.

$awkvar의 쉘 구성을 사용하고 있기 때문에 awks는 작동하지 않습니다. awk 자체 내에서 $를 사용하면 안 됩니다(awk 내부의 필드 번호를 지정함).

쉘 하위 문자열 연산자를 발견했지만 업데이트된 스크립트가 표시되지 않습니다.

새로운 것은 if [ $begin = "-r" ]$begin을 확장하기 때문에 실패하고 테스트에서는 [ -r = -r ]-r이 옵션이라고 보고 생각합니다. 더 나은 버전의 테스트 구문을 사용하고 인용하면 작동할 것입니다.

paul $ begin="-r"
paul $ if [[ "${begin}" = "-r" ]]; then echo true; fi
true
paul $ 

답변2

명령줄 인수를 구문 분석하는 코드가 너무 복잡합니다. 대신 bash 내장 명령 "getopts"를 사용하십시오. 바라보다https://stackoverflow.com/questions/16483119/an-example-of-how-to-use-getopts-in-bash몇 가지 예를 들어보세요.

관련 정보