Используйте здесь немного магии 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
Вместо сложных операторов 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
Используйте диалоговое окно
для этого ...
диалоговое окно установки 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