将引用作为参数传递给函数

时间:2017-06-02 18:15:55

标签: linux shell sh quoting

我想找出可能非常简单的问题的答案:我想将带有空格的带引号的字符串作为函数的独立参数传递。

以下文件包含数据(例如):

one
two three
four five six
seven

还有2个简单函数的脚本:

params_checker()
{
    local first_row="$1"
    local second_row="$2"
    local third_row="$3"

    echo "Expected args are:${first_row} ; ${second_row} ; ${third_row}"
    echo "All args are:"
    for arg in "$@"; do
        echo "${arg}"
    done
}

read_from_file()
{
    local args_string

    while read line; do
        args_string="${args_string} \"${line}\""
        echo "Read row: ${line}"
    done < ./test_input

    params_checker ${args_string}
}

read_from_file

换句话说,我想从文本文件中获取行作为函数 params_checker 的参数(文件中的每一行作为不同的参数,我需要在行中保留空格)。尝试使用带引号的“substrings”组合字符串失败,输出为:

~/test_sh$ sh test_process.sh 
Read row: one
Read row: two three
Read row: four five six
Read row: seven
Expected args are:"one" ; "two ; three"
All args are:
"one"
"two
three"
"four
five
six"
"seven"

期望是1美元=“一”,2美元=“两三”,3美元=“四五六”...... 在传递给params_checker期间引用$ {args_string}给出了另一个结果,字符串作为单个参数传递。

请你帮忙找出正确的方法,如何通过文件中的空格传递这些字符串作为不同的独立函数论证?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在bash / ksh / zsh中你使用数组。在sh中,您可以使用参数&#34; $ 1&#34;,&#34; $ 2&#34;等:

read_from_file()
{
    set --                   # Clear parameters

    while read line; do
        set -- "$@" "$line"  # Append to the parameters
        echo "Read row: ${line}"
    done < ./test_input

    params_checker "$@"      # Pass all parameters
}

答案 1 :(得分:0)

你去了,这应该给你你想要的东西:

#!/bin/bash
 params_checker()
 {
     local first_row="$1"
     local second_row="$2"
     local third_row="$3"
     local forth_row="$4"

     echo "Expected args are: ${first_row} ; ${second_row} ; ${third_row} ; ${forth_row}"

     echo "All args are:"
     for i in "$@"
     do
         echo "$i"
     done
 }

 read_from_file()
 {
     ARRAY=()
     while read line; do
         echo "Read row: ${line}"
         ARRAY+=("$line")
     done < ./test_input

     params_checker "${ARRAY[@]}"
 }

 read_from_file;

这应该在BASH中运作良好。如果您的文件名为test.sh,则可以像这样运行./test.sh