【问题标题】:Bash function parameter assignment to read a file (list) and write a file (array)bash函数参数赋值读取文件(列表)和写入文件(数组)
【发布时间】:2013-10-21 00:06:33
【问题描述】:

我正在尝试编写一个 bash 函数,我可以从大量脚本中定期调用。我想向这个函数传递一个包含纯文本字符串列表的文件的名称:

blue
red
green

... 并让函数以 bash 兼容的数组格式将这些字符串写入不同的文件(其名称也作为参数传递给函数):

[Bb]lue [Rr]ed [Gg]reen

我无法让函数(内部)识别正在传递的输出文件的名称。它会抛出一个“不明确的重定向”错误,然后抛出一堆“没有这样的文件或目录”错误。但是,它正在处理输入文件。问题似乎是我如何将参数分配给函数中的本地字符串。不幸的是,我已经多次更改函数中的loc_out= 行,以至于我无法再回忆起我尝试过的所有表单。希望这个例子很清楚,如果不是最好的做法:

process_list () {
    # assign input file name to local string
    loc_in=(${1});
    # assign output file name to local string
    loc_out=($(<${2})); # this is not right
    while read line
    do
        echo "loc_out before: $loc_out";
        echo "loc_in term: $line"; 
        item_length=${#line};
        # loop until end of string
        for (( i=0; i<$item_length; i++ )); 
        do 
            echo "char $i of $line: ${line:$i:1}"; 
            # write out opening bracket and capital
            if [ ${i} -eq 0 ]; then
                echo -e "[" >> $loc_out;
                echo -e ${line:$i:1} | tr '[:lower:]' '[:upper:]' >> "${loc_out}";
            fi;
            # write out current letter
            echo -e ${line:$i:1} >> "${loc_out}";
            # write out closing bracket
            if [ ${i} -eq 0 ]; then
                echo -e "]" >> "${loc_out}";
            fi;
        done;    
        # write out trailing space
        echo -e " " >> "${loc_out}";
        # check the output file
        echo "loc_out after: ${loc_out}";
    done < $loc_in;
}
f_in="/path/to/colour_list.txt";
f_out="/path/to/colour_array.txt";
echo "loc_in (outside function): ${loc_in}";
echo "loc_out (outside function): ${loc_out}";
process_list $f_in $f_out;

对于我做错的任何帮助将不胜感激。

【问题讨论】:

  • $(&lt;${2}) 假设 $2 是一个文件名,这表示打开文件并将文件的所有内容放在你的 shell 脚本中。我不认为那是你想要做的。祝你好运。
  • 谢谢@shellter。我对最初在函数头部分配文件句柄和后来在函数底部附近回显该文件的内容感到困惑。倒数第二个函数行应为echo "loc_out after: $(&lt;${loc_out})";

标签: bash function parameter-passing filenames


【解决方案1】:

变化:

loc_out=($(<${2})); # this is not right

到这里:

loc_out=(${2}); # this should be right

您只希望在该行中包含文件名。

希望这能解决您的问题。

编辑:

除了你可以/应该这样写:

loc_in=${1};
loc_out=${2};

据我所知,您不需要括号。

【讨论】:

  • 谢谢。我确定我试过了,但显然没有。在我的示例中还有一些其他错误是我在玩弄它时明显引入的,即echo 重定向到$loc_out 应该使用-ne 而不是-e,并且开放方括号回显应该有"${loc_out}" .
猜你喜欢
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2014-08-19
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多