2011-09-17 4 views
21

모든 args를 포함하는 bash 변수를 생성하고 args에 공백이 포함됩니다. args와 함께 명령을 실행할 때 - 예. ls $ args - 따옴표가 올바르게 해석되지 않습니다. 다음은 필요한 파일을 만들고 지우는 예입니다. 그와bash - 따옴표가있는 여러 개의 args를 포함하는 변수

#!/bin/bash 
f1="file n1" 
f2="file n2" 
# create files 
touch "$f1" "$f2" 
# concatenate arguments 
args="\"$f1\" \"$f2\"" 
# Print arguments, then launch 'ls' command 
echo "arguments :" $args 
ls $args 
# delete files 
rm "$f1" "$f2" 

, 내가 에 대한 몇 가지 "해당 파일"오류가,

+0

http://stackoverflow.com/questions/2005192/how-to-execute-a-bash-command-stored-as-a-string-with -quotes-and-asterisk –

답변

38

당신은 array에 대한 사용을 고려할 수있다 " 및 N2 파일" "N1, 이 파일을" args 같은이 :

args=("$f1" "$f2") 
ls "${args[@]}" 

(문제는 당신이 순간에 타격을 것입니다 공백 문자가있는 곳과 파일명 사이에는 아무런 차이가 없습니다.)

+3

이것은 배열을 지원하는 Bash와 같은 쉘에서만 작동합니다. 아래에 설명 된'eval'은 모든 유닉스 셸에서 작동합니다. –

+0

@ arran-cudbard-bell 글쎄, 사실,하지만 질문에 여러 번 'bash' 언급, 그래서이 솔루션은 최고의 대답처럼 보입니다. – monnef

+1

나는 구문이 이상하고 불투명하다는 말에 동의하지 않는다. –

2

변수를 위치 매개 변수로 설정하는 데는을 사용하십시오. "$ @"또는 "$ 1", "$ 2"등을 통해 참조 할 경우 따옴표가 유지됩니다. 변수 이름에 큰 따옴표를 사용해야합니다.

set -- "$f1" "$f2" 
touch "[email protected]" 
ls "[email protected]" 
rm "[email protected]" 
3

이것은 아마도 최악의 대답 일 수 있지만 IFS을 변경할 수 있습니다. 이것은 "내부 필드 구분자"이며 기본적으로 공백 + 탭 + 개행과 같습니다.

#!/bin/sh 
IFS=, 
MAR="-n,my file" 
cat $MAR 

스크립트는 위의 cat를 실행합니다. 첫 번째 인수는 -n (번호가 매겨진 줄)이고 두 번째 인수는 my file입니다.

26

eval을 사용하면 먼저 확장 및 인용을 평가 한 다음 결과 문자열을 마치 쉘에 입력 한 것처럼 실행합니다.

args="'$f1' '$f2'" 
eval ls $args 

평가는

ls 'file n1' 'file n2'이 초기화 스크립트에서 start_stop_daemon/etc/default/에서 공급 변수에 인수를 전달하기 위해 노력하고, 매우 비슷한 문제가 있었다 실행됩니다.

+1

'eval'에 심각한 보안 문제가 있기 때문에 Downvoted - 자세한 설명은 http://stackoverflow.com/a/37573041/120818을 참조하십시오. 기본적으로 http : //mywiki.wooledge.org/BashFAQ/048) : "코드가 한 번이 아닌 두 번 구문 분석되게하므로 예를 들어 코드에 변수 참조가있는 경우 쉘의 파서가 해당 변수의 내용을 평가합니다. 쉘 명령을 포함하고 있다면 쉘은 원하는대로 명령을 실행할 수 있습니다. " – HerbCSO

+3

C 개발자가 코드를 쥐의 둥지로 바꾸기 위해 사용하기 때문에 C 프로그래밍에서 goto를 사용해서는 안됩니다. eval이 보안 문제를 도입하지 않을 경우가 많습니다. 유효한 비평이 아닙니다. –

+2

@ ArranCudbard-Bell에 동의합니다. 이미 가변 인수를 사용하여 잠재적으로 임의의 코드를 실행하고 있습니다. 'eval'을 사용하면 코드가 이미 상황보다 더 많은 일을 할 수 없습니다. – siride

0

여기에 인용 된 인수를 연결하는 방법이 있습니다. 주로 스크립트를 읽을 수 있도록 유지하는 데 사용됩니다. 그러나 그것은 쉽게 몇 가지 주장을 주석도 편안 :

PARAM1="a param with white spaces" 
PARAM2="some other funny param" 
PARAM3="third spaced param" 
#... 

PARAMS=$PARAM1 
PARAMS+='" "' 
PARAMS+=$PARAM2 
PARAMS+='" "' 
PARAMS+=$PARAM3 
#... 

eval command '"'$PARAMS'"' 
관련 문제