Bash 解析链接对话框的输出

Bash 解析链接对话框的输出,bash,shell,sed,echo,Bash,Shell,Sed,Echo,我有一个脚本在链中生成2个对话框,输出是一个由2个数字组成的字符串,例如:“xy”。我想在单独的变量中获取这些数字,所以我尝试使用sed: y=$(echo -n $x | sed 's/\([0-9]\+\) \([0-9]*\)/\2/') x=$(echo -n $x | sed 's/\([0-9]\+\) \([0-9]*\)/\1/') 其中$y是链接对话框的输出。 我的问题是,如果我在终端中尝试每个命令,它会正常工作,“12”会给我x=“1”和y=“2”,但从bashshell脚

我有一个脚本在链中生成2个对话框,输出是一个由2个数字组成的字符串,例如:“xy”。我想在单独的变量中获取这些数字,所以我尝试使用sed:

y=$(echo -n $x | sed 's/\([0-9]\+\) \([0-9]*\)/\2/')
x=$(echo -n $x | sed 's/\([0-9]\+\) \([0-9]*\)/\1/')
其中$y是链接对话框的输出。 我的问题是,如果我在终端中尝试每个命令,它会正常工作,“12”会给我x=“1”和y=“2”,但从bashshell脚本中,变量的末尾有一个空格(x=“1”和y=“2”)

我已经尝试使用tr删除空间,但没有效果。我还使用了'echo-n'来删除尾随的换行符,但它没有改变任何东西。 我的目标是对这些变量进行操作,这样它们就不会在最后有空间

我将结果打印为:

echo -e 'x:"'$x'" ,y:"'$y'"'
我得到x变量是因为:

x=$((dialog --clear --title title --menu Choose: 20 70 4 "1 a 2 b 3 c" \
  --and-widget --menu Choose: 20 70 4 "1 x 2 y 3 z") 2>&1)

可以使用Bash直接执行此操作:

read x y <<< "1 2"

readxy虽然在这种情况下可能不需要,但是Bash正则表达式匹配可以提供对解析的更多控制。例如,您可以有如下内容:

if
  [[ $output =~ ^[[:space:]]*([^[:space:]]+)[[:space:]]+([^[:space:]]+) ]]
then
  x=${BASH_REMATCH[1]}
  y=${BASH_REMATCH[2]}
else
  # No match
fi
这显然更复杂,但正则表达式通常可用于解析(和提取部分)字符串,这些字符串的格式可能会有所不同,或者由于结构原因,
read
无法处理这些字符串。

exec 3>&1
exec 3>&1
result=$( dialog --clear --title title --menu Choose: 20 70 4 1 a 2 b 3 c \
  --and-widget --menu Choose: 20 70 4 1 x 2 y 3 z  2>&1 1>&3 )
exitcode=$?
exec 3>&-
echo "result = >$result<" "exit-code = >$exitcode<"
sep=$(echo -e "\t") # define the separator
x=${result%$sep*} # remove up from separator
y=${result#*$sep} # remove up to separator

echo "Choosen: x=$x y=$y"
结果=$(对话框--清除--标题--菜单选择:20 70 4 1 a 2 b 3 c\ --和小部件--菜单选择:20 70 4 1 x 2 y 3 z 2>&11>&3) exitcode=$? 执行官3>&-
echo“result=>$result$exitcode显示脚本的所有相关部分,包括输出变量的位置。它们与您显示的内容之间没有空格。这在终端中起作用,但对对话框不起作用。我只得到x,y为空。您从对话框中得到的字符串是什么?如果我选择“echo$x”,我会得到类似于”1 2“(没有引号)如果你说
echo A${x}B
,那么你得到的是什么呢?我得到的是“a2b”(如果第一个对话框的选择是1,第二个对话框的选择是2,那么没有引号)。这很有效,但我想知道为什么sed或read在这种情况下不起作用。假设
sed
方法对我有效“
开始。基于
阅读
的答案同样有效。您的对话框输出没有解释它包含的内容或它是如何获得的,这可能是它不适合您的原因。尽管如此,当sed工作时,它是一个大锤子,启动一个外部程序和一个管道来加上一个字符串。这总是导致“Choosen:x=1 y=2”。事实上,我使用的是Xdialog,我只是用dialog测试了一下,它不工作,因为它需要标准输出来打印菜单。所以你的答案提供了一个解决方案。对不起,更改了。参数扩展完全是错误的
exec 3>&1
result=$( dialog --clear --title title --menu Choose: 20 70 4 1 a 2 b 3 c \
  --and-widget --menu Choose: 20 70 4 1 x 2 y 3 z  2>&1 1>&3 )
exitcode=$?
exec 3>&-
echo "result = >$result<" "exit-code = >$exitcode<"
sep=$(echo -e "\t") # define the separator
x=${result%$sep*} # remove up from separator
y=${result#*$sep} # remove up to separator

echo "Choosen: x=$x y=$y"