我正在我的客户端上运行命令,该命令将信息发送到我的服务器:
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 "$@"
根据我的理解,$@
符号从命令行引入参数,所以我猜这是我的问题所在。 有没有办法在我的命令行参数中转义空格? $ @我的问题出在哪里?
答案 0 :(得分:3)
"$@"
将参数保持在一起,而不是通过字符串拆分。
您可以自己轻松地测试一下:
#!/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"
运行脚本并观察下面调用的命令来验证这一点。