在我的程序中,我想获取输入的子字符串来比较它们并将它们保存为变量,但是我的脚本似乎被冻结/卡在循环中。
#!/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举些例子。