bash - 将单引号添加到双引号中

bash - 将单引号添加到双引号中

我正在编写一个脚本来在模拟器上运行给定的程序,同时更改提供的参数,但我遇到了一个问题,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"

相关内容