2014-09-05 70 views
1

我有这个输入文件庆典与阵列双引号行为的值

first line 
second line 
wow! something 
the last line 

我填与线的阵列与“行”字白衣这个脚本

#!/bin/bash 

IFS_backup=$IFS 
IFS=$'\n' 
lines=($(grep "line" "$1")) 
IFS=IFS_backup 

i=0 
for line in "${lines[@]}" 
do 
    echo $line 
    echo "$line" 
done 

我得到这个输出

first line 
first line 
se ond line 
second line 
the l st line 
the last line 

这里发生了什么?我认为引号会将单词限制在一个范围内,从而创建一个字符串。这里缺少的报价导致丢失随机字符...

谢谢!

注意:我知道还有其他方法用文件行填充数组。顺便说一句,这只是一个例子;我的实际数组以更棘手的方式填充,但引号行为是相同的。我想知道为什么这个脚本有被冷落的行为。

+4

使用'IFS = “$ IFS_backup”'(注意'$') – jm666 2014-09-05 08:24:31

+0

哎呀...感谢我的斑点(哑)错误。那么,除了功能之外,当IFS错误时会发生什么? – 2014-09-05 08:32:11

+0

'IFS_backup'中的单个字符充当'IFS'。所以'echo second line'被视为'echo'se“”ond line“',而不是你的期望 - 'echo”second“”line“'。 – anishsane 2014-09-05 08:36:20

回答

2

您的IFS值错误。您需要

IFS="$IFS_backup" 

,而不是

IFS=IFS_backup 
你的情况

,字段分隔符包含的字符IFS_backup

演示:

lines=($(seq 1020 1080)) 
IFS='246' # <-- the input field separator now any of the characters 2 or 4 or 6 
for line in "${lines[@]}" 
do 
    echo $line 
done 

打印

10 0 
10 1 
10 
10 3 
10 
10 5 
10 
10 7 
10 8 
10 9 
1030 
1031 
103 
1033 
103 
1035 
103 
1037 
1038 
1039 
10 0 
10 1 
10 
10 3 
10 
10 5 
10 
10 7 
10 8 
10 9 
1050 
1051 
105 
1053 
105 
1055 
105 
1057 
1058 
1059 
10 0 
10 1 
10 
10 3 
10 
10 5 
10 
10 7 
10 8 
10 9 
1070 
1071 
107 
1073 
107 
1075 
107 
1077 
1078 
1079 
1080 

甚至更​​好的演示

#!/bin/bash 

showargs() { 
    i=0 
    for arg in "[email protected]" 
    do 
     let i++ 
     echo "got arg $i:==$arg==" 
    done 

    i=0 
    for arg in "$*" 
    do 
     let i++ 
     echo "print using the 1st char from IFS - got arg $i:==$arg==" 
    done 
} 

lines=(1233 12469 1469) 
IFS='246' 
for line in "${lines[@]}" 
do 
    echo "============$line==============" 
    showargs $line 
done 

打印

============1233============== 
got arg 1:==1== 
got arg 2:==33== 
print using the 1st char from IFS - got arg 1:==1233== 
============12469============== 
got arg 1:==1== 
got arg 2:==== 
got arg 3:==== 
got arg 4:==9== 
print using the 1st char from IFS - got arg 1:==12229== 
============1469============== 
got arg 1:==1== 
got arg 2:==== 
got arg 3:==9== 
print using the 1st char from IFS - got arg 1:==1229== 
+0

感谢您的详细解答。我自己做了进一步的测试以更好地理解它(请参阅我的问题的评论)。 – 2014-09-05 08:57:52

+0

@il_mix说'谢谢'的首选方式是接受最有用的答案(点击绿色复选标记)以回答您提出的任何问题(这也会增加您的声誉),并通过提供有用的答案(如果你有15+声望)。请阅读[游览],祝你好运。 – jm666 2014-09-05 09:03:35

+0

呃...没有检查“正确答案”,因为我在问题的评论部分通过问答了解了问题。顺便说一句,标记。 – 2014-09-05 09:06:59