使用嵌套循环(嵌套时)

问题描述 投票:-3回答:2

我有一个代码,这个代码的目标是,如果你的输入匹配我的数据库中的一个单词,它将打印句子中的第二个,这是第一个单词的翻译。

问题是这个代码打印数据库中的所有第二个单词。如果你能纠正我,我将非常感激。这是我的代码:

cari=$(zenity --entry "Masukan Kata Yang Ingin Anda Cari:")
IFS=" " read -ra field <<< $cari
b=(`cat Kamus2.txt | awk '{print $1}'`)
d=(`cat Kamus2.txt | awk '{print $2}'`)
for item2 in ${d[*]}
do
    for item1 in ${field[*]}
    do
        for item in ${b[*]}
        do
            test  "$item1" = "$item" && { echo -n "$item2 "; }
        done
    done
done
echo " " 

例如数据库:

Aku I
Ingin Want
Roti Bread
Makan Eat

我想要的输出例如:如果我输入Aku Ingin Makan,输出将是I Want Eat

非常感谢你的时间和耐心

bash
2个回答
2
投票

这是Bash,而不是C.使用单个相等标记进行字符串相等比较:

test "$item1" = "$item" && ...
              ^

来自Bash的help test

STRING1 = STRING2

如果字符串相等则为True。


您正在循环遍历所有三个数组,而它们之间没有任何相关性。你应该使用相同的bd索引:

for item in ${field[@]}
do
  for ((i = 0; i < ${#b[@]}; i++))
  do
    if test "$item" = "${b[$i]}"
    then
        echo "${d[$i]}"
    fi
  done
done

如果要将所有输出放在一行上,请为-n使用选项echo

echo -n "${d[$i]} "

0
投票

你可以在这个链接上阅读我在bash中关于字符串比较的答案:

Why "[ 1 > 2 ]" evaluates to True?

更特别是这部分:

字符串比较

=等于

if [ "$a" = "$b" ]

警告 注意框架=的空白。

if [ "$a"="$b" ] is not equivalent to the above.

==等于

if [ "$a" == "$b" ]

这是=的同义词。

Note    
The == comparison operator behaves differently within a double-brackets test than within single brackets.
[[ $a == z* ]]   # True if $a starts with an "z" (pattern matching).
[[ $a == "z*" ]] # True if $a is equal to z* (literal matching).

[ $a == z* ]     # File globbing and word splitting take place.
[ "$a" == "z*" ] # True if $a is equal to z* (literal matching).

!=不等于

if [ "$a" != "$b" ]
© www.soinside.com 2019 - 2024. All rights reserved.