我正在尝试阅读并显示文本文件中的每个单词,然后突出显示指定的元音或辅音。
当我从文件中读取时,我只能读取整行,所以我使用循环来读取行中的每个单词。但是,当我这样做时,我无法访问该单词中的不同位置。 (例如,如果单词是"快乐"我无法访问第二个位置的字母" a")
#READS EACH LINE
while read line
do
#READS EACH WORD IN THE LINE
for word in $line
do
#LOOPS THROUGH EACH CHARACTER IN THE WORD
for (( i=0; i<${#word}; i++ ))
do
#LOOPS THROUGH ALL VALUES IN VOWEL ARRAY
for (( j=0; j<10; j++ ))
do
#MATCHES IF A VOWEL IS FOUND
if [ "${word[$i]}" == "${varray[$j]}" ]
then
let vcount++
echo i:$i j:$j
echo word: ${word[$i]} varray: ${varray[$j]} #DEBUG
fi
done
done
#MORE CODE HERE DOING STUFF PRINTING TO SCREEN
done
done < $file
我做错了吗? 或者我应该以不同的方式阅读文件以访问该单词的每个字符?
当我echo
双for loop
中的单词时,它会将整个单词显示为第一个位置,而不仅仅是第一个字符。而其他职位2,3等都是空的。
答案 0 :(得分:0)
您似乎混淆了数组索引与获取字符串的子字符串(“substringing”,如果您愿意)。这些是我熟悉的每种编程语言中完全不同的操作。在bash中,数组索引是使用${arr[index]}
形式的变量替换完成的。你需要的是${str:index:length}
形式的变量替换,它做了子串。以下是如何使用它来使脚本工作:
#!/bin/bash
file='file';
varray='aeiouy';
#READS EACH LINE
while read line; do
#READS EACH WORD IN THE LINE
for word in $line; do
#LOOPS THROUGH EACH CHARACTER IN THE WORD
for (( i=0; i<${#word}; i++ )); do
#LOOPS THROUGH ALL VALUES IN VOWEL ARRAY
for (( j=0; j<${#varray}; j++ )); do
#MATCHES IF A VOWEL IS FOUND
wordChar="${word:$i:1}";
vChar="${varray:$j:1}";
if [[ "$wordChar" == "$vChar" ]]; then
let vcount++;
echo "i:$i j:$j";
echo "wordChar: $wordChar vChar: $vChar";
fi;
done;
done;
done;
#MORE CODE HERE DOING STUFF PRINTING TO SCREEN
done <$file;
exit 0;
演示:
cat file;
## abc def ghi
## jkl mno pqr
./script;
## i:0 j:0
## wordChar: a vChar: a
## i:1 j:1
## wordChar: e vChar: e
## i:2 j:2
## wordChar: i vChar: i
## i:2 j:3
## wordChar: o vChar: o
其他说明:
read line
命令会丢失前导和尾随空格。这对你的脚本来说并不重要,但是如果你想解决这个问题,你可以自己调用read
,并将整行(包括前导和尾随空格)读入$REPLY
变量默认情况下。j
从0迭代到9,但最大值取决于varray
的长度(实际上是一个字符串;应该重命名),所以你应该使用{ {1}}作为最大值${#varray}
进行表达式评估,而不是旧的[[ ... ]]
表单;较新的形式稍微强大一些。