Bash 条件表达式在函数内无法按预期工作

标签 bash

我是一个不断学习的菜鸟,我被难住了。以下代码片段的第 7 行是我遇到问题的地方。基本上,函数内的 if 语句“FUNCTION_SERVER_START”似乎不起作用。当我说“不起作用”时,我的意思是 1 = 1 应该为 true,但不知何故 1 = 1 为 false,但即使表达式被确定为 false,脚本也会跳过“else”。看起来 if 语句,因为它位于函数内部,所以行为不正常。希望我只是做了一些愚蠢的事情,你可以指出这一点。

有关该脚本的一些背景知识,我编写它是为了帮助管理我的世界服务器。我已尝试尽可能简化此处显示的内容,以便您可以看到正在发生的情况,而不会因《我的世界》特定内容而减慢速度。如果需要,我可以发布完整的脚本。

我无法让变量“$succeed”等于“true”,因为似乎无论如何 “$SCREEN_CHECK_STATUS”等于(1 或 0)if 语句不会执行此操作。

谢谢。

## FUNCTIONS

FUNCTION_SERVER_START() 
{
  FUNCTION_SCREEN_CHECK
  echo "debug: $SCREEN_CHECK_STATUS"

调试:0

  if [ "$SCREEN_CHECK_STATUS" -eq 1 ]
  then
  {
    echo "Starting the server with option 0."
    command_that_starts_server_opt_0
    succeed="true"
  }
  else
  {
    echo "Starting the server with option 1"
    command_that_starts_server_opt_1
    succeed="true"
  }
  fi
  if [ "$succeed" == "true" ]
  then
  {
    echo "debug: Succeeded!"
  }
  else
  {
    echo "debug: Failed!"

调试:失败!

  }
  fi
}

FUNCTION_SCREEN_CHECK()
## sees if the screen session is running already. if it is, $SCREEN_CHECK_STATUS=1, if not, it's 0 by default
{
  SCREEN_CHECK_STATUS="0"
  if [ "$(screen -ls ${SCREEN_NAME[$SERVER_SELECTED]} | grep ${SCREEN_NAME[$SERVER_SELECTED]})" ]  ## runs, "screen -ls <screenname> then filters with grep. basically sees if screen session is already running.
  then
  {
    SCREEN_CHECK_STATUS="1"
  }
  else
  {
    echo "debug: screen session IS NOT running"; fi
  }
  fi
}  


## RUNNER

FUNCTION_SERVER_START

编辑:

sh -xv 说声明数组的行上存在语法错误,所以我使用 bash -xv 并得到了这个:

+ FUNCTION_SERVER_START
+ FUNCTION_SCREEN_CHECK
+ SCREEN_CHECK_STATUS=0
screen -ls ${SCREEN_NAME[$SERVER_SELECTED]} | grep ${SCREEN_NAME[$SERVER_SELECTED]})"
screen -ls ${SCREEN_NAME[$SERVER_SELECTED]} | grep ${SCREEN_NAME[$SERVER_SELECTED]})
screen -ls ${SCREEN_NAME[$SERVER_SELECTED]} | grep ${SCREEN_NAME[$SERVER_SELECTED]}
++ grep delphi
++ screen -ls delphi
+ '[' '' ']'
+ echo 'debug: delphi screen session IS NOT running'
debug: delphi screen session IS NOT running
+ '[' 0 -eq 1 ']'
+ '[' '' == true ']'
+ echo 'debug: Failed!'
debug: Failed!

最佳答案

我真傻,真傻。我应该发布完整的、未经编辑的脚本片段。只有这样,真正的问题才会显现出来:

