如何逃避$ @中的空格

时间:2014-10-01 13:44:54

标签: linux shell command-line

我正在我的客户端上运行命令,该命令将信息发送到我的服务器:

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 "$@"

根据我的理解,$@符号从命令行引入参数,所以我猜这是我的问题所在。 有没有办法在我的命令行参数中转义空格? $ @我的问题出在哪里?

1 个答案:

答案 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"运行脚本并观察下面调用的命令来验证这一点。