명령을 변수에 저장하려고 하면 중괄호가 사라집니다.

명령을 변수에 저장하려고 하면 중괄호가 사라집니다.

일부 작업 후에 명령을 인쇄하고 나중에 사용하기 위해 다른 변수에 저장하고 싶습니다. 사용법은 이렇습니다.

source new.sh tmp

new.sh의 내용:

#!/bin/sh

 set a = `cat $1`
 echo $a

cat $1내 실제 사용 사례는 grep과 sed 명령의 조합 이 아닙니다 .

TMP의 내용:

hello world !!! {curly}braces missed

현재 출력:

hello world !!! curlybraces missed

이상적인 출력은 입력 파일 tmp를 변경하지 않고 중괄호를 유지하는 것입니다. 미리 감사드립니다.

답변1

source new.sh tmp

source스크립트는 대화형 셸에 관계없이 실행되므로 hashbang 줄에 셸을 설정해도 #!/bin/sh효과가 없으며 오해의 소지가 있습니다.

set a = `cat $1`

명명된 변수를 설정하기 위한 csh 구문입니다 a. sh에서는 $1위치 인수(등)을 a, =...로 설정합니다. 에서 일부 값을 얻으므로 a이는 csh를 실행 중이거나 a이전에 대화형 셸에서 다른 것을 설정했다는 의미입니다.

hello world !!! {curly}braces missed
hello world !!! curlybraces missed

누락된 중괄호는 내 csh에서 확장이 인용되지 않은 경우 정확히 발생합니다.

% set a = '{curly}braces'
% echo $a
curlybraces

이것은 아마도 csh가 중괄호 확장을 처리하는 방법일 것입니다. Bash와 ksh는 내부에 쉼표가 없으면 중괄호를 확장하지 않으며 Bash는 변수 확장 또는 명령 대체 후에 중괄호를 확장하지 않습니다.

따라서 csh에서는 다음을 인용해야 할 것 같습니다.

set a = "`cat $1`"
echo $a

나는 csh에 대해 잘 모르기 때문에 이것이 여전히 틀릴 수도 있습니다.

또는 정말로 sh를 사용하고 싶다면 다음과 같아야 합니다:

#!/bin/sh
a=$(cat "$1")
echo "$a"

다음과 같이 스크립트를 실행해야 합니다 ./new.sh.source

(에코 대신 `printf "%s\n" "$a"를 사용하는 것이 더 좋습니다.)

관련 정보