解析链式对话框的输出

时间:2017-04-29 11:57:44

标签: bash shell sed echo

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

y=$(echo -n $x | sed 's/\([0-9]\+\) \([0-9]*\)/\2/')
x=$(echo -n $x | sed 's/\([0-9]\+\) \([0-9]*\)/\1/')

其中$ y是链接对话框的输出。 我的问题是,如果我在终端中尝试每个命令它工作正常,“1 2”给我x =“1”和y =“2”但是从bash shell脚本变量末尾有一个空格(x =“ 1“和y =”2“)。

echo -n "1 2" | sed 's/\([0-9]\+\) \([0-9]*\)/\2/' # Works

我尝试过使用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)

3 个答案:

答案 0 :(得分:1)

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

read x y <<< "1 2"

它将剥离空格并设置变量$ x和$ y。

答案 1 :(得分:1)

虽然在这种情况下可能没有必要,但是Bash正则表达式匹配可以提供对解析的更多控制。例如,你可以这样:

if
  [[ $output =~ ^[[:space:]]*([^[:space:]]+)[[:space:]]+([^[:space:]]+) ]]
then
  x=${BASH_REMATCH[1]}
  y=${BASH_REMATCH[2]}
else
  # No match
fi

这显然更复杂,但正则表达式通常可用于解析(并提取部分)字符串,这些字符串的格式可能会因read因其结构而有所不同或无法处理。

答案 2 :(得分: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"

请参阅https://askubuntu.com/questions/491509/how-to-get-dialog-box-input-directed-to-a-variable以获取对话框的结果到变量中。您的代码x=$((表示并且算术扩展未正确完成。请参阅man bash $((expression))为什么它没有以错误结束是超出我的。对话框参数周围的引号产生5个参数,而您需要4个参数加上一对或多对参数。

对话框中的结果字符串似乎由TAB分隔。使用基于空白的正则表达式是行不通的。

sed不需要,可以使用(bash builtin)&#39;参数扩展&#39;。

菜单仍打印在标准输出上。 exec 3>&1创建了stdout的副本。 1>&3将通常的输出定向到通道3,它是1的副本。正常输出最终在标准输出中。

2>&1将stderr重定向到stdout,最终作为变量的内容。

如果出现错误,则错误消息在您的变量中。需要进行一些错误处理。

无法使用Xdialog进行测试,但我希望它也能正常工作。