0

请在下面找到简化的 bash 脚本 parseArg.sh:-

#!/usr/bin/env bash

function parse(){

    local propsFile=$1


    echo "search file is : >$propsFile<"

    while IFS='=' read -r packageKey packageValue;
    do


        echo "package value is >$packageValue<"

        packageProcessor $packageValue

        echo "---------------------------------------------------------"
    done < "$propsFile"
}

function packageProcessor(){
    echo "Total args : $#"
    echo "All args value : >$@<"
    for arg in "$@"
    do
        echo "$arg"
    done
}

$@

以下是同一目录中的配置文件 repos.conf :-

cm5-centos6.6="https://archive.cloudera.com/cm5/redhat/6/x86_64/cm/5/ cm5-centos6.6 cm5/centos6.6 cm5/centos6.6 cm5-centos_6_6 "Cdh 5 for CentOS 6.6""

当我在同一目录中执行以下命令时:-

sh parseArg.sh 解析 repos.conf

我期待 6 个参数,但它总共提供了 10 个参数。以下是实际输出:-

search file is : >repos.conf<
package value is >"https://archive.cloudera.com/cm5/redhat/6/x86_64/cm/5/ cm5-centos6.6 cm5/centos6.6 cm5/centos6.6 cm5-centos_6_6 "Cdh 5 for CentOS 6.6""<
Total args : 10
All args value : >"https://archive.cloudera.com/cm5/redhat/6/x86_64/cm/5/ cm5-centos6.6 cm5/centos6.6 cm5/centos6.6 cm5-centos_6_6 "Cdh 5 for CentOS 6.6""<
"https://archive.cloudera.com/cm5/redhat/6/x86_64/cm/5/
cm5-centos6.6
cm5/centos6.6
cm5/centos6.6
cm5-centos_6_6
"Cdh
5
for
CentOS
6.6""
---------------------------------------------------------
4

1 回答 1

0

parse函数中,变量packageValue将包含一个带有值的字符串:

"https://archive.cloudera.com/cm5/redhat/6/x86_64/cm/5/ cm5-centos6.6 cm5/centos6.6 cm5/centos6.6 cm5-centos_6_6 "Cdh 5 for CentOS 6.6""

前导和尾随引号出现在变量的值中。该字符串中的引号是纯字符。

将其解析为 6 个独立组件的唯一可行方法是使用eval强制 shell 尊重“内部”引号。首先,您必须去除前导引号和尾随引号:

    tmp=${packageValue#\"}
    packageValue=${tmp%\"}
    packageProcessor "$packageValue"

然后,在packageProcessor函数中,您将不得不使用eval将字符串分配为数组,但您需要暂时禁用文件名生成:您想利用分词,但不受路径扩展的影响。

set -f
eval "elements=($1)"
set +f

现在你可以

declare -p elements
for arg in "${elements[@]}"; do echo "$arg"; done

说了这么多,还是别做了。这本质上是不安全的。使用不会让您遇到不安全的调用的数据存储格式,eval以拆分您的数据。

如果您完全控制该配置文件的内容,请使用 shell 语法使其成为您可以获取的脚本:

declare -a cm5_centos_6_6=(https://archive.cloudera.com/cm5/redhat/6/x86_64/cm/5/ cm5-centos6.6 cm5/centos6.6 cm5/centos6.6 cm5-centos_6_6 "Cdh 5 for CentOS 6.6")
于 2018-10-07T13:49:41.943 回答