Как создать динамическое меню и сделать его пригодным для использования?

Используйте здесь немного магии Python:

bash-4.3$ VAR='10 20 30 40 50 60 70 80 90 100'
bash-4.3$ python -c 'import sys;print " ".join(sys.argv[1].split()[::-1])'  "$VAR" 
100 90 80 70 60 50 40 30 20 10

Это работает довольно просто:

  • мы ссылаемся на «$ VAR» как на второй параметр командной строки sys.argv [ 1] (первым параметром с опцией -c всегда является сам -c . Обратите внимание на кавычки вокруг «$ VAR» для предотвращения разделения сама переменная на отдельные слова (которые выполняются оболочкой, а не python)
  • Затем мы используем метод .split () , чтобы разбить ее на список строк
  • [:: - 1] часть - это просто расширенный синтаксис среза , чтобы перевернуть список
  • , наконец, мы объединяем все вместе обратно в одну строку с помощью " ".join () и распечатайте

Но те, кто не являются большими поклонниками Python, мы могли бы использовать AWK , чтобы сделать по сути то же самое: разделить и распечатать массив в обратном порядке:

 echo "$VAR" | awk '{split($0,a);x=length(a);while(x>-1){printf "%s ",a[x];x--};print ""}'
100 90 80 70 60 50 40 30 20 10 

2
11.12.2016, 17:35
2 ответа

Вместо сложных операторов case / if вы можете сделать трюк и использовать массив для хранения имен файлов внутри, а затем просто вызовите нужный файл, используя его индекс массива:

number=1
for file in ./menus/*; do
fnames+=($(basename -s .sh $file))
#OR just fnames+=( $file )
echo "$number)" `basename -s .sh "$file"`
let "number += 1"
done
read -p "select a file id" fid
fid=$(($fid-1)) # reduce user input by 1 since array starts counting from zero
cat "${fnames[$fid]}.sh" # or just cat "${fnames[$fid]}" 

Вы также можете создать свою работу с красивым графическим интерфейсом, используя Yad (расширенный форк Zenity), как показано ниже.
В этом случае вам не нужна нумерация - вы просто выбираете файл из списка графического интерфейса пользователя и, нажимая клавишу ввода или щелкнув по ОК, вы выбираете выбранный файл, и вы можете увидеть его содержимое на новом Яд окно.

В виде однострочной команды в bash (для тестирования):

fc=$(basename -s .sh $(find . -name "*.sh") |yad --list --width=500 --height=500 --center --column="File" --separator="") && cat $fc.sh |yad --text-info --width=800 --height=300

В виде сценария:

yadb=0
while [ $yadb -eq "0" ];do 
    fc=$(basename -s .sh $(find . -name "*.sh") |yad --list --width=500 --height=500 --center --column="File" --separator="")
    yadb=$?
    if [ $yadb -eq "0" ]; then 
       cat $fc.sh |yad --text-info --width=800 --height=300
    fi
    # If you press cancel on yad window , then yadb will become 1 , file will not be displayed and while loop will be ended.
done
-1
27.01.2020, 22:10

Используйте диалоговое окно для этого ...

диалоговое окно установки apt-get

Пример:

#!/bin/bash

HEIGHT=15
WIDTH=40
CHOICE_HEIGHT=4
BACKTITLE="Backtitle here"
TITLE="Title here"
MENU="Choose one of the following options:"

OPTIONS=(1 "Option 1"
         2 "Option 2"
         3 "Option 3")

CHOICE=$(dialog --clear \
                --backtitle "$BACKTITLE" \
                --title "$TITLE" \
                --menu "$MENU" \
                $HEIGHT $WIDTH $CHOICE_HEIGHT \
                "${OPTIONS[@]}" \
                2>&1 >/dev/tty)

clear
case $CHOICE in
        1)
            echo "You chose Option 1"
            ;;
        2)
            echo "You chose Option 2"
            ;;
        3)
            echo "You chose Option 3"
            ;;
esac
3
27.01.2020, 22:10

Теги

Похожие вопросы