File1.txt에는 호스트 목록이 포함되어 있습니다.
computer_1
computer_2
File2.txt에는 명령 목록이 포함되어 있습니다...
ping host_name -c 10
dig host_name A host_name AAAA +short
...호스트에서 실행됩니다. 명령을 실행하기 전에 file2의 문자열을 File1의 실제 호스트 이름 sed -e "s/host_name/$line/" $2
으로 바꿉니다. host_name
나는 결국 :
ping computer_1 -c 10
dig computer_1 A computer_1 AAAA +short
ping computer_2 -c 10
dig computer_2 A computer_2 AAAA +short
이 출력을 명령으로 실행하려면 어떻게 해야 합니까?
나는 다음을 포함하여 성공하지 못한 몇 가지 초보자 접근 방식을 시도했습니다.
while read line; do
commands="$(sed -e "s/host_name/$line/" $2)"
eval $commands
done < $1
답변1
나는 그것이 예상대로 작동하지 않는 따옴표 안의 따옴표 문제일 뿐이라고 생각합니다.
코드의 구문 강조 표시는 무슨 일이 일어나고 있는지 힌트를 줍니다. s/host_name/$line/
밧줄의 나머지 부분은 빨간색이 아니라 검은색이라는 점에 주목하세요 . 이는 실제로 bash가 이해하지 못하는 일부 쓰레기가 포함된 두 개의 문자열을 생성했기 때문입니다.
이와 같은 것이 작동해야합니다
while read line; do
commands=$(sed -e "s/host_name/$line/" $2)
eval "$commands"
done < $1
답변2
while read loop
a 와 a를 모두 가질 수 있습니다.for loop
A. 하지만 일명 foor loop
이 필요해mapfile
readarray
mapfile -t commands < file2.txt
mapfile -t hosts < file1.txt
for h in "${hosts[@]}"; do
for c in "${commands[@]}"; do
echo command "$c" "$h"
done
done
bash가 충분히 새롭지 않은 경우 일반적인 해결 방법은 다음과 같습니다.mapfile
IFS=$'\n' read -rd '' -a array < file.txt
또는
while IFS= read -r file; do
array+=("$file")
done < file.txt
이제 "${array[@]}"
모든 값/요소를 저장하십시오.
주기 while read
.
while IFS= read -ru "$fd" h; do
while IFS= read -r c; do
echo command "$c" "$h"
done < file2.txt
done {fd}< file1.txt
echo
출력이 정확하다고 생각되면 이를 제거하여 실제로 명령을 실행하십시오.두 파일 모두 한 줄에 하나의 항목이 있다고 가정하면 내장된 것만으로도
command
충분합니다. 즉, 한 줄에 여러 명령을 구분할 필요가 없습니다;
. 다른 점에서는 그렇습니다...eval
$fd
임의의 이름이고 임의의 파일 설명자를 사용합니다. bash가 충분히 새롭지 않으면 채택된 이후 로{fd}
변경할 수 없습니다 . 루프의 무언가가 식사/흡연인 경우 에는 다른 것을 사용해야 합니다 .3
0
2
fd
while read
stdin
ssh