我在编写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
答案 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。