我正在编写一个脚本来在模拟器上运行给定的程序,同时更改提供的参数,但我遇到了一个问题,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
通过在包含 shell 特殊字符(空格和!"#$&\()*;<>?[\]^`{|}~
)的字符串两边加上单引号,生成视觉上明确的输出。在这里,您正在跟踪一个命令,该命令采用包含 a 的参数"
,因此 bash 将其打印出来,并在其周围加上单引号,以清楚地表明 the"
是字符串中的文字字符,而不是 shell 源语法中的某些字符。
看来你并不想拥有双引号在论证中。所以就别放了。
您确实需要在变量扩展周围使用双引号,但在 shell 语法中,这只是双引号,而不是放置带引号的双引号,以便双引号字符最终出现在字符串中。
"./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"