我正在尝试创建脚本,该脚本将生成具有存储在特定文件夹中的文件名的菜单,然后允许我在输入分配给该文件的编号后使用 cat 打印该文件内容。我所做的循环在菜单生成方面工作得很好,但我不知道如何自动设置变量并使用它们来打印文件内容或生成案例结构(不确定在这种情况下哪种方法更好)。我的循环如下所示:
number=1
for file in ./menus/*; do
echo "$number)" `basename -s .sh "$file"`
let "number += 1"
done
答案1
用于dialog
那个...
apt-get install dialog
例子:
#!/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
答案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 的高级分支)使用漂亮的 GUI 来完成您的工作,如下所示。
在这种情况下,您不需要编号 - 您只需从 GUI 列表中选择文件,然后按 Enter 或单击“确定”即可捕获所选文件,并且可以在新的 yad 窗口中看到它的内容。
作为 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