shell脚本中的比较

Sri*_*niV 1 unix linux shell logical-operators

我很难理解这一点.我认为,我可以编写一个返回代码比较,如下所示.哪个更好?为什么会这样?

RC=$?

if [[ $RC == '0' ]]; then
if [ $RC -eq '0' ]; then
if [ $RC == '0' ]; then
if [ "$RC" == "0" ]; then
if [ "$RC" -eq "0" ]; then
if [[ "$RC" == "0" ]]; then
if (( "$RC" == "0" )); then
if ( "$RC" == "0" ); then
if (( $RC == 0 )); then
if ( $RC == 0 ); then
Run Code Online (Sandbox Code Playgroud)

还有一些......

如果RC="A"- 字符串怎么办?

tri*_*eee 6

以上都不是.在绝大多数情况下,您希望直接从内部检查退出代码if.任何看起来像的代码

command
RC=$?
if [ $RC == 0 ]; then
Run Code Online (Sandbox Code Playgroud)

更优雅,更健壮,更具风格

if command; then
Run Code Online (Sandbox Code Playgroud)

除非您特别需要检查结果代码的精确非零值.

要单独解决您的问题关于使用哪个运营商相比,唯一的完全便携式的变体是[=.这个传统的Bourne shell运算符的语法不支持==相等,所以这是错误的(虽然有些shell允许它作为语法安全网).该-eq操作者为进行比较数字平等,而=执行字符串比较.

在现代的shell中,[[并且((都是可行的,这取决于你是否更关心字符串比较(这是[[有意义的)或算术(这是域的((- 如果比较涉及对数字的一些实际计算,则特别有用;但它绝对是更多的边缘替代品,因为它对字符串比较没有用处). [[还支持模式匹配,因此您不仅限于静态字符串比较; 不像[,它需要一个双等号来进行字符串相等比较.它适用于许多棘手的问题[,包括但不限于使用不加引号的变量和以破折号开头的参数的正确行为.

使用单个括号的替代方法根本不能满足您的需求.它试图$RC在子shell中作为命令运行.