如何传递带引号的参数但在linux中有空格

时间:2016-03-27 22:19:19

标签: linux shell awk scripting

我有一个带有这些参数及其值的文件

eureka-client

和另一个像这样配置的文件

# parameters.txt

VAR1 001
VAR2 aaa
VAR3 'Hello World'

当我想在函数中获取值时,我使用此命令

# example.conf

VAR1 = 020
VAR2 = kab
VAR3 = ''

第一个参数抛出正确的值,但最后一个只获得'空白空间的问候,我的问题是如何获得整个'Hello World'值?

2 个答案:

答案 0 :(得分:0)

如果您可以使用bash,则无需使用awk readshell parameter expansion可以合并来解决您的问题

while read -r name rest; do
  # Drop the '= ' part, if present.
  [[ $rest == '= '* ]] && value=${rest:2} || value=$rest
  # $value now contains the line's value,
  # but *including* any enclosing ' chars, if any.
  # Assuming that there are no *embedded* ' chars., you can remove them
  # as follows:
  value=${value//\'/}
done < parameters.txt
默认情况下,

read也会按空格(例如awk)将行划分为字段,但与awk不同,它可以分配余数如果指定了比找到的字段少的变量,则行变为可变,即 last 1; read的{​​{1}}选项通常值得指定,以避免对-r字符的意外解释。在输入中。

至于您的解决方案尝试:

\不知道在输入中引用 - 默认情况下,无论引号如何,它都会按空格分隔输入到字段中。
因此,awk之类的字符串只会分为字段'Hello World''Hello

但是,在您的情况下,您可以使用精心设计的FS值将每个输入行拆分为其键和值(FS是输入字段分隔符,也可以通过选项World'设置;再次命令假设为-F,这次使用的是bash,即所谓的process substitution<(...)ANSI C-quoted string}:

$'...'

再次假设值不包含嵌入式 while IFS= read -r value; do # Work with $value... done < <(awk -F$'^[[:alnum:]]+ (= )?\'?|\'' '{ print $2 }' parameters.txt) 实例。

字段分隔符正则表达式'拆分每一行,以便$'^[[:alnum:]]+ (= )?\'?|\''(第二个字段)包含值,删除封闭的$2字符(如果有)。

' 是标准实用程序中罕见的例外情况,因为它 理解单引号和双引号字符串(但也不支持嵌入式引号)。

因此,您可以利用xargs'能力在将参数传递给指定命令时隐式删除​​封闭引号,默认为xargs(再次假定为echo):< / p>

bash

while read -r name rest; do # Drop the '= ' part, if present. [[ $rest == '= '* ]] && value=${rest:2} || value=$rest # $value now contains the line's value, strippe of any enclosing # single quotes by `xargs`. done < <(xargs -L1 < parameters.txt) 一次处理一行(xargs -L1)行(1),并隐式调用-L以及每行上找到的所有令牌,并删除任何封闭的引号个人代币。

答案 1 :(得分:-1)

awk中的默认字段分隔符是空格。所以你只打印传递给awk的字符串中的第一个单词。

您可以使用-F [field separator]

在命令行上指定字段分隔符

示例,将字段分隔符设置为逗号:

$ echo "Hello World" | awk -F, '{print $1}'      
Hello World