如何解决我可以在三元运算符中检查退出代码吗?
我正在尝试根据test
内置三元运算符的退出代码来打印字符串。我成功做到了:
b=5
echo $(( b==5 ? good : bad )) # good is printed
按预期打印好,但是如果我这样做:
echo $(( test $b -eq 50 ? 123 : 321 ))
test 5 -eq 50 ? 123 : 321 : syntax error in expression (error token is "5 -eq 50 ? 123 : 321 ")
echo $(( $(test $b -eq 5)==0 ? 123 : 321 ))
==0 ? 123 : 321 : syntax error: operand expected (error token is "==0 ? 123 : 321 ")
假设我要报告文件存在,以下任何一项都无法正常工作:
echo $(( $((test -e file))==0 ? 123 : 321 ))
test -e file: syntax error in expression (error token is "file")
echo $(( ((test -e file))==0 ? 123 : 321 ))
((test -e file))==0 ? 123 : 321 : missing `)' (error token is "file))==0 ? 123 : 321 ")
echo $(( (test -e file)==0 ? 123 : 321 ))
(test -e file)==0 ? 123 : 321 : missing `)' (error token is "file)==0 ? 123 : 321 ")
echo $(( "test -e file" ? 123 : 321 ))
"test -e file" ? 123 : 321 : syntax error: operand expected (error token is ""test -e file" ? 123 : 321 ")
三元运算符中是否有任何可以检查退出代码的构造?
解决方法
或者,使用数组索引。
典型构造:
b=5
str=(bad good)
echo "${str[b==5]}"
这将算术比较的输出用作数组索引。
, $(( arithmetic context ))
需要算术表达式;显然,随机字符串(显然希望您已将其作为命令执行)不是算术表达式,所以这是语法错误。
可能尝试
echo $(( $(test "$b" -eq 50; echo $?) ? 123 : 321 ))
等;但显然,这是一种复杂得多,更惯用的说法
test "$b" -eq 50 && echo 123 || echo 321
您无法重构echo
;在这个孤立的示例中,这只是一个小麻烦。如果您确实需要避免重复更复杂的代码,请用一个封装了您不想重复的内容的函数替换echo
。
$(command substitution)
用打印到标准输出的任何内容替换命令。如果要检查其退出代码,则需要将其(没有其他内容)打印到标准输出,或使用其他结构。
字符串作为消息
您可以将消息数组构建为:
MSGS=('Good result' 'Wrong result' [123]='Existing entry' [321]='Broken link')
然后您将需要一些常量:
good=0 bad=1 exist=123 notexist=321
然后将整数用作:
b=5 file=/tmp
printf "B: %s %s,Entry: '%s' %s\n" "$b" "${MSGS[ b==5 ? good : bad ]}" \
"$file" "${MSGS[ $(test -e "$file";echo $?) ? notexist : exist ]}"
B: 5 Good result,Entry: '/tmp' Existing entry
或
b=12 file=/tnt
printf "B: %s %s,Entry: '%s' %s\n" "$b" "${MSGS[ b==5 ? good : bad ]}" \
"$file" "${MSGS[ $(test -e "$file";echo $?) ? 321 : 123 ]}"
B: 12 Wrong result,Entry: '/tnt' Broken link
快速游戏示例:
简单的 使用消息数组选择数字 游戏。
GAMMSGS=(Exact 'Too small' 'Too big') target=$((RANDOM%10)) ANSWER=''
while [ "$ANSWER" != "Exact" ]; do
read -n 1 -p 'Enter a digit: ' play
ANSWER=${GAMMSGS[ target == play ? 0 : target > play ? 1 : 2 ]}
echo -e \\nYou try $play: $ANSWER
done
样品运行:
Enter a digit: 0
You try 0: Too small
Enter a digit: 9
You try 9: Too big
Enter a digit: 5
You try 5: Too big
Enter a digit: 3
You try 3: Exact
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。