【发布时间】:2015-10-24 23:11:31
【问题描述】:
我编写了一个简短的脚本来生成格式化字符串,用于在 macintalk 中进行音节合成。我想每 20 个音节插入一个静默,所以我编写了一个 for 循环,其中一个计数器存储在一个临时文件中,一个嵌套的 elif 语句应该在每次计数器达到 20 时添加一个静默命令。然后计数器在达到后重置20.
由于某种原因,我无法预测,只有在第一次发现条件为真时才访问 elif。换句话说:计数器第一次达到 20 时,它会插入静音命令,重置并继续循环。计数器第二次达到 20 时,elif 不会被访问,并且会继续增长,直到 $k 达到它的最大值。
有人知道为什么这段代码不起作用吗?
编辑**这里是根据受欢迎的要求稍长的摘录=)
如果您想尝试重现,这里是文件的链接: syllables_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]] EM> _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_l AE_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 P>
【问题讨论】:
-
有什么理由不只是将计数器保存在内存中并在那里修改它,而不是在每次循环迭代时从临时文件中写入和读取它?
-
我一开始是这样尝试的,我得到了相同的结果。我在堆栈交换上读到,如果调用了一个子shell,那么拥有一个临时文件很有用,所以我绝望地尝试了。
-
对不起,如果很明显,但我看不出如何获得你得到的输出。我假设输出在变量 stream 中。您对 indx 和 syllarray 使用了哪些值?
-
感谢 David,是的 stream 是通过按 indx 指定的顺序连接 syllarray 中的音节创建的输出 -- syllarray 从带有以下字符串的文本文件中读取: bIY bUW dAE dOW gOW kUW lAE pAE pIY rOW tIY tUW; indx 是从一个包含 298 个数字的文件中读取的,这些数字指示接下来将哪些音节连接到流中,这给了我在上面帖子中看到的顺序的 298 个音节
-
当然!我试图使帖子尽可能简短,但我可以添加所有内容^_^
标签: bash for-loop counter conditional-statements