提供された引数の変更中にエミュレータで特定のプログラムを実行するためのスクリプトを作成していますが、bashが二重引用符の周りに一重引用符を挿入してエミュレータがクラッシュするという問題が発生しました。これが起こらないようにするにはどうすればよいですか?
スクリプト
#!/bin/bash
#./matrix_sim MM1.x86 1024 X86 gem5.opt
PROGRAM=$1
ARGUMENT=$2
ARCHI=$3
TARGET=$4
./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o \"$ARGUMENT\"
このスクリプトを実行すると、実際の出力は次のようになります。
./gem5/build/X86/gem5.opt gem5/configs/example/se.py -c ./MM1.x86 -o '"2"'
しかし、私が本当にしたいことはこれです。
./gem5/build/X86/gem5.opt gem5/configs/example/se.py -c ./MM1.x86 -o "2"
出力から単一のティックを削除するにはどうすればよいですか?
答え1
Bashは文字列に一重引用符を追加しません。一重引用符が追跡された出力を視覚的に明確にする方法set -x
。 Bashは、set -x
シェル特殊文字(スペースと)を含む文字列の周囲に一重引用符を配置して、視覚的!"#$&\()*;<>?[\]^`{|}~
に明確な出力を生成します。ここでは a を含む引数をとるコマンドに従うので、bash はシェルではなく文字列のリテラル文字であることを"
明確にするために、一重引用符を使用してそれを印刷します。ソース文法の特定の文字。"
欲しくないと思います。二重引用符議論から。だから放置しないでください。
変数拡張の周りに二重引用符を使用する必要がありますが、シェル構文では、二重引用符文字が文字列に入るように引用符で囲まれた二重引用符を配置するのではなく、二重引用符にすぎません。
"./gem5/build/$ARCHI/$TARGET" gem5/configs/example/se.py -c "./$PROGRAM" -o "$ARGUMENT"
答え2
ただ使用してください"$ARGUMENT"
:
./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o "$ARGUMENT"
set -x
Bashは、を使用すると、単一引用符(トレース出力など)を追加します。\"$ARGUMENT\"
なぜなら、パラメータ値の一部として二重引用符を含めるからです。いいえあなたは何が欲しいですか)。
答え3
コピーできません:
$ ./in.sh program arg arch target
./gem5/build/arch/target gem5/configs/example/se.py -c ./program -o "arg"
$ cat in.sh
#!/bin/bash
#./matrix_sim MM1.x86 1024 X86 gem5.opt
PROGRAM=$1
ARGUMENT=$2
ARCHI=$3
TARGET=$4
echo ./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o \"$ARGUMENT\"
私はあなたが見ているものを再現しようと努力しましたが、できませんでした。
次のことを試すこともできます。
ARGUMENT="\"$2\""
次に、呼び出しの周りからエスケープされた引用符を削除します。
echo ./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o "$ARGUMENT"