2016-10-03 8 views
1

나는 함수가 정의 read_command 한배쉬 변수 대체

greet ${a:-"Bob"} 
greet ${b:-"Jim"} 
#### 
a: name of friend a 
b: name of friend b 
#### 

터미널에서 실행 된 명령은

read_command test 

입력이 없을 때 나는 예상하고 있습니다.

greet Bob 
greet Jim 

하지만 내가 얻을 것은 : 마지막 문을 넣어가되게합니다

greet ${a:-"Bob"} 
greet ${b:-"Jim"} 

여기에 어떤 문제가 있습니까?

편집 : David의 제안에 따라 다음 경우를 제외하고 eval이 작동하는 경우도 있습니다.

j=1;i="export DISPLAY=:0 && Xephyr :${j}&";k=$(eval echo "$i"); 
echo $k 

수출 DISPLAY = : 0 나는 K가 될 기대하고

"수출 DISPLAY = : 0 & & Xephyr는 : & 1"여기 무슨 일이야? 편집 : 나는이 내가 일하고 스크립트에 대한 링크입니다 다음

k=$(eval "echo \"$i\"") 

로했습니다. echo "$__line"의 첫 while 루프 동안 https://gist.github.com/QiangF/565102ba3b6123942b9bf6b897c05f87

+0

줄 끝의 세미콜론은 불필요합니다. 쉘 스크립트에서 새로운 행 * 또는 * 세미콜론으로 명령 구분 기호로 충분합니다. – tripleee

+0

예를 들어 다음과 같이 웹에 너무 많은 나쁜 예가 있습니다. – godblessfq

답변

2

는, 당신은 __line='greet ${a:-"Bob"}' 있습니다. 인쇄를 시도 할 때 Bash는 ${a:-"Bob"}Bob으로 확장하지 않습니다. $__line 주위의 인용문을 제거하더라도 이러한 현상은 발생하지 않습니다.이 효과를 얻으려면 eval echo "$__line"처럼 eval을 추가해야합니다. 불행히도 eval은 웜이 포함되어 있기 때문에 인용 레벨 간의 상호 작용에 대해 걱정해야합니다.

+0

"eval echo $ __ line"이 __line에서 명령을 실행하는 것을 방지하려면 질문에서 편집을 참조하십시오. – godblessfq

+0

이것은 [XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)와 매우 비슷합니다. 이 코드로 실제로 어떤 문제를 해결하려고합니까? http://mywiki.wooledge.org/BashFAQ/050 – tripleee

+0

과 같이 막연하게 보입니다. cheat.sh의 대안은 템플리트 대체를 사용하는 것이지만 덜 편리합니다. (https://github.com/tests-always-included/mo) – godblessfq