1

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

使用这样的脚本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调用,因为它本身带有一些额外的参数。在没有 qoutes 的情况下传递参数可以正常工作。

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

做:

$ 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`
4

3 回答 3

2

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

你可以做的或者是像

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

这将覆盖您的位置参数,例如$1and$2是 , 之后的两个参数--,然后使用"$@"which 扩展回这两个词。

您也可以使用bash数组而不是滥用 set 数组(据sh我所知只有一个全局数组),但我的印象是您已经能够保留一些品味并且不想使用 bash。

你也可以做类似的事情

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

但是,是的。

于 2012-07-03T17:15:11.390 回答
2

你可以像这样逃避你的'报价中的报价'

#!/bin/sh

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

echo $VAR1
于 2012-07-03T15:47:46.467 回答
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可以在 character 处拆分参数\000。这给

 configure_argv()
 {
     printf '--enable-modules=dir so com\000'
     printf '--disable-userdir\000'
 }
 configure_argv | xargs -0 ./configure
于 2014-09-13T07:41:37.917 回答