【问题标题】:Bash problems with string comparison字符串比较的 Bash 问题
【发布时间】:2015-05-18 21:05:09
【问题描述】:

我在编写 bash 脚本时遇到问题。问题在于字符串的比较。当我启动它时,没有错误。然而结果,它总是在改变变量client。 因此,例如,如果我们在文件中有两行

apple A
orange D

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

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

不管是什么字符串,它总是改变变量client,就像忽略比较一样。请帮忙。

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 始终为 false,因此变量 client 始终为空

    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

【问题讨论】:

  • [ ] 中使用不带引号的变量不是一个好主意...不过您可以在[[ ]] 中使用不带引号的变量.. 它可以很好地处理空格
  • [[ "$2"="$who" ]] 是一个始终为真的赋值...
  • 这是我的问题 - 为什么它总是正确的?
  • 因为作业没有失败...
  • 问题解决了吗?谢谢大家

标签: bash


【解决方案1】:

如果您在文件中的每一行都有数据,例如 apple D,并且您想读取文件并分隔各项,则 参数扩展/子字符串提取 是处理该行的正确方法.例如(note $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】:

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

【讨论】:

  • 这应该可以,你确定你的代码没有其他问题吗?在我的情况下它给出了正确的结果..
  • 我改了代码还是不行,看看我在原帖里的编辑代码
  • 您的新代码对我有效,A 的输出是苹果,D 的输出是橙色。您确定没有忘记在代码中输入who=Awho=D?我在您的代码中没有看到该分配...
  • 是的,我发现参数有误,感谢您的帮助
【解决方案3】:

= 运算符周围确实需要空格。

但是,我认为您在尝试从while 循环(在子shell 中执行)内部更改client 变量的值时遇到了另一个问题。我认为这行不通。详情请见this quesion

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2015-08-30
    • 2012-03-02
    • 1970-01-01
    • 2019-05-04
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多