for i in "${ARR[@]}"
do
eval CMD=`echo "$i" | awk -F'\t' '{print $1}'`
STDOUT=`echo "$i" | awk -F'\t' '{print $2}'`
$CMD > $STDOUT
if [ $? -ne 0 ]
then
#エラーハンドリング1
elif [ -z $STDOUT ]
then
#エラーハンドリング2
fi
done
+ CMDS[0]=ls -lRa
test.sh: CMDS[0]=ls -lRa: not found
+ LOGS[0]=r . …タブ×5… ls
test.sh: LOGS[0]=r .^I^I^I^I^Ils: not found
test.sh: bad substitution
また、『UNIXシェルスクリプト逆引き大全333の極意』という本に、
「“\”付きファイルからreadに読み込ませる場合は“read -r”とする必要がある」
というようなことが書いてありました。
IFSは読み込ませるファイルではありませんが、ものは試しと、
−−−−−−−−−−−−−−−−−−−−
READ=/usr/xpg4/bin/read
IFS=$'\t' # IFS="\t"でも同じ結果だった
while ${READ} -r CMD LOG; do
−−−−−−−−−−−−−−−−−−−−
としたところ、今度は、
+ /usr/xpg4/bin/read -r CMD LOG
+ echo
+ CMDS[0]=
test.sh: CMDS[0]=: not found
+ echo
+ LOGS[0]=
test.sh: LOGS[0]=: not found
test.sh: bad substitution
while [ $i -lt 3 ]; do
arr[$i]=`echo "$cmd"_"$i"`
i=`expr $i + 1`
echo $arr[i] "in the loop"
done
echo $arr[0] "out of the loop"
echo $arr[1] "out of the loop"
echo $arr[2] "out of the loop"
echo $arr[3] "out of the loop"
exit 0
−−−−−−−−−−−−−−−−−−−−
配列への代入箇所で
test2.sh: arr[0]=aaa_0: not found
にはなりますが、落ちはしませんでした。
そこで、ヒアドキュメントをCSVに戻し、
IFS=$','
でやってみたところ、なんと!!
ちゃんと、
test.sh: CMDS[0]=ls -lRatr .: not found
test.sh: LOGS[0]=ls: not found
と入った
(“not found”は問題ではないことは、test2.shで判明している)
のに
test.sh: bad substitution
となって落ちたのです!!
(納品物は配列は使ってない)
−−−−−−−−−−/bin/sh -vxで見たループ中の結果(部分)−−−−−−−−−−
+ CMDS[2]=/usr/xpg4/bin/id -p
test.sh: CMDS[2]=/usr/xpg4/bin/id -p: not found
+ LOGS[2]=id
test.sh: LOGS[2]=id: not found
while read CMD STDOUT
do
if [ -z ${CMD} ]
then
ERRORMSG="ERROR: null CMD in ${CMD};${STDOUT}"
ERROR
elif [ -z ${STDOUT} ]
ERRORMSG="ERROR: null STDOUT in ${CMD};${STDOUT}"
ERROR
else
eval "${CMD} > ${STDOUT}"
RET=$?
if [ ${RET} -ne 0 ]
then
ERRORMSG="ERROR: ${CMD} return ${RET}"
ERROR
elif [ ! -s ${STDOUT} ]
then
ERRORMSG="ERROR: ${STDOUT} is zero byte."
ERROR
fi
fi
done