값에 변수가 포함된 환경 변수를 내보내고 싶지만 내보내기 중에 변수(값 내에 있음)가 평가되는 것을 원하지 않습니다. 즉
export STY=for i in {0..3}; do echo $i; done
따라서 내 요구 사항은 STY를 에코할 때 필요한 출력이 다음과 같아야 한다는 것입니다.
echo $STY
for i in {0..3}; do echo $i; done
그러나 $i는 내보내는 동안 평가됩니다. 나는 그대로 있어야합니다.
답변1
당신이 원하는 것이 있다면설명하다당신은 그것을 요청했습니다:
export STY="for i in {0..3}; do echo \$i; done"
당신이 정말로 의미하는 바를 원한다면 :
function STY() {
for i in {0..3}; do echo $i; done
}
export -f STY
답변2
즉, eval "$hello"를 사용하십시오.
(이 답변은 원래 다음과 같이 말했습니다. eval $hello를 사용했지만 다른 포스터에서는 eval "$hello"가 더 안전하다고 지적했습니다.)
다음과 같이:
bash-2.05a$ export hello='for i in 0 1 2 3; do echo $i; done'
단순히 줄 시작 부분에 $hello라고 말하면 작동하지 않습니다. for 루프는 $variable 확장 전에 처리되기 때문입니다(단계 지향 언어는 싫어합니다).
bash-2.05a$ $hello
bash: for: command not found
그러나 평가는 작동합니다.
bash-2.05a$ eval $hello
0
1
2
3
bash-2.05a$
당신이 잘못한 것(혹은 잘못했을 수도 있는 것):
bash-2.05a$ export hello='for i in {0..4}; do echo $i; done'
bash-2.05a$ $hello
bash: for: command not found
bash-2.05a$ eval $hello
{0..4}
bash-2.05a$ for i in {0..4}; do echo $i; done
{0..4}
bash-2.05a$
즉, 적어도 제가 사용하고 있는 bash 버전에서는 {0..4}가 여러분이 생각하는 대로 작동하지 않습니다.
http://www.cyberciti.biz/faq/bash-for-loop/{0..4} 기능이 bash 3.0 이상에 나타난다고 가정해 보겠습니다.
어쩌면 당신도 나처럼(집이 아닌 woprk에서) 오래된 버전의 bash를 사용하고 있을까요?
답변3
$hello
예상대로 작동하지 않는 이유:
- 확장은 토큰으로 분할한 후 명령줄에서 수행됩니다.
for...do...done
Compound Command
토큰화 단계에서 결정 됩니다 .for
명령이 아닙니다.
따라서 다음과 같은 작업을 수행할 수 없습니다.
$ "for" i in {0..4}; do echo $i; done
sh.exe": syntax error near unexpected token `do'
Bash가 명령줄을 토큰으로 분할하면 "for"
not 이 표시되므로 for
토큰은 do
예상치 못한 것입니다.
귀하의 경우:
$ hello='for i in {0..4}; do echo $i; done'
$ $hello
sh.exe": for: command not found
Bash는 token 을 찾고 $hello
&& variable-expansion
는 word-spliting
순서대로 발생합니다.
실제로 bash는 결과를 다음과 같이 구문 분석합니다 Simple Command
.
- command(
for
)는 나머지를 args(i
,in
,{0..4}
,;
,do
, ...) 로 사용합니다. for
,do
, 등;
은done
특별한 의미를 잃었습니다.
답변4
문제에는 두 가지 측면이 있습니다.
- 복잡한 표현식을 변수에 저장
- 저장된 표현식 실행
표현식을 저장하려면 이스케이프 시퀀스와 특수 인용이 필요할 수 있습니다(귀하의 예에서는 이것이 사실인 것 같습니다). 실행은 두 가지 방법으로 발생할 수 있습니다.
- Borealid의 답변과 같은 함수 호출: data=`STY()` - 함수의 표준 출력은 변수에 저장됩니다.
- 표현식 평가: 데이터=
eval $STY
예제에 제공된 변수 정의