Попросите пользователя выбрать каталог с bash script и результат чтения
Я хочу прочитать директорию с bash script (на самом деле я использую zsh).
Я хочу перечислить текущие папки в одном и том же каталоге и отобразить его пользователю, прося ввести номер, чтобы выбрать нужную папку.
Please select a Folder eg, 1,2,3.
1. Folder Name 1 (this should the actual name of the folder in the dir
2. Folder 2
3. Folder 3.
Я хотел бы также иметь возможность конвертировать входные данные, например: 1. Вернуться к фактическому имени папки, чтобы я мог
cd ./$foldername/
Спасибо за помощь.
Привет, Джон.
Ответы
Ответ 1
Если ваши требования к форматированию очень строгие, вы можете просто использовать bash s select
construct.
В следующем коде будет представлено меню всех каталогов в текущем каталоге, а затем chdir для выбранного:
printf "Please select folder:\n"
select d in */; do test -n "$d" && break; echo ">>> Invalid Selection"; done
cd "$d" && pwd
Ответ 2
#!/bin/bash
dirs=(*/)
read -p "$(
f=0
for dirname in "${dirs[@]}" ; do
echo "$((++f)): $dirname"
done
echo -ne 'Please select a directory > '
)" selection
selected_dir="${dirs[$((selection-1))]}"
echo "You selected '$selected_dir'"
Ответ 3
Увидел этот фрагмент @некоторую ссылку на стопку dunno точно. Хотя может быть полезно
#! /bin/bash
# customize with your own.
options=(backup_*/)
menu() {
clear
echo "Avaliable options:"
for i in ${!options[@]}; do
printf "%3d%s) %s\n" $((i+1)) "${choices[i]:- }" "${options[i]}"
done
[[ "$msg" ]] && echo "$msg"; :
}
prompt="Check an option (again to uncheck, ENTER when done): "
while menu && read -rp "$prompt" num && [[ "$num" ]]; do
[[ "$num" != *[![:digit:]]* ]] && (( num > 0 && num <= ${#options[@]} )) || {
msg="Invalid option: $num"; continue
}
((num--)); msg="${options[num]} was ${choices[num]:+un}checked"
[[ "${choices[num]}" ]] && choices[num]="" || choices[num]="[+]"
done
printf "You selected"; msg=" nothing"
for i in ${!options[@]}; do
[[ "${choices[i]}" ]] && { printf " %s" "${options[i]}"; msg=""; }
done
echo "$msg"