如何在bash中逐字逐句迭代

时间:2017-06-03 17:24:41

标签: arrays bash for-loop if-statement grep

我有一个简单的脚本,我从文件中搜索单词

words="you are hogan"

for i in $words; do
if grep -q "$i" text.txt; then
        echo "word(s) are exists"
        grep "$i" text.txt
else
        echo "word(s) are not exists"
fi
done

它有效,我可以逐字逐句地制作grep。我的脚本是一样的:

grep "you" text.txt
grep "are" text.txt
grep "hogan" text.txt 

但是,我收到了另一项任务。我想逐字搜索和替换文字。 所以,我应该创建第二个变量,用单词,我应该使用的是来自第一个变量$words的单词。我怎么理解,我应该在一个循环中使用两个变量。我知道,在这种情况下我可以使用数组。 好吧,让我们这样做,我试图制作grep,就像第一个例子:

words="you are hogan"
words2="wwe wwf nukem"

for ((i=0;i<${#words[@]};++i)); do
if grep -q "${words[i]}" text.txt; then
        echo "word(s) are exists"
        echo "${words[i]}"
else
        echo "word(s) are not exists"
fi
done

结果不好。

+ (( i=0 ))
+ (( i<1 ))
+ grep -q 'you are hogan' text.txt
+ echo 'word(s) are not exists'
word(s) are not exists

你怎么看,它试图制作所有的措辞,而不是每个单词。我怎样才能为每个单词执行grep命令,如第一个例子?

1 个答案:

答案 0 :(得分:1)

您的第二种语法是尝试将words视为一个数组,但它是一个字符串。如果你想让它成为一个数组,你可以用不同的方式初始化它:

words=("you" "are" "hogan")
for word in "${words[@]}"; do
    if grep -q "$word" text.txt; then
        printf 'Word exists: %s\n' "$word"
    else
        printf 'Word not found: %s\n' "$word"
    fi
done

或者如果您想要索引,请使用您的方法,以便您可以访问其他字段中的相同索引。