使用 awk 命令时脚本陷入循环/冻结

使用 awk 命令时脚本陷入循环/冻结

在我的程序中,我想获取输入的子字符串来比较它们并将它们保存为变量,但是我的脚本似乎被冻结/卡在循环中。

#!/bin/bash

ram="5G";
file="forge.jar"
dir="MC/Eternal/"

echo $@

for var in $@
do
    begin= `awk -v awkvar="$var" '{print substr($awkvar,1,2)}'`
    end= `awk -v awkvar="$var" '{print substr($awkvar,3)}'`
    echo $begin $end
    if [ $begin = "-r" ]
    then
        echo Setting ram to $end
        ram=$end
    elif [ $begin = "-d" ]
    then
        echo "Looking for directory MC/$out"
        directory=$end
    elif [ $begin = "-f" ]
    then
        echo "Looking for file $out"
        file=$end
    fi
done
echo running command: java -Xms1G -Xmx$ram -jar $dir$file
echo Do you want to run it? [Y/n]:
read input
if [ input = "y" ]
    java -Xms1G -Xmx$ram -jar $dir$file
else
    echo cancelled
fi

当我输入时,./runserver.sh -r10G -dfoo -fmc.jar我期望得到java -Xms1G -Xmx10G -jar MC/foo/mc.jar ...,但程序似乎卡在线路上begin= ...。我已经尝试过begin = awk '{print substr($awkvar,1,2)},只是在声明begin = awk '{substr($awkvar,1,2)}'周围加上反引号awk。我是 Linux 新手,刚刚成功启动并连接到我的 Minecraft 服务器。感谢任何和所有的帮助。

编辑:发现如果我使用 the"${var:x:y}"而不是该awk函数,我可以获得一个子字符串。然而,程序似乎正在尝试运行参数,而不是通过它给我的错误将其变成字符串./runserver.sh: line 11: -r: command not found

答案1

shell 变量赋值中不允许有任何空格。因此,begin= ``awk... 只是初始化 begin 为空,然后尝试将 awk 的输出作为命令运行。与结束相同=

两个 awk 被卡住了,因为您没有从文件或标准输入中向它们提供任何输入。也许您只想在 BEGIN 规则中执行此操作,而不是根据真实数据执行此操作。

大概您打算使用 awk 只是为了从 $var 中获取几个字符。有一些 shell 选项可以很好地处理子字符串——无需为此运行 awk。

awks 将无法工作,因为您正在使用 $awkvar 的 shell 构造。您不应该在 awk 本身内部使用 $(它指定 awk 内部的字段编号)。

您已经发现了 shell 子字符串运算符,但没有显示更新的脚本。

新的失败if [ $begin = "-r" ]是因为它扩展了 $begin,并且测试看到[ -r = -r ]并认为 -r 是一个选项。如果您使用更好的测试语法版本并引用它,它就会起作用。

paul $ begin="-r"
paul $ if [[ "${begin}" = "-r" ]]; then echo true; fi
true
paul $ 

答案2

您用于解析命令行参数的代码太复杂了。请改用 bash 内置命令“getopts”。看https://stackoverflow.com/questions/16483119/an-example-of-how-to-use-getopts-in-bash举些例子。

相关内容