1

У меня есть простой скрипт, который берет 4 переменные из «чтения» интерактивной клавиатуры, но моя команда содержит запятую. Я читаю значение разделителя 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 ответ1

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:

IFS
Разделитель внутренних полей, который используется для разделения слов после раскрытия и разделения строк на слова с помощью встроенной команды 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}')

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .