대화형 스크립트에 입력을 제공하기 위해 다음 문자열을 사용했습니다.
script <<< $'1 2\n3 4\n5 6\nq'
이는 효과적으로 들어갑니다.
1 2
3 4
5 6
q
스크립트를 입력하세요. 하지만 그 중 하나를 변수로 바꾸는 방법은 무엇입니까?
script <<< $'$var 2\n3 4\n...'
작동하지 않습니다 ...
답변1
여기서는 문자열이 아니지만ANSI-C 인용문:
$'string' 형식의 단어는 특별하게 처리됩니다. ...확장 결과는 마치 달러 기호가 없는 것처럼 작은따옴표로 묶였습니다.
그래서 당신이 얻는 것은 오른쪽에 작은따옴표로 묶인 문자열입니다 <<<
. 여기서 문자열은 문자열로 처리되며 추가 처리가 필요하지 않습니다.
그러나 전체 단어에 하나의 따옴표만 사용할 필요는 없습니다. 인용된 여러 부분(또는 인용문이 없는 단일 단어)을 함께 연결할 수 있습니다.
script <<< "$var 2"$'\n'"3 4"$'\n'"5 6"$'\n'q
당신이 원하는 것을 할 것입니다.
또는 따옴표 대신 백슬래시를 사용하여 공백을 이스케이프 처리할 수 있습니다 "1 2"
.
당신은 또한 사용할 수 있습니다echo -e
일반 파이프를 사용하십시오.
echo -e "$var 2\n3 4\n5 6\nq" | script
또는printf
:
printf '%s 2\n3 4\nq' "$var" | script
-e
echo
이는 매개변수에서 이스케이프 처리를 활성화하는 데 필요합니다. printf
이는 기본적으로 수행되지만 자체 보간 시스템이 있습니다( printf "$var 2\n3 4\nq"
이 역시 작동하지만 $var
이스케이프 문자가 포함될 수 있는 경우 문제가 발생함).
답변2
ANSI $'...'
-C 인용은 "작은따옴표" 문자열을 생성합니다.
작은따옴표로 묶인 문자열 내의 변수는 확장되지 않습니다.
$ var=13
$ echo 'test $var'
test $var
이러한 구조에서 변수를 제거해야 합니다. IMO 가장 간단한 방법은 다음과 같습니다.
$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"
13 2
3 4
5 6
q
to의 형식은 printf
이전 형식과 매우 유사하며 %s
변수 값으로 대체됩니다. 변수의 결과를 얻으려면 변수를 설정하는 bash printf 함수를 사용할 수 있습니다.
$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"
$ script <<< "$val"
한 줄에 모두 :
$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"; script <<< "$val"