linux - 如何转义 $@ 中的空格

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

据我所知,$@ 符号从命令行引入参数,所以我猜这就是我的问题所在。 有没有办法转义我的命令行参数中的空格? $@ 是我的问题所在吗?

最佳答案

"$@" 确实将参数放在一起,而不通过字符串拆分。

你可以自己简单地测试一下:

#!/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/

相关文章:

c - pthread_create在主线程设置sched_deadline调度策略时返回EAGAIN

command-line - 从命令行关闭 acrobat reader 实例

Linux备份文件命令

windows - Sox --多线程选项 : Split stereo wav file to 2 mono files Windows Line command

java - 从命令行运行maven+eclipse

c++ - linux获取当前目录下文件信息的方法

linux - 在 ssh 命令中使用远程服务器的环境变量

c - fread()、solaris 到 unix 的可移植性和未初始化值的使用

linux - 如何通过 Linux shell 学习你的方式

linux - 无法建立 ssh 连接无密码运行 PVM 代码