2016-07-05 4 views
2

Bash's arrays 사용 (배시 배열없이), I 배열 변수에리스트를 저장하고 서로 공백 또는 특수 문자가 포함 된 인용 문자열 유지하면서 요소를 반복 :Bourne 쉘의 변수에 따옴표 붙은 문자열 목록을 저장하려면 어떻게합니까?

LIST=(--foo --bar --baz "test 1 2 3") 
for item in "${LIST[@]}"; do 
    echo "$item" 
done 

출력된다 :

--foo 
--bar 
--baz 
test 1 2 3 

이 기능을 사용하는 스크립트가있어서 불행히도 Busybox의 ash (배열을 지원하지 않음)를 사용하려면이 포트를 사용해야합니다. 목록의 올바른 요소 수를 유지하면서 일부 항목이 공백 일 수있는 목록을 저장하는 좋은 방법을 찾아 내기 위해 노력하고 있습니다.

이것은 예를 들어, 작동하지 않습니다 (잘못 별도의 항목으로 test 1 2 3 분할) :

LIST='--foo --bar --baz "test 1 2 3"' 
for item in $LIST; do 
    echo "$item" 
done 

출력은 다음과 같습니다

--foo 
--bar 
--baz 
"test 
1 
2 
3" 

idea I found on the Busybox mailing list는 위치 매개 변수를 대체 할 set --을 사용하는 것입니다 :

set -- --foo --bar --baz "test 1 2 3" 
for item in "[email protected]"; do 
    echo "$item" 
done 

출력이 공동 rrect는 :

--foo 
--bar 
--baz 
test 1 2 3 

그러나,이 구성은 위치 인수 목록 ([email protected])이 스크립트 또한 용도 쳤을.

내 케이크를 먹을 수 있고 그것을 먹을 수있는 합리적인 방법이 있습니까? Bash가 아닌 다른 사람의 여러 임의의 배열을 시뮬레이션 할 수 있습니까 sh 변형?

당신은 거기에 \n으로 변수를 선언 할 수

답변

1

대부분의 쉘 안전하게 평면 사용하여 시뮬레이션 할 수 없기 때문에 어떤 종류의 배열이 제공하는 이유 문자열. 스크립트의 나머지 부분에서 배열이 필요한 코드를 분리 할 수 ​​있다면 서브 쉘에서 실행할 수 있으므로 서브 쉘이 종료 된 후에 위치 매개 변수를 복원 할 수 있습니다.

(# Nothing in here can rely on the "real" positional 
    # parameters, unless you can fsave them to a fixed set of indiviual 
    # parameters first. 
    first_arg=$1 # etc 
    set -- --foo --bar --baz "test 1 2 3" 
    for item in "[email protected]"; do 
     echo "$item" 
    done 
    # Any other parameters you set or update will likewise revert 
    # to their former values now. 
) 
2

:

list='--foo\n--bar\n--baz\n"test 1 2 3"' 

# then iterate it using 
echo -e "$list" | while read -r line; do echo "line=[$line]"; done 

출력 :

line=[--foo] 
line=[--bar] 
line=[--baz] 
line=["test 1 2 3"] 
관련 문제