機能する独立したネストされた関数/スクリプトが大きなスクリプト内で機能しないのはなぜですか? [コピー]

機能する独立したネストされた関数/スクリプトが大きなスクリプト内で機能しないのはなぜですか? [コピー]

Next(ネスト)関数

function hpf_matrix {

  # Positional Parameters
  Matrix_Dimension="${1}"
  Center_Cell_Value="${2}"

  # Define the cell value(s)
  function hpf_cell_value {
    if (( "${Row}" == "${Col}" )) && (( "${Col}" == `echo "( ${Matrix_Dimension} + 1 ) / 2" | bc` ))
      then echo "${Center_Cell_Value} "
      else echo "-1 "
    fi
  }

  # Construct the Row for Cols 1 to "Matrix_Dimension"
  function hpf_row {
    for Col in `seq ${Matrix_Dimension}`
      do echo -n "$(hpf_cell_value)"
    done
  }

  # Construct the Matrix
  echo "MATRIX    ${Matrix_Dimension}"
  for Row in `seq ${Matrix_Dimension}`
    do echo "$(hpf_row)"
  done
  echo "DIVISOR   1"
  echo "TYPE      P"
}

スタンドアロンコードとスクリプト内の両方でうまく機能します。hpf_matrix 5 18戻ってくる

MATRIX    5
-1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 
-1 -1 18 -1 -1 
-1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 
DIVISOR   1
TYPE      P

次の要件(さまざまな値を含む)に従って機能します。

Kernel_Size=5
Center_Cell_Default=18 ; Center_Level=Default
eval Center_Cell="Center_Cell_${Center_Level}"

HPF_MATRIX_ASCII=`hpf_matrix ${Kernel_Size} ${!Center_Cell}`
echo "${HPF_MATRIX_ASCII}"

hpf_matrixただし、上記のコードスニペット(関数と提供されている)を変更なしでより"${HPF_MATRIX_ASCII}"大きなbashスクリプトに統合すると、次のメッセージでエラーが発生します。

((: 1
2
3
4
5 == 1
2
3
4
5 : syntax error in expression (error token is "2
3
4
5 == 1
2
3
4
5 ")

小さなアップデート

私が正しく理解したら、その理由が何であれ、

ライン入力の場合seq ${Matrix_Dimension}

そしてライン

Colの場合seq ${Matrix_Dimension}

"1 2 3 4 5"代わりに、次のように印刷してください"1" "2" "3" "4" "5"

この状況に問題があるのでしょうか? 私は明らかに間違っているよりも、関数のネストされた構造を保存したいと思います。

答え1

大規模なスクリプトでは、上記の関数が一部に統合され、hpf_matrix関数が定義される前IFSにに変更されたが、IFS=,使用される前に誤ってリセットされることがありました。引用符なしでコマンドを置き換える機能に!

説明$IFS を設定せずに引用符で囲まれていないコマンド置換 ($(...)) を使用するここで:https://unix.stackexchange.com/a/88259/13011

ここにも解決策があります。https://unix.stackexchange.com/a/92188/13011

関連情報