строка ввода командной строки оболочки измените запятую на пробел

строка ввода командной строки оболочки измените запятую на пробел

У меня есть простой скрипт, который берет 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}')

Связанный контент