我有一个脚本生成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)
答案 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进行测试,但我希望它也能正常工作。