首页
学习
活动
专区
圈层
工具
发布

中断:
EN

Stack Overflow用户
提问于 2015-08-02 22:25:12
回答 1查看 215关注 0票数 3

我编写了一个简短的脚本来生成一个格式化的字符串,用于在macintalk中合成音节。我想每20个音节插入一次静音,所以我编写了一个for循环,其中一个计数器存储在一个诱饵文件中,还有一个嵌套的elif语句,该语句应该在计数器达到20个时添加一个静音命令。计数器在达到20之后重新设置。

由于某些原因,我无法预知,只有在条件第一次被发现为真时才会访问elif。换句话说:当计数器第一次到达20时,它插入静默命令,重置并继续循环。当计数器第二次到达20时,elif将不会被访问,并且会继续增长,直到$k达到最大值为止。

有人知道为什么这段代码不能工作吗?

编辑**这是一个稍微长一点的节选,根据流行的请求=)

以下是文件的链接,如果您想要复制的话:phncode.txt cbsyllindx.txt

代码语言:javascript
复制
# 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-03 01:40:27

您的问题是,当$k -eq 0等于20时,就直接执行20检查,但是无论如何,您还是要增加计数器,然后一旦通过了20,就再也打不到它了。

通过将set -x添加到脚本的顶部并运行它并查看输出,您可以看到这一点。

对于不相关的检查,您不希望它出现这个问题。

你可能想要更像这样的东西作为你循环的主体。

代码语言:javascript
复制
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。

您还应该始终使用$((...))而不是$[...]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31777232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档