여기 문자열에 변수 사용

여기 문자열에 변수 사용

대화형 스크립트에 입력을 제공하기 위해 다음 문자열을 사용했습니다.

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

-eecho이는 매개변수에서 이스케이프 처리를 활성화하는 데 필요합니다. 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"

관련 정보