2011-07-03 6 views
6

파일을 나열 할 bash 스크립트를 만드는 중입니다 (이 경우에는 apache sites-available). 궁극적 인 목적은 각 파일을 배열로 가져 와서 사용자에게 표시하고 처리 할 "파일"을 선택할 수있게하는 것입니다.이 경우 사이트를 활성화하는 것이 좋습니다.ls에서 Array를 만드는 Bash 스크립트?

array=$(ls) 
for sites in $array(2) 
do 
echo "$sites" 
done 

내가 디렉토리에 인덱스에 각 파일이 필요하다는 것을 알고

는 내가 아주 멀리 못 했어

, 나는 내가 루프에게 다음 작업을 배열로 LS를 설정해야합니다 알고 사용자가 활성화 할 번호를 입력 할 수있게하십시오. 그래서 다음과 같이 보일 것입니다 :

(1) newdomain.com 
(2) newdomain2.com 

Which site would you like to enable (i.e 1)? 

희망이 있겠습니까?

답변

6

내장 된 select 기능을 사용하여 많은 재 구현을 저장할 수 있습니다.

select 구조는 메뉴 생성을 용이하게합니다.

select name [in words ...]; do commands; done 

in 다음 단어의리스트가 확장되어, 상품의리스트를 생성 : 그것은 for 명령과 거의 동일한 구문을 갖는다. 확장 된 단어 세트는 표준 오류 출력 스트림에 인쇄되며 각 문자 앞에 숫자가옵니다. in words이 생략되면 이 지정된 것처럼 위치 매개 변수가 인쇄됩니다. 그러면 PS3 프롬프트가 표시되고 표준 입력에서 회선을 읽습니다. 행이 표시된 단어 중 하나에 해당하는 숫자로 구성되어 있으면 name의 값이 해당 단어로 설정됩니다. 행이 비어 있으면 단어와 프롬프트가 다시 표시됩니다. EOF를 읽으면 select 명령이 완료됩니다. 다른 값을 읽으면 name이 null로 설정됩니다. 읽은 행은 변수 REPLY에 저장됩니다.

+0

감사합니다. select 명령을 살펴 보겠습니다. –

6

이렇게하면 ls을 사용하지 않습니다.

array=(*) 
+0

현재 디렉토리에서 작동하지만 어디에서나 스크립트를 호출 할 수 있으므로 전체 경로 (예 :/etc/apache2/sites-available /)를 정의해야합니다. –

+0

이것은'ls'와 어떻게 관련이 있을까요? –

+1

명확화 : 배열 할당을 나타 내기 위해 괄호 세트가 필요하므로 최소한 array = ($ (ls whatever))이라고 말해야합니다. 그렇지 않으면 긴 문자열을 얻게됩니다. – geekosaur

-1

당신이 얻을 수있는 몇 가지 힌트가 시작 : 물론을 선택하여

APACHE_CONF=/etc/apache2 
SITES_TO_ENABLE="site1.org | site2.com" 
LIST_AVAILABLE=$(ls $APACHE_CONF/sites-available) 
LIST_ENABLED=$(ls $APACHE_CONF/sites-enabled) 

for site in $(echo $SITES_TO_ENABLE | sed -e "s/|//g") 
do 
    FOUND=$(echo $LIST_AVAILABLE | sed -e "s/ /\n/g" | egrep $site) 
    [[ ! -z $FOUND ]] && echo "Checking availability of $site: Ok" 
    [[ -z $FOUND ]] && echo "Checking availability of $site: Nok, site \"$site\" required for production has not been found or is not defined" && exit 1 
done 

이 접근 방식을 결합 할 수 있습니다.

+0

이것은 디렉토리 중 하나의 파일에 이름이나 와일드 카드 문자 또는 'IFS'에서 인쇄 할 수 없거나 찾을 수있는 문자가있을 때까지만 작동합니다. http : //mywiki.wooledge를 참조하십시오.org/ParsingLs –

관련 문제