首页 » Linux » 正文

shell下按行读取文件内容

root@devil-PC:~# cat read_list 
IP=10.0.0.1 Port=22 User=root Password=123456
IP=10.0.0.2 Port=22 User=root Password=123456
IP=10.0.0.3 Port=22 User=root Password=123456
IP=10.0.0.4 Port=22 User=root Password=123456

1、使用read命令按行读取

#采用此种方法可以按行写入文本文件再source一下即可使用其中的变量了,执行第二行的时候直接清空前一行的内容即可,比如echo "test words" > test_file
#方法1
i=0
while read read_line; do
    let i=i+1
    echo "这是第${i}行数据:"${read_line}
done < read_list

#执行结果
root@devil-PC:~# while read read_line; do
> let i=i+1
> echo "这是第${i}行数据:"${read_line}
> done < read_list
这是第1行数据:IP=10.0.0.1 Port=22 User=root Password=123456
这是第2行数据:IP=10.0.0.2 Port=22 User=root Password=123456
这是第3行数据:IP=10.0.0.3 Port=22 User=root Password=123456
这是第4行数据:IP=10.0.0.4 Port=22 User=root Password=123456

#方法2
i=0
cat read_list | while read read_line; do
    let i=i+1
    echo "这是第${i}行数据:"${read_line}
done

#执行结果
root@devil-PC:~# i=0
root@devil-PC:~# cat read_list | while read read_line; do
> let i=i+1
> echo "这是第${i}行数据:"${read_line}
> done
这是第1行数据:IP=10.0.0.1 Port=22 User=root Password=123456
这是第2行数据:IP=10.0.0.2 Port=22 User=root Password=123456
这是第3行数据:IP=10.0.0.3 Port=22 User=root Password=123456
这是第4行数据:IP=10.0.0.4 Port=22 User=root Password=123456

2、使用for按行读取数据

#for循环读取数据的时候空格,换行符等也是会被识别成下一行数据,所以需要设置IFS
i=0
IFS_old=${IFS} 
IFS=$'\n'
for read_line in $(cat read_list); do
    let i=i+1
    echo  "这是第${i}行数据:${read_line}" 
done
IFS=${IFS_old}

#执行结果
root@devil-PC:~# i=0
root@devil-PC:~# IFS_old=${IFS} 
root@devil-PC:~# IFS=$'\n'
root@devil-PC:~# for read_line in $(cat read_list); do
> let i=i+1
> echo  "这是第${i}行数据:${read_line}" 
> done
这是第1行数据:IP=10.0.0.1 Port=22 User=root Password=123456
这是第2行数据:IP=10.0.0.2 Port=22 User=root Password=123456
这是第3行数据:IP=10.0.0.3 Port=22 User=root Password=123456
这是第4行数据:IP=10.0.0.4 Port=22 User=root Password=123456
root@devil-PC:~# IFS=${IFS_old}

3、使用read读取变量

#采用此种方法时,读入的文件是以空格为单位,然后依次读入对应的值并依次赋值给read后面的变量
#也就是说,此种方法可以直接将读入的文件中的内容编写成10.0.0.1 22 root 123456这种形式,这样就能把对应的内容赋值给对应的变量了
#方法1
i=0
cat read_list | while read IP Port User Password; do
    let i=i+1
    echo "这是第${i}行的第1个变量" ${IP}
    echo "这是第${i}行的第2个变量" ${Port}
    echo "这是第${i}行的第3个变量" ${User}
    echo "这是第${i}行的第4个变量" ${Password}
    echo -e "\n"
done

#执行结果
root@devil-PC:~# i=0
root@devil-PC:~# cat read_list | while read IP Port User Password; do
> let i=i+1
> echo "这是第${i}行的第1个变量" ${IP}
> echo "这是第${i}行的第2个变量" ${Port}
> echo "这是第${i}行的第3个变量" ${User}
> echo "这是第${i}行的第4个变量" ${Password}
> echo -e "\n"
> done

这是第1行的第1个变量 IP=10.0.0.1
这是第1行的第2个变量 Port=22
这是第1行的第3个变量 User=root
这是第1行的第4个变量 Password=123456


这是第2行的第1个变量 IP=10.0.0.2
这是第2行的第2个变量 Port=22
这是第2行的第3个变量 User=root
这是第2行的第4个变量 Password=123456


这是第3行的第1个变量 IP=10.0.0.3
这是第3行的第2个变量 Port=22
这是第3行的第3个变量 User=root
这是第3行的第4个变量 Password=123456


这是第4行的第1个变量 IP=10.0.0.4
这是第4行的第2个变量 Port=22
这是第4行的第3个变量 User=root
这是第4行的第4个变量 Password=123456

#方法2
while read IP Port User Password; do
    let i=i+1
    echo "这是第${i}行的第1个变量" ${IP}
    echo "这是第${i}行的第2个变量" ${Port}
    echo "这是第${i}行的第3个变量" ${User}
    echo "这是第${i}行的第4个变量" ${Password}
    echo -e "\n"
done < read_list

#执行结果
root@devil-PC:~# i=0
root@devil-PC:~# while read IP Port User Password; do
> let i=i+1
> echo "这是第${i}行的第1个变量" ${IP}
> echo "这是第${i}行的第2个变量" ${Port}
> echo "这是第${i}行的第3个变量" ${User}
> echo "这是第${i}行的第4个变量" ${Password}
> echo -e "\n"
> done < read_list
这是第1行的第1个变量 IP=10.0.0.1
这是第1行的第2个变量 Port=22
这是第1行的第3个变量 User=root
这是第1行的第4个变量 Password=123456


这是第2行的第1个变量 IP=10.0.0.2
这是第2行的第2个变量 Port=22
这是第2行的第3个变量 User=root
这是第2行的第4个变量 Password=123456


这是第3行的第1个变量 IP=10.0.0.3
这是第3行的第2个变量 Port=22
这是第3行的第3个变量 User=root
这是第3行的第4个变量 Password=123456


这是第4行的第1个变量 IP=10.0.0.4
这是第4行的第2个变量 Port=22
这是第4行的第3个变量 User=root
这是第4行的第4个变量 Password=123456

4、测试用例

#批量配置免密登录
#!/bin/bash
#set -x
if [ ! -x /usr/bin/sshpass ];then
  [ -x /usr/bin/apt ] && sudo apt install sshpass -y
  [ -x /usr/bin/yum ] && sudo yum install sshpass -y
fi

function auto_config () {
if [ ! -f server_list ];then
  echo "未找到server_list文件,请创建"
  echo "格式,按行编写:IP=x.x.x.x Port=xxx User=xxx Password=xxxx"
  echo "脚本即将退出"
  sleep 3
  exit 1
fi
while read server_info
do
  echo "${server_info}" > server_info
  source server_info
  sshpass -p ${Password} ssh-copy-id -p ${Port} -i ~/.ssh/id_rsa.pub ${User}@${IP} -o "StrictHostKeyChecking no" >> /dev/null
done < server_list
}
auto_config
rm -f server_info

发表评论