제공된 인수를 변경하는 동안 에뮬레이터에서 특정 프로그램을 실행하기 위한 스크립트를 작성 중인데, bash가 큰따옴표 주위에 작은따옴표를 계속 삽입하여 에뮬레이터가 충돌하는 문제가 발생했습니다. 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
스크립트
#!/bin/bash
#./matrix_sim MM1.x86 1024 X86 gem5.opt
PROGRAM=$1
ARGUMENT=$2
ARCHI=$3
TARGET=$4
./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o \"$ARGUMENT\"
이 스크립트를 실행하면 실제 출력은 다음과 같습니다.
./gem5/build/X86/gem5.opt gem5/configs/example/se.py -c ./MM1.x86 -o '"2"'
그런데 내가 정말 하고 싶은 일은 바로 이것이다.
./gem5/build/X86/gem5.opt gem5/configs/example/se.py -c ./MM1.x86 -o "2"
출력에서 단일 틱을 어떻게 제거할 수 있습니까?
답변1
Bash는 문자열에 작은따옴표를 추가하지 않습니다. 작은따옴표가 추적된 출력을 시각적으로 명확하게 만드는 방법 set -x
. Bash에서는 set -x
쉘 특수 문자(공백 및 )가 포함된 문자열 주위에 작은따옴표를 배치하여 !"#$&\()*;<>?[\]^`{|}~
시각적으로 명확한 출력을 생성합니다 . 여기서는 a가 포함된 인수를 취하는 명령을 따르고 있으므로 bash는 셸이 아닌 문자열의 리터럴 문자임을 "
분명히 하기 위해 주위에 작은따옴표를 사용하여 이를 인쇄합니다. 소스 문법의 특정 문자."
갖고 싶지 않은 것 같군요큰따옴표논쟁에서. 그러니 놔두지 마세요.
변수 확장 주위에 큰따옴표를 사용해야 하지만 쉘 구문에서는 큰따옴표 문자가 문자열에 들어가도록 따옴표로 묶은 큰따옴표를 배치하는 것이 아니라 단지 큰따옴표일 뿐입니다.
"./gem5/build/$ARCHI/$TARGET" gem5/configs/example/se.py -c "./$PROGRAM" -o "$ARGUMENT"
답변2
그냥 사용하십시오 "$ARGUMENT"
:
./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o "$ARGUMENT"
set -x
Bash는 를 사용할 때 작은따옴표(예: 추적 출력에)를 추가합니다. \"$ARGUMENT\"
왜냐하면 매개변수 값의 일부로 큰따옴표를 포함하기 때문입니다(대부분아니요당신은 무엇을 원합니까).
답변3
복사할 수 없음:
$ ./in.sh program arg arch target
./gem5/build/arch/target gem5/configs/example/se.py -c ./program -o "arg"
$ cat in.sh
#!/bin/bash
#./matrix_sim MM1.x86 1024 X86 gem5.opt
PROGRAM=$1
ARGUMENT=$2
ARCHI=$3
TARGET=$4
echo ./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o \"$ARGUMENT\"
나는 여러분이 보고 있는 것을 재현하려고 많은 노력을 했지만 할 수 없었습니다.
다음을 시도해 볼 수도 있습니다.
ARGUMENT="\"$2\""
그런 다음 호출 주위에서 이스케이프된 따옴표를 제거합니다.
echo ./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o "$ARGUMENT"