2014-02-14 4 views
0

일부 값으로 채워진 배열을 만들려고합니다. 그러나 나는 그것을 어떻게하는지 모른다. 아래에서 시도했지만 작동하지 않았습니다.Bash 스크립팅 : for 루프 내에서 배열 채우기

내 코드 :

i=0 
for c in colors; do 
array[$i]=$c 
echo {$c[$i]} 
i=`expr $i + 1` 
done 

참고 : "색"값의 목록을 반환합니다 "PS -ef"명령의 일종이다. 예를 들어, "파란색, 빨간색, 노란색"값이 있습니다. 당신의 색상이 하나에-A에 오는 경우

array=($(command)) 
+0

정확히 어떻게'colors'리스트가 반환되는지는 중요합니다. 그들이 일대일로 반환된다면, 문자열 분리 (문자열 분리 (string-splitting)보다 더 확실한 방법을 사용할 수 있습니다 (허용되는 대답이 어떤 것인지, 예를 들어 변경됩니다). ,''현재 디렉토리의 파일 목록에 색상''','light'와'magenta'의 두 항목에 대한'light magenta '색상). –

+0

그건 그렇고, bash에서'((++ i))'는'i = $ (expr $ i + 1)'을 작성하는 현대적인 방법입니다. –

+0

... 그리고 코드에서 완전히 작동하지 않는 유일한 방법은 (모범 사례 위반과 달리)'$ {c [$ i]} '및'in colors'대신'{$ c [$ i]} ' '$ colors'보다는''. –

답변

2

당신은 루프에서 배열을 채우기 위해이 스크립트를 사용할 수 있습니다 줄을 사용하지 않고 저장하는 변수를 확장하자마자 잠재적으로 정보를 잃어 버리게됩니다 (공백과 줄 바꿈 사이의 구별 삭제, glob 문자 확장 등).

하지 마십시오. 대신, BashFAQ #1를 따르 만 말하자면, 원하는 경우 더 많은 사실

colors=() 
while IFS='' read -r color; do 
    colors+=("$color") 
done < <(get-color-list) 

, 각 라인 중 특정 열을; read은 쉽게 분할 할 수 있도록 열 분할을 수행합니다.

+0

문자열 분할이 주어진 것으로 가정하면 예. 입력이 일대일 방식으로 제공되는 경우 모범 사례 접근 방식은 while/read 루프를 사용하여 요소를 분리하는 것입니다. 즉, glob 확장, IFS 기반 분할 또는 다른 부작용. –

+0

"간단한"명령에 대한 예가 있습니까? "array = ($ ("ps -ef | grep pmon "))"입니까? – AloneInTheDark

+2

@AloneInTheDark, 따옴표 없음; 단지'array = ($ (ps -ef | grep ...))') -하지만 몇 가지 이유로 나쁜 관행입니다. –

2

:

array=() 
for c in $colors; do 
    array+=("$c") 
done 

또는 더 간단 :

colors= 'ps -ef | grep colors'