У меня есть файл, как показано ниже: (list.txt)
127.0.0.1 us
127.0.0.2 uk
127.0.0.3 cn
127.0.0.4 fr
127.0.0.5 ru
127.0.0.6 bd
127.0.0.7 hk
Я хотел создать скрипт, который покажет пользователю как выбранные элементы.
bash ping.sh
Which ip you want to test?
1) 127.0.0.1-us
2) 127.0.0.2-uk
3) 127.0.0.3-cn
4) 127.0.0.4-fr
5) 127.0.0.5-ru
6) 127.0.0.6-bd
7) 127.0.0.7-hk
Input: 6
ping -c 5 127.0.0.6
] Этот список будет меняться при каждом изменении файла. Как я могу это сделать?
Предполагая, что в bash вы имели в виду команду cli (терминал) для выполнения задания. Конечно, только коммуникационная секция выполняется python, сама команда (конечно) выполнена ping
Все в одном, в маленьком скрипте python:
#!/usr/bin/env python3
import subprocess
import sys
print("Which ip do you want to test?\n")
# create a numbered list of the lines
ips = list(enumerate(open(sys.argv[1]).read().splitlines()))
[print(str(i+1)+") "+ip) for i, ip in ips]
# run the command to ping
subprocess.call(["ping", "-c", "5", ips[int(input("\ninput: "))-1][1]])
Скопируйте сценарий в пустой файл, сохраните его как ping_ip.py Запустите его с аргументом list.txt в качестве аргумента: python3 /path/to/ping_ip.py /path/to/list.txt`
Аргумент «5» ( количество пинов) находится в строке:
subprocess.call(["ping", "-c", "5", ips[int(input("\ninput: "))-1][1]])
, но может быть очень хорошо изменено для использования в качестве аргумента communicationational . Если это будет удобно, просьба указать.
Вот что я придумал примерно через 5-10 минут, просто играя с AWK.
$ select entry in $(awk '{printf "%s-%s ",$1,$2}' ips.txt) ; do
> ip_address=$(awk -F '-' '{print $1}' <<< "$entry" )
> echo "You selected " "$ip_address"
> done
1) 127.0.0.1-us
2) 127.0.0.2-uk
3) 127.0.0.3-cn
4) 127.0.0.4-fr
5) 127.0.0.5-ru
6) 127.0.0.6-bd
7) 127.0.0.7-hk
#? 2
You selected 127.0.0.2
Трудная часть вашего вопроса - это просто обработка строк текстового файла, который может быть соответствующим образом использован структурой select, потому что у вас есть две записи в строке. Ну, почему бы не превратить их в один элемент и просто отправить процесс для извлечения ip-адреса? Это именно то, что я делаю в коде выше.
Обратите внимание, что первая подстановка параметров не задана без кавычек - мы хотим, чтобы первая команда расширялась до каждого отдельного элемента, разделенного пробелами, мы не хотим, чтобы он рассматривался как одна строка.
Что хорошего в этом подходе, так это то, что он невосприимчив к отсутствующему местоположению, например, если в выборе # 2 uk отсутствует, мы все равно будем читать 127.0.0.2