有没有办法在shell脚本中正确传递带引号和空格的字符串作为参数

时间:2012-07-03 15:42:13

标签: shell sh

描述非常抽象,实际上我正在尝试将params传递给RPM .spec文件中的%configure宏。但行为是一样的。

使用sh -x的脚本:

#! /bin/sh

VAR1=" \
--enable-modules=dir so com \
--disable-userdir"

./configure $VAR1

给了我:

+./configure --enable-modules=dir so com --disable-userdir

我需要的是:

+./configure --enable-modules='dir so com' --disable-userdir

问题:有没有办法正确传递引号和空格?在'dir so com' $VAR1周围放置引号会破坏所有字符串。 $“”什么都不做,qoutes引用最近的字符组没有空格等等。我几乎尝试了所有东西。

修改

请先尝试推荐一下。如果这很简单就不会有问题。我并不是说回声,我需要将它传递给宏/外部脚本。 Sed / cat的化学反应是可以接受的,但是我不能直接通过'反引号'或./configure来调用rpmbuild,而VAR1=" \ --enable-modules=dir so com \ --disable-userdir" 用一些额外的参数调用它。没有qoutes传递params工作正常。

$ sh -x test.sh
+ VAR1=' --enable-modules="dir so com" --disable-dir --disable-actions --disable-userdir'
+ ./configure '--enable-modules="dir' so 'com"' --disable-dir --disable-actions --disable-userdir`

确实

{{1}}

3 个答案:

答案 0 :(得分:2)

你可以在报价中逃脱你的'报价',就像这样

#!/bin/sh

VAR1=" \
--enable-modules=\"dir so com\" \
--disable-userdir"

echo $VAR1

答案 1 :(得分:2)

不,我很害怕。在./configure $VAR1中,变量$VAR1将在IFS字符处拆分,并产生零个或多个字。这意味着在IFS字符处拆分严格。引用/转义识别在变量扩展之前发生,这意味着作为变量值的一部分的引号或转义没有任何影响(它们代表它们自己)。太晚了,跑吧!

你可以做的事情就像是

set -- "--enable-modules=dir so com" --disable-userdir
./configure "$@"

会覆盖您的位置参数,因此$1$2--后面的两个参数,然后使用"$@",这会扩展回到那两个参数词语的

你也可以使用bash数组而不是滥用集合数组(我知道sh只有一个全局数组)但是我得到的印象是你能够保留一些味道并且不想使用bash。

您也可以执行类似

的操作
VAR1="--enable-modules=dir so com%--disable-userdir"
OLDIFS=$IFS
IFS=%
./configure $VAR1
IFS=$OLDIFS

但是,是的。

答案 2 :(得分:0)

选择以下任一策略。

替换位置参数

启动替换位置参数的子shell,并使用特殊扩展"$@"启动程序。

(set -- "--enable-modules=dir so com" --disable-userdir; ./configure "$@")

使用IFS的特殊值

选择一个没有你的论点的角色,假设|会这样做。现在准备你的参数向量,用|分割每个参数并相应地启动你的脚本:

 configure_argv="--enable-modules=dir so com|--disable-userdir"
 IFS='|' ./configure $configure_argv

使用xargs

回想一下,xargs可以在字符\000处拆分参数。这给了

 configure_argv()
 {
     printf '--enable-modules=dir so com\000'
     printf '--disable-userdir\000'
 }
 configure_argv | xargs -0 ./configure