我编写了一个简短的脚本来生成一个格式化的字符串,用于在macintalk中合成音节。我想每20个音节插入一次静音,所以我编写了一个for循环,其中一个计数器存储在一个诱饵文件中,还有一个嵌套的elif语句,该语句应该在计数器达到20个时添加一个静音命令。计数器在达到20之后重新设置。
由于某些原因,我无法预知,只有在条件第一次被发现为真时才会访问elif。换句话说:当计数器第一次到达20时,它插入静默命令,重置并继续循环。当计数器第二次到达20时,elif将不会被访问,并且会继续增长,直到$k达到最大值为止。
有人知道为什么这段代码不能工作吗?
编辑**这是一个稍微长一点的节选,根据流行的请求=)
以下是文件的链接,如果您想要复制的话:phncode.txt cbsyllindx.txt
# Load Syllables
echo ''
echo 'Opening Syllable Transcription for Victoria'
echo ''
syllfile=./syllables_phncode.txt
syllables=$(cat $syllfile)
syllarray=()
counter=0;
# Create Indexed Array of Phonological Code for Syllables
for k in $syllables
do
echo $counter
echo $k
syllarray[counter]=$k
counter=$(($counter + 1));
done
# Load syllable index for stimulus stream
indxfile=./cbsyllindx.txt
indx=$(cat $indxfile)
stream=''
tempfile=count.tmp
echo 0 > $tempfile
echo '====================================================================================='
echo 'Counter Balanced Stimulus Order (Indexed by Syllables in Alphabetical Order)'
echo '====================================================================================='
echo $indx
echo '====================================================================================='
echo ''
echo 'Creating counterbalanced stimulus stream string with proper Macintalk formatting'
echo ''
for k in $indx
do
counter=$[$(cat $tempfile) + 1]
echo $counter > $tempfile
if [ $k -eq 0 ]; then
stream=$stream'@_'${syllarray[k]}
elif [ $counter -eq 20 ]; then
echo Adding Silence after syllable: ${syllarray[k]}
stream=$stream'_'${syllarray[k]}'[[ slnc 20 ]]'
echo 0 > $tempfile
else
stream=$stream'_'${syllarray[k]}
fi
done
unlink $tempfile
echo '------------------------------------------------------'
echo 'Printing Stream to Screen'
echo '------------------------------------------------------'
echo $stream下面是由这个脚本创建的字符串:
_tUW_dAE_rOW_pIY_gOW_lAE@_bIY_kUW_tIY_tUW_dAE_rOW_pIY_gOW_lAE_bUW_dOW_pAE_pIY_gOW[slnc20]_lAE@_bIY_kUW_tIY_tUW_dAE_rOW_bUW_dOW_pAE@_bIY_kUW_tIY_pIY_gOW_lAE_bUW_dOW_pAE@_bIY_kUW_tIY_pIY_gOW_lAE_tUW_dAE_rOW@_bIY_kUW_tIY_bUW_dOW_pAE_pIY_gOW_lAE_tUW_dAE_rOW_bUW_dOW_pAE_tUW_dAE_rOW@_bIY_kUW_tIY_bUW_dOW_pAE_pIY_gOW_lAE@_bIY_kUW_tIY_tUW_dAE_rOW_pIY_gOW_lAE_bUW_dOW_pAE@_bIY_kUW_tIY_pIY_gOW_lAE_tUW_dAE_rOW@_bIY_kUW_tIY_pIY_gOW_lAE_tUW_dAE_rOW@_bIY_kUW_tIY_bUW_dOW_pAE_pIY_gOW_lAE_bUW_dOW_pAE@_bIY_kUW_tIY_tUW_dAE_rOW_bUW_dOW_pAE_pIY_gOW_lAE@_bIY_kUW_tIY_bUW_dOW_pAE_tUW_dAE_rOW_bUW_dOW_pAE_tUW_dAE_rOW_bUW_dOW_pAE@_bIY_kUW_tIY_pIY_gOW_lAE_bUW_dOW_pAE@_bIY_kUW_tIY_tUW_dAE_rOW@_bIY_kUW_tIY_tUW_dAE_rOW_pIY_gOW_lAE_tUW_dAE_rOW_bUW_dOW_pAE_pIY_gOW_lAE@_bIY_kUW_tIY_bUW_dOW_pAE_tUW_dAE_rOW_pIY_gOW_lAE@_bIY_kUW_tIY_pIY_gOW_lAE_bUW_dOW_pAE_tUW_dAE_rOW@_bIY_kUW_tIY_bUW_dOW_pAE_pIY_gOW_lAE_tUW_dAE_rOW_pIY_gOW_lAE_bUW_dOW_pAE_tUW_dAE_rOW@_bIY_kUW_tIY_pIY_gOW_lAE_tUW_dAE_rOW@_bIY_kUW_tIY_pIY_gOW_lAE_tUW_dAE_rOW_bUW_dOW_pAE@_bIY_kUW_tIY_bUW_dOW_pAE_pIY_gOW_lAE@_bIY_kUW_tIY_bUW_dOW_pAE@_bIY_kUW_tIY_tUW_dAE_rOW_bUW_dOW_pAE_tUW_dAE_rOW_pIY_gOW_lAE@_bIY_kUW_tIY_tUW_dAE_rOW_pIY_gOW_lAE_bUW_dOW_pAE
发布于 2015-08-03 01:40:27
您的问题是,当$k -eq 0等于20时,就直接执行20检查,但是无论如何,您还是要增加计数器,然后一旦通过了20,就再也打不到它了。
通过将set -x添加到脚本的顶部并运行它并查看输出,您可以看到这一点。
对于不相关的检查,您不希望它出现这个问题。
你可能想要更像这样的东西作为你循环的主体。
if [ $k -eq 0 ]; then
stream=${stream}@
fi
stream=${stream}_${syllarray[k]}
if [ $counter -eq 20 ]; then
stream=$stream'[[ slnc 20 ]]'
fi这就把问题分开了。
您也(如注释中所示)根本不需要这里的tempfile。(除了处理读取不计文件的子shell之外,您没有其他任何子shell。)
您还可以通过使用$(cat file)来避免$(< file)子subshells。
您还应该始终使用$((...))而不是$[...]。
https://stackoverflow.com/questions/31777232
复制相似问题