【发布时间】:2020-09-13 00:14:40
【问题描述】:
我正在寻找的是一个紧凑的代码行,它在一个嵌套语句中两次使用表达式的值
对于变量的赋值和
变量的新值与另一个值的条件测试
问题是:
这种紧凑形式在 bash 中是否普遍可行?
如果是,我是否必须担心负面影响(意外结果)?
你当然可以先做任务:
$ local bus_connection="$(lsblk -dn -o TRAN /dev/sdd)"
$ test "$bus_connection" = "usb" || { echo "not usb"; exit 1 }
$ echo "$bus_connection"
usb
--> 有效!
如果只有在成功的情况下才需要变量“bus_connection”,你也可以这样做:
$ test "$(lsblk -dn -o TRAN /dev/$DEVICE)" = "usb" \
&& local bus_connection="usb" \
|| { echo "not usb"; exit 1 }
$ echo "$bus_connection"
usb
--> 也有效! (不要在命令行中使用“local”!)
在 C(++) 和其他一些已编译的高级语言中,您可以做得更紧凑(假设一个 c 函数 'lsblk'):
if( ( bus_connection = lsblk( ... ) ) == "usb" ) ; else {printf("not usb"); exit 1;}
我在 bash 中尝试过:
$ test $(bus_connection="$(lsblk -dn -o TRAN /dev/sdd)") = "usb" || echo "not usb"
bash: test: =: unary operator exspected.
not usb
--> 错误信息和错误结果!
我用整数大小写测试发现:
$ sum=0
$ result=12
$ test $((sum=$sum+$result)) -gt 20 && echo "true"
$ test $((sum=$sum+$result)) -gt 20 && echo "true"
true
--> 有效!副作用?
类比:
$ test $((bus_connection="$(lsblk -dn -o TRAN /dev/sdd)")) = "usb" || echo "not usb"
not usb
--> 没有错误信息但结果错误!
$ echo "$bus_connection"
0
--> 啊,显然 bash 现在将变量 'bus_connection' 视为整数类型。
对字符串有什么建议吗?
【问题讨论】:
-
to fear negative side effects请定义“否定”。什么是“负面影响”? -
是的,意外的副作用。在这个组合中,我还看不到任何东西。但我可能是错的,在某些情况下结果不符合预期。
标签: bash if-statement nested variable-assignment side-effects