Как сделать множественное чтение? [закрыто]

-2
02.03.2017, 13:43
1 ответ

Ваш сценарий показывает, что вы используете #! / Bin / sh в строке shebang. Это может быть проблемой, поскольку некоторые оболочки по умолчанию не поддерживают массивы. . Примером этого может быть тире в Ubuntu. В случае, если вам абсолютно необходимо использовать оболочку по умолчанию, которая не может использовать массивы, см. Ответ Стефана в ссылке.В качестве альтернативы можно использовать разделение слов следующим образом:

read -p "Enter ports(space separated):" ports
for port in $ports
do
       [ -d "/root/port$port" ] || mkdir -p "/root/port$port" && echo "Created /root/port$port"

done

С другой стороны, если бы мы могли использовать оболочку с более широкими возможностями (а во многих случаях ОС имеет более одной оболочки), было бы лучше использовать массив для хранения портов. Общий подход к этому, когда доступны массивы (оболочки bash , ksh , mksh , zsh )) выглядит следующим образом:

printf "Enter ports(space separated):"
read ports
arr=( $ports  )

Здесь мы пользуемся преимуществом того, что строка, например, 80 22 23 разделяется на пробелы (обычно это называется разделением слов), и передаем эти отдельные значения в массив arr . Это далеко не идеально, но работает.

Если вы можете использовать bash, можно воспользоваться преимуществом read -a , чтобы прочитать все элементы как массив, а затем перебрать значения. Например:

bash-4.3$ read -p "Enter ports(space separated):" -a portsEnter ports(space separated):80 22 25
bash-4.3$ echo ${ports[0]}
80
bash-4.3$ echo ${ports[1]}
22
bash-4.3$ echo ${ports[2]}
25

Тот же подход можно использовать для ksh с читать -A .

Тогда вы можете сделать что-то вроде этого:

for port in ${ports[@]};
do
   [ -d "/root/port$port" ] || mkdir -p "/root/port$port" && echo "Created /root/port$port"
done

Я не знаком с csh , поэтому не могу предложить решение для этого, но общая идея должна быть аналогичной

1
28.01.2020, 05:17

Теги

Похожие вопросы