我在我的客户端上运行一个命令,它向我的服务器发送信息:
bin/script.sh ack --id=10 --reason="This is the reason I ack"
这会向服务器发送一条消息,但对于原因字段,它会填写:
reason = "This
我试图转义空格(和引用):
--reason=\"This\ is..."
可是我还是逃不出空间。以上内容被记录下来:
reason = "This
在script.sh
里面有一行:
#!/bin/sh
RUNDIR=`dirname $0`/..
HQAPILOGDIR=$RUNDIR/logs
CLASSPATH=$CLASSPATH:$RUNDIR/conf
for h in `ls $RUNDIR/*.jar`; do
CLASSPATH=$CLASSPATH:$h
done
for i in `ls $RUNDIR/lib/*.jar`; do
CLASSPATH=$CLASSPATH:$i
done
java -Dhqapi.logDir=$HQAPILOGDIR -cp $CLASSPATH org.hyperic.hq.hqapi1.tools.Shell "$@"
据我所知,$@
符号从命令行引入参数,所以我猜这就是我的问题所在。 有没有办法转义我的命令行参数中的空格? $@ 是我的问题所在吗?
最佳答案
"$@"
确实将参数放在一起,而不通过字符串拆分。
你可以自己简单地测试一下:
#!/bin/sh
printf '%s\n' "$@"
每个参数都将打印在自己的行上,即使该参数包含空格也是如此。
顺便说一句——不要对引号进行转义!如果您编写 \"This
,那么引号将被视为数据,这使得它不再是语法,这意味着它根本不再具有引号的功能。
这是您的脚本的完全清理副本:
#!/bin/sh
# these aren't environment variables and should be lower-case
rundir=$(dirname "$0")/..
hqapilogdir=$rundir/logs
for h in "$rundir/conf" "$rundir/"*.jar "$rundir/lib/"*.jar; do
[ -e "$h" ] && CLASSPATH=$CLASSPATH:$h
done
# trim any leading colon from the generated CLASSPATH
CLASSPATH=${CLASSPATH#:}
exec java \
-Dhqapi.logDir="$hqapilogdir" \
-cp "$CLASSPATH" \
org.hyperic.hq.hqapi1.tools.Shell "$@"
如果参数仍然被错误解析,则问题出在被调用的 Java 代码内部,而不是包装它的 shell。您可以通过使用 sh -x scriptname ack --id=10 --reason="This is the reason I ack"
运行脚本并观察下面调用的命令来验证这一点。
关于linux - 如何转义 $@ 中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142880/