작은따옴표로 묶어 명령에 매개변수 전달

작은따옴표로 묶어 명령에 매개변수 전달

스크립트를 실행하려고 합니다.

#!/bin/sh 
A=multichain-cli chain97 issue 1XRnkvTc1Ev3q8UnSyynu1Qb9ss1E3aJWZn2bQ '{"name":"Test_Asset","open":true}' 100 echo "$A" 
exit 

Test_Asset을 매개변수로 전달하려고 합니다.

#!/bin/sh 
B=$1 A=multichain-cli chain97 issue 1XRnkvTc1Ev3q8UnSyynu1Qb9ss1E3aJWZn2bQ '{"name":"$B","open":true}' 100 echo "$A" 
exit

$B라는 이름으로 자산이 생성됩니다. 말 그대로 $B가 아닌 B의 가치로 자산을 생성하고 싶습니다.

답변1

작은따옴표 안에는 아무것도 확장되지 않습니다. 따라서 작은따옴표를 제거해야 합니다. 당신이 원하는 것이 무엇이든 상관 없습니다큰따옴표Split+glob을 적용하지 않으려면 변수가 확장되므로 다음과 같습니다.

A=$(multichain-cli issue '{"name":'"$ASSET"',"open":true}' "$D")
#                         ''''''''  """"""  '''''''''''''
printf '%s\n' "$A"

( '''', """""어떤 부분이 작은따옴표이고 어떤 부분이 큰따옴표인지 표시합니다.)

아마도 $ASSETJSON 코드의 내용을 큰따옴표 안에 넣기를 원할 것이므로 이를 포함해야 합니다(리터럴, 즉 작은따옴표 부분 내).

A=$(multichain-cli issue '{"name":"'"$ASSET"'","open":true}' "$D")
#                         '''''''''  """"""  ''''''''''''''

$ASSET쉘 인용에 사용되는 큰따옴표(여기서는 확장 시 분할+글로브를 방지하기 위해 )를 그대로 전달된 큰따옴표와 혼동하지 마십시오 multichain-cli.

$ASSET큰따옴표 자체나 백슬래시, 줄 바꿈 또는 기타 제어 문자와 같이 JSON 구문에 특수한 기타 문자를 포함하는 것을 고려할 수 있습니다. ASCII가 아닌 문자의 경우 multichain-cli.

또는 모든 것에 대해 큰따옴표 쉘 인용을 사용할 수 있습니다.@Bex 쇼, 이는 전달하는 텍스트에서 "s( $, 및 도 필요함)를 백슬래시로 이스케이프해야 함을 의미합니다 \(그리고 추가 처리를 위해 백슬래시를 사용하므로 명령 대체에 구식 구문을 사용하지 마십시오).`multichain-cli`...`

답변2

노력하다

ASSET="$1"
D="$2"
A="$(multichain-cli issue "{\"name\":$ASSET,\"open\":true}" "$D")"
echo "$A"
exit

변수 대체가 발생해서는 안 됩니다.단어따옴표(즉, 단일 '). 큰따옴표를 사용하고 백슬래시를 사용하여 출력에서 ​​필수 큰따옴표를 이스케이프 처리합니다 \.

답변3

답장을 보내주셔서 감사합니다. 해결책으로 파일에 명령을 작성한 다음 파일을 실행했습니다. 작동 방식은 다음과 같습니다.

#!/bin/sh
ASSET=$1
X=`echo "'{\"name\":\"$ASSET\",\"open\":true}'"`
A="multichain-cli chain97 issue $X 100"
echo "$A" >test.sh
B=`sh test.sh`
echo "$B"
exit

관련 정보