访问字符串数组中的元素 - 杂散@符号

访问字符串数组中的元素 - 杂散@符号

我创建了一个数组(3 个元素),每个元素都包含一个逗号分隔的字符串。该数组是通过逐行读取文件创建的 - 该文件包含从数据库输出的字段。我编写了下面的代码,以便迭代每个字符串元素,就好像它也是一个数组一样。

它可以工作,除了一个奇怪的错误之外,数组中的最后一个元素还有一个附加的 @ 符号

(还声明 -A 不起作用,尽管我已经确定我在我的 mac 上使用 bash 4)

i=0
declare -a items
while read line
    do
        items[i]=$line
    ((i++))
    done < test_file1.txt

declare -a item_arr
for item in "${items[@]}"
   do
     item_arr=($item[@])
   done
echo "${item_arr[4]}://${item_arr[1]}:${item_arr[3]}@${item_arr[2]}/control/configinfo"

输出为: https[@]://192.168.1.152:username@pwd/control/configinfo

为什么打印出@符号?我是在浪费时间吗,我应该使用 awk 吗?否则,这感觉是一种相当简单的方法,但这可能是因为我相对缺乏经验。我可能需要初始化的最多项目可能是 1 到 200。

我的代码的目的是创建一个curl请求来获取一些config_info,用户名、密码、IP地址、协议都是从数据库中提取的,以便为每个项目构建一个curl请求。

提前致谢!

答案1

item是一个标量字符串变量(不是数组),所以你应该说

item_arr=($item)

而不是

item_arr=($item[@])

如果$itemThe quick brown fox,那么

item_arr=($item[@])

变成

item_arr=(The quick brown fox[@])

答案2

你是对的,awk 会更容易。

源示例/tmp/test2.txt:

$ cat /tmp/test2.txt
192.168.1.152 pwd username https
$ awk '{print $4 "://" $1 ":" $3 "@" $2 "/control/configinfo" }' /tmp/test2.txt
https://192.168.1.152:username@pwd/control/configinfo

答案3

如果您想要一种更简单的方法在 pure 中执行此操作bash,假设您不需要将文件内容(IP 地址、用户名、密码等)保存在 shell 内存中(即数组中),您可以这样做这:

while read ip_address pwd username protocol
do
        echo "${protocol}://${ip_address}:$username@$pwd/control/configinfo"
done < test_file1.txt

这可能比解决方案更容易维护awk

相关内容