【问题标题】:Bash - getting a unknown amount of arguments from inside a scriptBash - 从脚本中获取未知数量的参数
【发布时间】:2015-01-14 16:52:04
【问题描述】:

我正在为我拥有的 Minecraft 服务器尝试此操作,基本上它会在聊天中查找某个单词,然后对其进行响应。

这是我的代码:

echo [INFO] Started
while true; do
    tail -n 1 logs/latest.log > lookin.txt
    if grep -q ".df" lookin.txt
    then
        echo [$(date +'%r')][CMD] Toggledownfall
        echo ' ' > lookin.txt
        screen -S mc -X eval 'stuff "toggledownfall\015"'
        sleep 0.1
    fi

    if grep -q '.day' lookin.txt
    then
        echo [$(date +'%r')][CMD] Time set day
        echo ' ' > lookin.txt
        screen -S mc -X eval 'stuff "time set day\015"'
        sleep 0.1
    fi

    if grep -q '.night' lookin.txt
    then
        echo [$(date +'%r')][CMD] Time set night
        echo ' ' > lookin.txt
        screen -S mc -X eval 'stuff "time set night\015"'
        sleep 0.1
    fi


    if grep -q '.gm 1' lookin.txt
    then
        echo [$(date +'%r')][CMD] Gamemode 1 creeper_prey
        echo ' ' > lookin.txt
        screen -S mc -X eval 'stuff "gamemode 1 creeper_prey\015"'
        sleep 0.1
    fi
    if grep -q '.gm 0' lookin.txt
    then
        echo [$(date +'%r')][CMD] Gamemode 1 creeper_prey
        echo ' ' > lookin.txt
        screen -S mc -X eval 'stuff "gamemode 1 creeper_prey\015"'
        sleep 0.1
    fi
    if grep -q '.gm' lookin.txt
    then
        echo [$(date +'%r')][CMD][ATTEMPT] Gamemode
        echo ' ' > lookin.txt
        screen -S mc -X eval 'stuff "say Only ops are allow to use gamemode\015"'
        sleep 0.1
    fi
###############################################
    if grep -q '.test' lookin.txt
    then
        echo $1
        echo ' ' > lookin.txt
        screen -S mc -X eval 'stuff "say argumentsGoHere\015"'
        sleep 0.1
    fi
################################################
done

我想要做的是获取“.test”给出的参数并将它们打印在“ArgumentsGoHere”所在的位置。带有 .test 的代码是#'s 中的位

【问题讨论】:

  • 参数是什么意思?它们是包含.test 的行的一部分,还是脚本本身的参数?
  • 所以,如果它找到“.test random sentence here”,它会说“random sentence here”

标签: linux bash arguments minecraft


【解决方案1】:

您的设计并不是最好的。您应该考虑将tail-f 开关(如果适用于您的版本)一起使用:

while read -r line; do
    # do stuff with line
done < <(tail -f -n0 logs/latest.log)

这将避免在每次迭代时完全读取整个文件,并且您不需要sleep 0.1 技巧。这样也避免了使用辅助文件looking.txt

现在,我猜你想检查 starts 行是否带有命令。为此,您应该像这样使用case

case $line in
    (.df)
        echo "[$(date +'%r')][CMD] Toggledownfall"
        screen -S mc -X eval 'stuff "toggledownfall\015"' # I'm not sure what you're trying to achieve here
        ;;
    (.day)
        ...
esac

现在,关于您的 参数 进行测试:相应的 case 语句应该是:

(.test *)
    read -r -a args <<< "$line"
    # At this point you have an array args that contains all the arguments.
    screen -S mc -X eval 'stuff "say ${args[@]:1}\015"' # This looks very dangerous to me
    ;;

现在,要非常小心,因为您使用的eval 带有未经处理的用户输入!用户可以写.test $(rm / -rf) 或任何其他邪恶的命令!!! 不要在这里使用eval

【讨论】:

猜你喜欢
  • 2015-02-04
  • 1970-01-01
  • 2021-04-17
  • 2021-12-03
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
相关资源
最近更新 更多