
디렉토리에 여러 파일이 있고 사용자가 전체 파일을 작성하는 대신 색인을 기반으로 선택할 파일을 선택할 수 있도록 옆에 색인과 함께 모든 파일을 나열하는 bash 스크립트를 작업 중입니다. 이름.
예를 들어.
main_dir
- temp_1
- temp_2
내 시도:
while [[ 1 ]]; do
printf "Which file do you want to use? ($(ls -m ${main_dir})) "
read -r ans
if [[ -d ${main_dir}/${ans} ]]; then
break
else
echo "[ERROR] Failed to choose. Please choose from ($(ls -m "${main_dir}"))."
fi
done
이 경우 출력은 다음과 같습니다.
Which file do you want to use? (temp_1, temp_2)
또한 사용자는 파일을 선택하기 위해 파일 이름을 입력해야 합니다.
예상되는 결과:
Which file do you want to use?
1. temp_1
2. temp_2
그리고 사용자는 이름이나 색인을 입력하는 두 가지 방법으로 파일을 선택할 수 있어야 합니다.
답변1
*를 반복하고 배열의 파일을 기억합니다.
files=()
i=0
for f in *
do
[ -d "$f" ] && continue ## skip directoriries
files[$i]="$f"
echo "$i"$'\t'"${files[i]}"
(( ++i ))
done
if read -p "Which file do you want to use? " ans
then
echo "you choose ${files[ans]}"
stat "${files[ans]}"
wc "${files[ans]}"
fi
답변2
bash 지시문의 유용성에 대한 @Cyrus의 의견 확장 select
....
숫자나 이름으로 선택할 수 있다는 규정이 없었다면 bash select
만 있으면 됩니다:
$ select name in *; do printf "You chose %s\n" "$name"; done
1) file AA 6) file_E 11) file_J 16) file_O 21) file_T 26) file_Y
2) file_A 7) file_F 12) file_K 17) file_P 22) file_U 27) file_Z
3) file_B 8) file_G 13) file_L 18) file_Q 23) file_V 28) foo.sh
4) file_C 9) file_H 14) file_M 19) file_R 24) file_W
5) file_D 10) file_I 15) file_N 20) file_S 25) file_X
#? 1
You chose file AA
#? 4
You chose file_C
#? 28
You chose foo.sh
#? ^D
인터페이스는 일부 요구 사항에 따라 약간 스파르탄적일 수 있지만, 빠르고 지저분하지만 쉘 등급의 신뢰성이 필요한 경우 select
가방에 가지고 다닐 수 있는 유용한 도구입니다.
man
Bash 페이지에는 우리가 활용할 수 있는 의 동작의 몇 가지 측면이 나와 있습니다 select
.
그런 다음 PS3 프롬프트가 표시되고
표준 입력에서 한 줄을 읽습니다. 행이 표시된 단어 중 하나에 해당하는 숫자로 구성되면
name 값이
해당 단어로 설정됩니다. 줄이 비어 있으면 단어와 프롬프트가
다시 표시됩니다. EOF를 읽으면 명령이 완료됩니다. 다른
값을 읽으면 이름이 null로 설정됩니다. 읽은 줄은
REPLY 변수에 저장됩니다.
따라서 에 대한 호출 주위에 지원 코드를 추가하면 select
다음이 가능합니다.
unset name
_PS3="$PS3"
PS3="Which file do you want to use? "
while [ -z "$name" ]
do
select name in *; do break; done
if [ -z "$name" ]
then
if [ -f "$REPLY" ]
then
name="$REPLY"
printf "You chose by name: '%s'\n" "$name"
else
printf "There is no file by that name.\n"
fi
else
printf "You chose by number: '%s'\n" "$name"
fi
done
PS3="$_PS3"; unset _PS3
산출:
$ ./foo.sh
1) file AA 6) file_E 11) file_J 16) file_O 21) file_T 26) file_Y
2) file_A 7) file_F 12) file_K 17) file_P 22) file_U 27) file_Z
3) file_B 8) file_G 13) file_L 18) file_Q 23) file_V 28) foo.sh
4) file_C 9) file_H 14) file_M 19) file_R 24) file_W
5) file_D 10) file_I 15) file_N 20) file_S 25) file_X
Which file do you want to use? 12
You chose by number: 'file_K'
$ ./foo.sh
1) file AA 6) file_E 11) file_J 16) file_O 21) file_T 26) file_Y
2) file_A 7) file_F 12) file_K 17) file_P 22) file_U 27) file_Z
3) file_B 8) file_G 13) file_L 18) file_Q 23) file_V 28) foo.sh
4) file_C 9) file_H 14) file_M 19) file_R 24) file_W
5) file_D 10) file_I 15) file_N 20) file_S 25) file_X
Which file do you want to use? file W
There is no file by that name.
1) file AA 6) file_E 11) file_J 16) file_O 21) file_T 26) file_Y
2) file_A 7) file_F 12) file_K 17) file_P 22) file_U 27) file_Z
3) file_B 8) file_G 13) file_L 18) file_Q 23) file_V 28) foo.sh
4) file_C 9) file_H 14) file_M 19) file_R 24) file_W
5) file_D 10) file_I 15) file_N 20) file_S 25) file_X
Which file do you want to use? 29
There is no file by that name.
1) file AA 6) file_E 11) file_J 16) file_O 21) file_T 26) file_Y
2) file_A 7) file_F 12) file_K 17) file_P 22) file_U 27) file_Z
3) file_B 8) file_G 13) file_L 18) file_Q 23) file_V 28) foo.sh
4) file_C 9) file_H 14) file_M 19) file_R 24) file_W
5) file_D 10) file_I 15) file_N 20) file_S 25) file_X
Which file do you want to use? file AA
You chose by name: 'file AA'