안녕하세요, 저는 여러 줄이 포함된 file.txt를 bash 스크립트 인수에 전달하여 명령으로 실행하는 방법을 알아내려고 노력해 왔습니다. while 루프를 수행해야 할지 잘 모르겠나요?
따라서 텍스트 파일에는 about과 같은 내용만 포함됩니다.
ip_addr1,foo:bar
ip_addr2,foo2:bar2
user@ip_addr3,foo3:bar3
나는 bash 스크립트가 해당 파일에서 콘텐츠를 가져와서 bash 스크립트로 사용하기를 원합니다.
ssh ip_addr1 'echo "foo:bar" > /root/text.txt'
ssh ip_addr2 'echo "foo2:bar2" > /root/text.txt'
ssh user@ip_addr3 'echo "foo3:bar3" > /root/text.txt'
따라서 텍스트 파일의 행 수에 따라 스크립트가 실행됩니다.
답변1
read
답변에서 제안한 대로 bash 명령을 사용하여 파일 행을 반복할 수 있습니다.이 문제.
while read -r line
do
# $line will be a variable which contains one line of the input file
done < your_file.txt
답변에서 알 수 있듯이 read
변수를 다시 사용하여 IFS
각 줄의 내용을 변수로 분할 할 수 있습니다 .IFS
이 문제.
while read -r line
do
# $line will be a variable which contains one line of the input file
IFS=, read -r ip_addr data <<< "$line"
# now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
done < your_file.txt
여기에서 새 변수를 사용하여 실행하려는 명령을 실행할 수 있습니다.
while read -r line
do
# $line will be a variable which contains one line of the input file
IFS=, read -r ip_addr data <<< "$line"
# now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
ssh "$ip_addr" "echo \"${data}\" > /root/text.txt"
done < your_file.txt
변수가 필요하지 않은 경우 $line
단일 read
명령을 사용할 수 있습니다.
while IFS=, read -r ip_addr data
do
# now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
ssh "$ip_addr" "echo \"${data}\" > /root/text.txt"
done < your_file.txt
답변2
다음 명령을 사용하여 입력 파일을 쉘 스크립트로 변환하십시오.sed
$ sed -e "s|\([^,]*\),\(.*\)|ssh -n \"\1\" 'echo \"\2\" >/root/text.txt'|" file
ssh -n "ip_addr1" 'echo "foo:bar" >/root/text.txt'
ssh -n "ip_addr2" 'echo "foo2:bar2" >/root/text.txt'
ssh -n "user@ip_addr3" 'echo "foo3:bar3" >/root/text.txt'
또는 awk
,
$ awk -F ',' '{ printf("ssh -n \"%s\" '\''echo \"%s\" >/root/text.txt'\''\n", $1, $2) }' file
ssh -n "ip_addr1" 'echo "foo:bar" >/root/text.txt'
ssh -n "ip_addr2" 'echo "foo2:bar2" >/root/text.txt'
ssh -n "user@ip_addr3" 'echo "foo3:bar3" >/root/text.txt'
그런 다음 리디렉션을 사용하여 이들 중 하나의 출력을 파일에 저장하고 sh
. 이 방법을 사용하면 어떤 명령이 실행되었는지 정확하게 기록할 수도 있습니다.
또는 다음을 사용하여 두 명령의 출력을 실행할 수 있습니다.
...either command above... | sh -s