Bash问题与字符串比较

时间:2015-05-18 05:22:22

标签: bash

我在编写bash脚本时遇到问题。问题在于比较字符串。当我启动它时,没有错误。但结果是,它始终更改变量客户端。 因此,举例来说,我们在文件中有两行

apple A
orange D

如果我给who=A我希望在结果中看到苹果,或者如果在D - 橙色

但无论我选择A还是D,它总是给我结果 - 橙色

无论字符串如何,它总是会更改变量客户端,就像忽略比较一样。请帮忙。

while read line
do
    IFS=" "
    set -- $line
    echo $2" "$who":"$1
    if [[ "$2"="$who" ]]
    then
        echo "change"
        client=$1
    fi
done < $file

echo $client

所以现在我改变了代码,如下面的评论之一,但现在caparison总是假,因此变量客户端总是空的

    while read -r line
do
    #IFS=" "
    #set -- $line
    #echo $2" "$who":"$1
    #if [[ "$2" = "$who" ]]
    a="${line% *}"
    l="${line#* }"
    if [[ "$l" == "$who" ]]
    then
        echo "hi"
        client="$a"
    fi
done < $file

3 个答案:

答案 0 :(得分:1)

if [[ "$2"="$who" ]]更改为

if [[ "$2" = "$who" ]]

=

周围的空格

示例(澄清):

who=A
while read line
do

    IFS=" "
    set -- $line
    echo $2" "$who":"$1
    if [[ "$2" = "$who" ]]
    then
        echo "change"
        client=$1
    fi
done < file #this is the file I used for testing

echo $client

输出:

A A:apple
change
D A:orange
apple

who=D

A D:apple
D D:orange
change
orange

答案 1 :(得分:1)

如果文件中的数据包含apple D这样的每一行,并且您想要读取文件并将项目分开,则参数扩展/子字符串提取是正确的处理方式这条线。例如(注意 $who取自您的问题陈述):

while read -r line
do
    fruit="${line% *}"       # remove from end to space
    letter="${line#* }"      # remove from start to space
    if [[ "$letter" == "$who" ]]
    then
        echo "change"
        client="$fruit"
    fi
done < $file

简短示例

以下是使用参数扩展/子字符串提取分割单词的快速示例:

#!/bin/bash

while read -r line
do
    fruit="${line% *}"
    letter="${line#* }"
    echo "fruit: $fruit  letter: $letter"
done

exit 0

<强>输入

$ cat dat/apple.txt
Apple A
Orange D

<强>输出

$ bash apple.sh <dat/apple.txt
fruit: Apple  letter: A
fruit: Orange  letter: D

答案 2 :(得分:0)

您需要=运算符周围的空格。

但是,我认为您正面临另一个问题,因为您正在尝试从client循环(在子shell中执行)中更改while变量的值。我认为这不会起作用;有关详细信息,请参阅this quesion