我有一个包含多行的txt文件,每行都描述一个远程服务器,如下所示:
user@server:port:remote_working_path:whether_using_VPN
:char分隔4个字段。
我需要在每个服务器中运行批处理操作,因此我需要解析每一行并设置适当的变量。现在,我编码的是:
while read server;
do
echo "$server" | awk -F ':' '{print $1}' &&
echo "$server" | awk -F ':' '{print $2}' &&
echo "$server" | awk -F ':' '{print $3}'
echo "$VPN"
declare $( echo "$server" | awk -F ':' '{print $VPN=$4}' )
echo 'VPN: '$VPN
done < $CUSTOMER_SERVERS_FILE
此脚本仅打印前3个字段,我的意图还应将$ VPN变量设置为第4个字段。然而,这似乎有点破碎,我无法解决它。我应该如何修改它以便$ VPN = $ 4?
答案 0 :(得分:7)
首先,在这种情况下,您不需要使用awk
。你可以尝试使用类似的东西:
while IFS=':' read -ra array; do
# "${array[0]}" => first field
# "${array[1]}" => second field
# ...
# "${array[@]}" => all fields
done < "$CUSTOMER_SERVERS_FILE"
然后,如果要使用第4个字段设置VPN变量,可以使用:
while IFS=':' read -ra array; do
# ...
VPN="${array[3]}"
done < "$CUSTOMER_SERVERS_FILE"
另一种解决方案:
while IFS=':' read -r address port path vpn trash; do
# The variables $adress $port $path and $vpn are assigned.
# $trash is set with other fields if there are more than 4 fields
done
最后,当您想要在变量中分配命令的输出时,您可以执行以下操作:
var="$(command)"
# or
var="`command`"