FUNCTION_SERVER_START() 
## starts the minecraft server in screen.
## it uses FUNCTION_SCREEN_CHECK to see if a screen session is already running with the server's designated screen name.
## there are two ways of starting the server. one is sending the mc start string (ex: "java -Xmx512 -Xms512 -jar minecraft_server.jar")...
## ...to the page 0 of the screen session already running, and the other way is to execute the same command in a new screen session.
{
  echo "test phase: can a funky call a phunky?"
  FUNCTION_SCREEN_CHECK
  if [ $DEBUG_MODE -eq 1 ]; then echo "debug: \$SCREEN_CHECK_STATUS = $SCREEN_CHECK_STATUS"; fi
  if [ $SCREEN_CHECK_STATUS -eq 1 ]
  then
  {
    if [ $DEBUG_MODE -eq 1 ]; then echo "Starting the ${SCREEN_NAME[$SERVER_SELECTED]} minecraft server assuming screen is running."; fi
    screen -S ${SCREEN_NAME[$SERVER_SELECTED]} -p 0 -X stuff $(printf "java -Xmx${SERVER_MEMORY[$SERVER_SELECTED]}M -Xms${SERVER_MEMORY[$SERVER_SELECTED]}M -jar ${SERVER_DIR[$SERVER_SELECTED]}${SERVER_JAR_NAME[$SERVER_SELECTED]}")"
    sleep 5
    succeed="true"
  }
  else
  {
    if [ $DEBUG_MODE -eq 1 ]; then echo "Starting the ${SCREEN_NAME[$SERVER_SELECTED]} minecraft server assuming screen is not running."; fi
    screen -m -d -S ${SCREEN_NAME[$SERVER_SELECTED]} java -Xmx${SERVER_MEMORY[$SERVER_SELECTED]}M -Xms${SERVER_MEMORY[$SERVER_SELECTED]}M ${SERVER_ARGUMENTS[$SERVER_SELECTED]} -jar ${SERVER_DIR[$SERVER_SELECTED]}${SERVER_JAR_NAME[$SERVER_SELECTED]}"
    sleep 5
    succeed="true"
  }
  fi
  if [ "$succeed" == "true" ]
  then
  {
    echo "\$\$\$\$\$\$\$\$\$\$\$\$\$ test phase: passed the func serv start if"
  }
  else
  {
    echo "****** test phase: failed the func serv start if"
  }
  fi
}

第 14 行缺少双引号,第 21 行多了一个双引号。

第 14 行错误:

screen -S ${SCREEN_NAME[$SERVER_SELECTED]} -p 0 -X stuff $(printf "java -Xmx${SERVER_MEMORY[$SERVER_SELECTED]}M -Xms${SERVER_MEMORY[$SERVER_SELECTED]}M -jar ${SERVER_DIR[$SERVER_SELECTED]}${SERVER_JAR_NAME[$SERVER_SELECTED]}")"

第 14 行右:

screen -S ${SCREEN_NAME[$SERVER_SELECTED]} -p 0 -X stuff "$(printf "java -Xmx${SERVER_MEMORY[$SERVER_SELECTED]}M -Xms${SERVER_MEMORY[$SERVER_SELECTED]}M -jar ${SERVER_DIR[$SERVER_SELECTED]}${SERVER_JAR_NAME[$SERVER_SELECTED]}")"

第 21 行错误:

screen -m -d -S ${SCREEN_NAME[$SERVER_SELECTED]} java -Xmx${SERVER_MEMORY[$SERVER_SELECTED]}M -Xms${SERVER_MEMORY[$SERVER_SELECTED]}M ${SERVER_ARGUMENTS[$SERVER_SELECTED]} -jar ${SERVER_DIR[$SERVER_SELECTED]}${SERVER_JAR_NAME[$SERVER_SELECTED]}"

第 21 行右:

screen -m -d -S ${SCREEN_NAME[$SERVER_SELECTED]} java -Xmx${SERVER_MEMORY[$SERVER_SELECTED]}M -Xms${SERVER_MEMORY[$SERVER_SELECTED]}M ${SERVER_ARGUMENTS[$SERVER_SELECTED]} -jar ${SERVER_DIR[$SERVER_SELECTED]}${SERVER_JAR_NAME[$SERVER_SELECTED]}

但除了我之外,任何人都不可能知道这一点,因为我没有发布正确的代码,哎呀!

我用nano编写了脚本,只有当我将它带入具有语法突出显示的gedit时,我才发现问题。

感谢大家的评论。

关于Bash 条件表达式在函数内无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7865031/

相关文章:

bash - 从 WSL 访问现有的 Windows 环境变量

linux - 将命令转换为 Linux 的 bash 脚本

html - sed HTML </>标签

regex - 如何在正则表达式末尾转义大括号

linux - bc 忽略比例选项

bash - awk - 以 3 列格式打印输出

git - 使用来自 cmder 的 git 别名

bash - 没有 bc 的 bash 脚本中的除法数学?

node.js - Sails Node 包未更新

linux - 导出带有特殊字符的 .env