2015-01-25 2 views
1
나는 떠들썩한 기능에 따옴표를 이스케이프를 유지하려는

:

foo() { echo [email protected]; } 

이 기능은 위의 전달 된 인수를 인쇄합니다 :

$ foo -a bar 
-a bar 

이가

$ foo -l 'bar' -m "asd asd" 
-l bar -m asd asd 

내가 예상 : 나는 따옴표를 통과 할 때 좋은,하지만 난 하나 개의 인수에 보관 할

-l bar -m "asd asd" 

내가 어떻게 할 수 있습니까? 또한 내 기대에 작업의 $* 변수를 전달하기 위해 그들 중 누구도 시도하지 "[email protected]" :

나는 따옴표 사이 [email protected]을 넣어했습니다.

+0

'echo' 명령은 사용자가 생각하는 것을 알려주지 않습니다. '-l 'bar'-m "asd asd"'는'foo' 함수가하는 것처럼'-l bar -m asd asd'를 출력합니다. 그래서'echo' * 따옴표를 출력해서는 안됩니다! (.는 따옴표를 인쇄 않은 경우에, 그 사실 뭔가 심각하게 잘못되었다는 표시 할 것)() 함수'printargs를 정의하는 시도 {에코 "$ # 인수를 얻었다 :"; if [$ # -gt 0]; printf " '% s'\ n" "$ @"; fi; }'를 사용하고,'echo' 대신에 그것을 사용하십시오. –

답변

2

달성하고자하는 것이 불가능하다고 생각합니다. 함수 foo에는 전달 된 인수가 인용되었는지 여부를 확인할 수있는 방법이 없습니다. 함수는 인수 배열 만 봅니다.

모든 인수가 인용되어 살 수 있습니까? 새 명령을 만들 때 불필요한 큰 따옴표가 있으면 괜찮습니다.

$ foo() { declare arg; for arg in "[email protected]"; do echo -n ' "'$arg'"' ; done; echo; } 
$ foo -l 'bar' -m "asd asd" 
"-l" "bar" "-m" "asd asd" 
+1

이에 확장하려면 : 인용 제거가 수행되는 인수가 기능 (/ 명령)에 전달되기 전에. 따라서,'foo는 -l '바'-m "ASD의 ASD"','foo는 '-l'바 '-m' 'ASD asd'','foo는 -l 바 -m ASD ""asd','foo는 - l bar -m asd \ asd' 그리고 많은 다른 변종들은 모두 똑같은 인수를 * 합격하고 함수 (/ 명령)는 어떤 것이 사용되었는지 알 수 없다. 무엇 말할 수있는 것은 그들이 (즉 ASD asd'이 공백으로 하나의 인자가 아닌 두 개의 인수했다 '것을), 그리고 "$의 @는"그 보존 인수에 침입 한 방법이다. –

1

당신은 bash는 일에 어떻게 인수에 대한 일정한 이해를 놓치고있어.

foo()의 결과가 맞지만 구현이 올바르지 않습니다. 따옴표는 여러 단어를 단일 인수로 보는 데 필요하지 않습니다. 필요한 것은 bash에게 인수를 올바르게 사용하고 전달하도록 지시하는 것입니다. 관찰하십시오 [email protected] ("[email protected]"로)를 인용

$ foo() { bar [email protected]; } 
$ bar() { echo [email protected]; echo $#; } 
$ foo -l 'bar' -m "asd asd" 
-l bar -m asd asd 
5 
$ foo() { bar "[email protected]"; } 
$ foo -l 'bar' -m "asd asd" 
-l bar -m asd asd 
4 
$ bar() { echo "[email protected]"; echo $#; } 
$ foo -l 'bar' -m "asd asd" 
-l bar -m asd asd 
4 

스크립트 나 함수에 전달 된 인수의 단어 분할을 수행 할 수있는 bash는 지시, 같은 순진 인수를 표시 echo 같은 도구는 "잘못된"결과를 보여 있지만.

+0

그러면'git commit -m '두 단어가 어떻게 작동합니까? –

+0

'exec * (3)'함수 중 하나를 사용합니다. –

+0

이 답변은 정확하다고 생각하지만 확실하지 않습니다. 쇠고기는 OP가 항상'$ @ '주위에 큰 따옴표를 사용해야한다는 것입니다. 아마 당신은 그것을 더 명확하게 할 수 있을까요? – tripleee

관련 문제