0

より大きなスクリプト セット内から定期的に呼び出すことができる 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;

私が間違っていることについての支援は大歓迎です。

4

1 に答える 1

0

変化する:

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

これに:

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

その行にはファイル名だけが必要です。

うまくいけば、これで問題が解決します。

編集:

あなたがこれを書くことができる/すべきであることに加えて:

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

私が理解している限り、括弧は必要ありません。

于 2013-10-13T10:17:46.560 に答える