![awk 명령을 사용할 때 스크립트가 루프에 걸리거나 정지됩니다.](https://linux55.com/image/171519/awk%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20%EB%A3%A8%ED%94%84%EC%97%90%20%EA%B1%B8%EB%A6%AC%EA%B1%B0%EB%82%98%20%EC%A0%95%EC%A7%80%EB%90%A9%EB%8B%88%EB%8B%A4..png)
내 프로그램에서 입력의 하위 문자열을 가져와 비교하고 변수로 저장하고 싶지만 내 스크립트가 루프에 고정/고착된 것 같습니다.
#!/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몇 가지 예를 들어보세요.