描述非常抽象,实际上我正在尝试将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}}
答案 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 "$@")
选择一个没有你的论点的角色,假设|
会这样做。现在准备你的参数向量,用|
分割每个参数并相应地启动你的脚本:
configure_argv="--enable-modules=dir so com|--disable-userdir"
IFS='|' ./configure $configure_argv
回想一下,xargs
可以在字符\000
处拆分参数。这给了
configure_argv()
{
printf '--enable-modules=dir so com\000'
printf '--disable-userdir\000'
}
configure_argv | xargs -0 ./configure