与原始文本值相比,如何让bash在使用变量时遵循相同的索引分配规则?

与原始文本值相比,如何让bash在使用变量时遵循相同的索引分配规则?,bash,Bash,使用apache CLF日志条目并循环遍历其索引,如下所示: r=(8.8.8.8 - - [06/Sep/2016:12:26:49 -0700] "GET /index.html HTTP/1.1" 200 27127 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko") for i in ${!r[@]} do echo ${r[$i]} done 生成以下输出。因此,不仅我们的报价

使用apache CLF日志条目并循环遍历其索引,如下所示:

r=(8.8.8.8 - - [06/Sep/2016:12:26:49 -0700] "GET /index.html HTTP/1.1" 200 27127 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")

for i in ${!r[@]}
do
   echo ${r[$i]}
done
生成以下输出。因此,不仅我们的报价部分保持在一起,而且括号内的部分也保持在一起

8.8.8.8
-
-
[06/Sep/2016:12:26:49 -0700]
GET /index.html HTTP/1.1
200
27127
-
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
当循环遍历日志文件中的每一行时,有必要为每一行使用一个变量。以下代码模拟变量的使用:

line='8.8.8.8 - - [06/Sep/2016:12:26:49 -0700] "GET /index.html HTTP/1.1" 200 27127 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"'
r=($line)

for i in ${!r[@]}
do
   echo ${r[$i]}
done
忽略引号和括号:

8.8.8.8
-
-
[06/Sep/2016:12:26:49
-0700]
"GET
/index.html
HTTP/1.1"
200
27127
"-"
"Mozilla/5.0
(Windows
NT
6.1;
WOW64;
Trident/7.0;
rv:11.0)
like
Gecko"
是否可以使用变量,但保持索引分段如第一个示例所示?我没有发现任何选项或语法似乎会影响这种行为

#!/bin/bash

line='8.8.8.8 - - [06/Sep/2016:12:26:49 -0700] "GET /index.html HTTP/1.1" 200 27127 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"'

# Declare -a means create an array
declare -a 'r=('"$line"')'

for i in ${!r[@]}
do
   echo ${r[$i]}
done
输出

8.8.8.8
-
-
[06/Sep/2016:12:26:49 -0700]
GET /index.html HTTP/1.1
200
27127
-
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
查看
manbash
并在
SHELL内置命令
部分中搜索
declare

输出

8.8.8.8
-
-
[06/Sep/2016:12:26:49 -0700]
GET /index.html HTTP/1.1
200
27127
-
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
查看
manbash
并在
SHELL内置命令
部分中搜索
declare


我认为用bash来做这件事不是个好主意。最好编写一个perl或python脚本,我认为用bash来编写不是一个好主意。最好是编写一个perl或python脚本。虽然这样做可以达到效果,但我在bash手册页中找不到任何解释declare语句中引用的影响的细节,这也是实现这一点所必需的。我同意这很难理解。我相信这与列表与字符串上下文有关。看看这里被接受的答案:虽然这达到了效果,但我在bash手册页中找不到任何解释declare语句中引用的影响的见解,这也是为了使其起作用所必需的。我同意这是很难理解的。我相信这与列表与字符串上下文有关。请在此处查看公认的答案: