저는 쉘 프로그래밍을 처음 접했습니다. 내 목표는 사용자가 실행할 파일을 선택하도록 하는 것입니다. 다음 명령을 사용하여 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