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サーバーに接続しました。すべての助けに感謝します。

"${var:x:y}"編集:関数の代わりに使用すると、部分awk文字列を取得できることがわかりました。しかし、プログラムは私に与えられたエラーを介して引数を文字列に変換するのではなく、引数を実行しようとしているようです。./runserver.sh: line 11: -r: command not found

答え1

シェル変数の割り当てにはスペースは使用できません。したがって、begin= ``awk... 初期化を開始して空にし、コマンドawkの出力を実行してみてください。終わりと同じ=

ファイルや標準入力から入力を提供していないため、両方のawkが中断されました。実際のデータに基づいているのではなく、BEGINルールでのみこれを実行したい場合があります。

それはおそらく、$ varからいくつかの文字を取得するためにawkを使う予定です。部分文字列とうまく機能するいくつかのシェルオプションがあります。このためにawkを実行する必要はありません。

$awkvarのシェル構成を使用しているため、awksは機能しません。 awk自体内で$を使用しないでください(awk内のフィールド番号を指定します)。

シェル部分文字列演算子が見つかりましたが、更新されたスクリプトは表示されません。

新しいものは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いくつかの例を見てください。

関連情報