
У меня есть простой скрипт, который берет 4 переменные из интерактивной клавиатуры 'read', однако в моей команде есть запятая. Я читаю по разделительному значению IFS, но примеры показывают, что он читает только из файлов, а не с клавиатуры. Есть ли трюк, чтобы изменить ввод, или мне нужно передать команду через SED/AWK, чтобы получить правильный формат для чтения скриптом?
Скрипт не представляет собой ничего сложного, он просто вводит текст, добавляет введенное значение и выводит обратно строки команд, которые можно запустить с введенным текстом.
[сеть] [карта],[порт] [имя хоста] 0123 0123,A1 ABCDEFG
#!/bin/bash
echo "Enter network info:"
read VAR1 VAR2 VAR3 VAR4
#I have no clue what Im doing
echo -e "${green}ping test and ssh into $VAR4${NC}"
решение1
Чтобы использовать запятую в качестве разделителя слов, попробуйте:
IFS="$IFS," read a b c d
Это временно добавляет запятую к IFS
списку символов, которые оболочка использует в качестве разделителей полей.
В качестве примера давайте соберем некоторые данные:
$ IFS="$IFS," read a b c d
1, 2,3 , 4
Давайте посмотрим, как bash интерпретирует эти входные данные:
$ echo "a=$a b=$b c=$c d=$d"
a=1 b=2 c=3 d=4
Улучшение
Мы можем объединить приглашение и команду чтения:
IFS="$IFS," read -p "Enter network info: " a b c d
Документация
От man bash
:
МФС
Внутренний разделитель полей, который используется для разделения слов после расширения и для разделения строк на слова с помощью встроенной команды read. Значение по умолчанию:<space><tab><newline>
Альтернатива
Если по какой-то неуказанной причине кто-то действительно хотел бы использовать sed
эту задачу:
read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')
Команда s/,/ /g
сообщает sed о необходимости заменить каждую запятую пробелом. q
указывает ему выйти после первой строки.
Одинокий <
указываетперенаправление: он сообщает оболочке, что входные данные для read
команды следует брать из файлового объекта, который следует в командной строке.
Конструкция <(...)
называетсязамена процессаи создает объект, подобный файлу, из команды, содержащейся в скобках. Эта команда sed
заменяет запятые на пробелы.
Для того же подхода, но с использованием awk:
read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')