以下(嵌套)函数
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 inseq ${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。