Ваш сценарий показывает, что вы используете #! / 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
, поэтому не могу предложить решение для этого, но общая идея должна быть аналогичной