2014-10-29 2 views
0

개요 배열에서 값을 선택하고 KSH에서 변수로 되었 있습니다 방법 : 내가 디렉토리에있는 특정 파일의 존재를 테스트하기 위해 내 KSH 스크립트를 싶습니다
이와 함께 사용자에게 제공 숫자와 함께 파일 목록. 그런 다음 사용자는 원하는 번호를 선택하고 배열의 관련 값이 변수에 지정됩니다.사용자가

### Create test files in directory #### 
touch ABCDEF.jar 
touch BCDEFG.jar 
touch CDEFGH.jar 
touch DEFGHI.jar 
touch EFGHIJ.jar 
touch FGHIJK.jar 
touch GHIJKL.jar 


set -A JARS ` ls -1 | grep .jar | cut -d'.' --complement -f2-` 
for i in ${JARS[@]}; do echo "Number) $i"; done 

이 배열에서 다음 목록을 반환합니다 :



지금까지 나는 다음이 첫째

Number) ABCDEF 
Number) BCDEFG 
Number) CDEFGH 
Number) DEFGHI 
Number) EFGHIJ 
Number) FGHIJK 
Number) GHIJKL 

을, 나는 장소 홀더 "를 교체하고 싶습니다 숫자) "을 다음과 같은 순서로 숫자를 증가시키는 함수로 대체합니다.

1) ABCDEF 
2) BCDEFG 
3) CDEFGH 
4) DEFGHI 
5) EFGHIJ 
6) FGHIJK 
7) GHIJKL 

그때 "jar_id를"



에이 스크립트는 사용자가 선택한 수를 기준으로 사용자의 입력을 읽을 수 있고, 새로운 변수로 배열에서 올바른 값을 할당하고 싶습니다 그것의 얼굴, 그것은 간단한 문제처럼 보입니다. 그러나 논리적 인 방법으로이 작업을 수행하는 방법에 대해 머리를 맞대고있는 것처럼 보일 수는 없습니다.

감사드립니다. 감사합니다.

TIA 허스키. 올바른 방향으로 ETAN의 찌를

+1

http://ps-2.kev009.com/AIXtip/select.htm –

+0

내가 콘은 선택 메뉴를 구축하기위한이 기능을했다 몰랐어요! 그러나 배열이 동적으로 생성된다는 사실을 어떻게 처리 할 수 ​​있습니까? 내가 똑같은 않는 내 시스템에 '선택'확실하지 않다 * .jar' – Huskie69

+1

'파일 - 사람이 SELECT (2) 리눅스 프로그래머 매뉴얼 SELECT (2) NAME 선택, 위해 pselect, FD_CLR을 선택, FD_ISSET, FD_SET, FD_ZERO - 동기 I/O 멀티플렉싱 select() 및 pselect()는 프로그램이 여러 파일 설명자를 모니터하고 하나 또는 그 이상의 파일 설명자가 일부 I/O 작업 클래스에 대해 "준비"가 될 때까지 대기합니다 예 : 가능한 입력).블로킹없이 대응하는 I/O 동작 (예를 들어, read (2))을 수행 할 수 있다면 파일 디스크립터는 준비된 것으로 간주된다. –

답변

3

목록의 전체 파일 이름에 신경 쓰지 않는다면이 방법 만 사용할 수 있습니다.

select JAR in *.jar; do 
     export NEW_PATCHID=$JAR 
     echo $NEW_PATCHID 
     REPLY='' 
     break 
done 

당신은 마음을 (그리고 예는 수도 나타냅니다) 당신은 (내가 그 그 cut가이 이상하지만 것 awk -F . '{print $1}'으로 그것을 위해 간단 보인다 cut -d. -f1 생각입니다 무엇을 믿고있어 .jar를 삭제하려면) 다음은 안전하게 작동합니다.

jars=(*.jar) 
select JAR in "${jars[@]%.jar}"; do 
     export NEW_PATCHID=$JAR 
     echo $NEW_PATCHID 
     REPLY='' 
     break 
done 
2

덕분에, 나는 다음과 같은 코드를 사용하여 필요에 일을 할 수 있었다 :

#!/bin/ksh 

type_prompt='Select JAR> ' 
PS3="${type_prompt}" 

select JAR in `ls -1 | grep .jar | cut -d'.' --complement -f2-` QUIT 
do 
     export NEW_PATCHID=$JAR 
     echo $NEW_PATCHID 
     REPLY='' 
     break 
done 


이 내가 필요 정확히 내가 원하는 방식으로 작동합니다. 다시 한 번 감사드립니다. Etan

+1

그런 식의'ls'를 쓰고 싶지는 않습니다. 당신은 또한 필요가 없습니다. 해당 줄에있는 일반 glob'* .jar '가 작동하지 않는 경우 (너무 많이 포함되어 있기 때문에). 그 glob을'jars = (* .jar)'배열로 확장 한 다음 쉘 변수 확장이나 루프를 사용하여 문자열을 원하는 형식으로 조작 한 다음 $ {jars [@]} "에서 JAR 선택" 그 라인을 위해. –

+1

http://mywiki.wooledge.org/ParsingLs –

+0

감사합니다. Etan. 나는 이것을 가지고 탑승 할 것이다. 나는 쉘 스크립팅의 역학이 진행되고 조언을 이해하는 한 여전히 상대적인 신조어이다. – Huskie69