파일을 나열하고 변수에 저장합니다.

파일을 나열하고 변수에 저장합니다.

저는 쉘 프로그래밍을 처음 접했습니다. 내 목표는 사용자에게 실행해야 할 파일을 선택할 수 있도록 하는 것입니다. 다음을 사용하여 하나의 var에서 사용 가능한 모든 스크립트를 포착합니다.

var=$(find script*)

지금까지는 매우 좋았습니다. 결과는 다음과 같습니다.

    echo $var
    script1 script2 script3 scr...

이제 각 파일을 단일 변수에 저장하여 나중에 선택할 때 실행하고 싶습니다.

select SEL in script1 script2 script3 ..........
case $SEL in
        $Script1) echo ($Script1 will start) && ./$script1 ;;
        $Script2) echo ($Script2 will start) && ./$script2 ;;
        $Script3) echo ($Script3 will start) && ./$script3 ;;
        $Sc..) echo ($Scr.... will start) && ./$scrip.... ;;
        $Sc...) echo ($Sc...... will start) && ./$scrip..... ;;
        *) echo "choose on of the availabel files";;
    esac
done

각 파일의 수와 정확한 길이를 모르는 경우 모든 파일을 어떻게 분리해야 하는지 전혀 모르겠습니다.

echo ${var[1]} 및 echo $var[1] 으로 분할하려고 시도했지만 작동하지 않습니다. 빈 출력이나 전체 문자열을 수신합니다.

답변1

첫 번째 줄:

var=$(find script*)

var모든 것이 포함된 단일 문자열 변수를 만드는 것입니다 script*. 그것은~ 아니다배열이므로 []원하는 대로 색인을 생성할 수 없습니다.

script*실제로 쉘에 의해 확장되므로 find거기에서는 아무 것도 하지 않습니다(디렉토리가 아닌 것처럼 보이지만). 모든 파일 이름을 인수로 가져오고 존재 여부를 확인한 후 바로 인쇄합니다. 다시 밖으로. 쉘은 실제로 모든 작업을 수행합니다..

대신, 우리는 다음을 만들 수 있습니다.정렬, 그리고 우리는 쉘의글로브 확장직접 채우려면 다음을 수행하십시오.

files=(script*)

초기화 프로그램(의 오른쪽 =)을 괄호 안에 넣으면 여러 값을 개별적으로 보유하는 배열을 만드는 것입니다. 현재 디렉토리에서 script*시작하는 모든 파일 이름으로 확장됩니다 . 파일 이름에 공백이 있으면 배열 이니셜라이저 내부의 script명령(백틱 또는 )을 사용할 때처럼 단어가 분할되지 않습니다 .$()

이 시점에서 일부 사용자 입력을 읽을 수 있습니다.

select SEL in "${files[@]}"
do
    if ! [ "$SEL" ]
    then
        echo "Choose one of the available files."
        continue
    fi
    echo "$SEL will start"
    "./$SEL"
    break
done

우리는 "${files[@]}"전체 파일 이름 배열을 깔끔하게 확장하여 select. 사용자에게 파일 선택권이 제공되고 블록에 들어갑니다 do...done.

비어 있으면 $SEL사용자가 존재하지 않는 항목을 선택한 것이므로 프롬프트를 인쇄하여 continue다시 선택하라는 메시지가 표시됩니다.

그렇지 않으면 echo스크립트가 시작되고 실행된다는 알림이 표시됩니다. 스크립트 이름에 공백이 있는 경우 이름을 인용합니다 "./$SEL". 그렇지 않으면 명령 이름이 로 처리되고 ./firstword나머지 단어는 인수로 처리됩니다. break다시 돌아가서 사용자에게 다시 묻는 것을 중지합니다. 그렇게 하고 싶으면 꺼내세요.


귀하가 사용하고 있던 것은 case...of귀하가 제공한 예에 큰 영향을 미치지 않는 것 같지만 선택한 스크립트에 따라 별도의 동작이 있는 경우(그리고 그것은이것스크립트) 블록 안에 넣을 수 있습니다 do...done.

답변2

100% 확실하지는 않지만 귀하가 원하는 작업을 완전히 이해하지만 이것이 더 잘 작동할 수 있습니다. var=$(find script*) 및 사례 대신 더 잘 사용할 수 있습니다.

for i in `find script*`
do
        echo ($i will start) 
        ./$i
done

관련 정보