0

我是 Linux、shell 和脚本的新手。我遇到了一个问题,无论我如何尝试谷歌,我都找不到答案。

我有一个脚本,它为一个名为“whiptail”的程序创建菜单项,这似乎是在 Debian 上为 Raspberry Pi 显示对话框和菜单项的标准方式。列表项是根据在 Linux 机器上的各种文件中找到的各种数据创建的。我的代码开始

#!/bin/sh

该列表是在脚本顶部的 #!/bin/sh 环境中创建的。

但是,为了举例,让我们将列表定义为:

LIST="\"Tag 1\" \"Item 1\" \\ \n\"Tag 2\" \"Item 2\" \\ \n"

有效的代码是:

while true; do
 TESTRESULT=$(whiptail --menu "Test" 20 80 12 --cancel-button Cancel --ok-button Select \
  "Tag 1" "Item 1" \
  "Tag 2" "Item 2" \
   3>&1 1>&2 2>&3)
 RET=$?
 if [ $RET -eq 1 ]; then
   echo "Cancel"
   exit 0
 elif [ $RET -eq 0 ]; then
   echo "Do something with the selection stored in TESTRESULT"
   exit 0
 else
   exit 1
 fi

不知道怎么换

  "Tag 1" "Item 1" \
  "Tag 2" "Item 2" \

与“LIST”变量中的项目。我有一种感觉,答案在于“eval”,但我也遇到了将其作为解决方案工作的问题。

我也在尝试将 LIST 创建为数组,但我认为这也使事情变得复杂。

任何人有任何想法?

4

2 回答 2

0

没关系想通了。问题是字符串被分解的方式。更改 IFS(内部字段分隔符)并再次更改它允许我在我想要的地方使用空格:

oIFS="$IFS";
IFS="/"

LIST="Tag 1/Item 1/Tag 2/Item 2"

while true; do
 TESTRESULT=$(whiptail --menu "Test" 20 80 12 --cancel-button Cancel --ok-button Select $LIST 3>&1 1>&2 2>&3) 
 RET=$?
 if [ $RET -eq 1 ]; then
  echo "Cancel"
  exit 0
 elif [ $RET -eq 0 ]; then
  echo "Do something with the selection stored in TESTRESULT"
  exit 0
 else
  exit 1
 fi
done

IFS=$oIFS
于 2013-01-07T18:04:44.113 回答
0

我还意识到每个菜单项末尾的“\”可能是在告诉外壳程序“视为一行”而不是分隔菜单项,但是在重新格式化“LINE”以充当单行之后清单,我仍然有使用问题

"TESTRESULT=$(whiptail --menu "Test" 20 80 12 --cancel-button Cancel --ok-button Select $LIST 3>&1 1>&2 2>&3)  

我想知道它是否与 $() 容器中使用的 $LIST 有关。

于 2013-01-07T09:16:44.510 回答