Bash - последовательность чисел в одной строке

Я решил решить эту проблему путем запуска с нуля.

Я установил Fedora 17, hostapd, dnsmasq, iptables, и общественные драйверы.

  • Драйверы, которые я использовал, были совместимы с моими аппаратными средствами, и инструкции для установки их здесь: http://linuxwireless.org/en/users/Drivers/b43.
  • dnsmasq использовался для хостинга dhcp сервера, который присвоит дюйм/с подключенным устройствам.
  • iptables использовался для включения передачи NAT через мой интерфейс Ethernet.
  • hostapd использовался для управления подключением Wi-Fi и безопасностью.

Следующее является сценарием, который я сделал для запуска рабочей точки доступа:

#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward

# Clear iptables Rules
iptables -F
iptables -t nat -F

# iptables Rules
iptables -A FORWARD -d 192.168.1.0/24 -o wlan0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i wlan0 -j ACCEPT
iptables -t nat -A POSTROUTING -o p4p1 -j MASQUERADE

# Set wlan0 IP
ip addr add 192.168.1.1/24 broadcast 192.168.1.255 dev wlan0
ip link set wlan0 up

# Set DHCP
dnsmasq -C /dev/null >/dev/null 2>&1 --listen-address=192.168.1.1 --dhcp-range=192.168.1.2,192.168.1.200,12h

# hostapd
hostapd /etc/hostapd/hostapd.conf

Содержание hostapd.conf следующее:

ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=3
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
wpa_passphrase=testomesto
driver=nl80211
interface=wlan0
hw_mode=g
channel=1
ssid=osumi-0

20
26.07.2015, 22:11
5 ответов

Переносится на все оболочки и любую систему, имеющую seq ( поскольку этот вопрос отмечен тегами)

Если начало равно 1:

$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10

В противном случае:

$ echo $(seq 5 10)
5 6 7 8 9 10

С bc:

$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)

В bash

echo {1..10}

Примечание:

Это эхо-решение работает, если значение IFS содержит новую строку , что он делает по умолчанию.
По умолчанию для IFS задана последовательность <пробел> <вкладка> <новая строка> . И сбрасывается при каждом чистом запуске оболочки. Но если у вас есть какие-либо опасения, что это могло измениться в крайнем случае, у нас есть несколько решений.

В bash, zsh, ksh просто используйте: IFS = $ '\ t \ n' (пропустите весь остальной ответ).


Однако сброс значения IFS в sh может оказаться сложной задачей Подробную информацию см. Здесь .

Отключить IFS.

$ unset IFS; echo $(seq 5 10)                           #Always work.

всегда будет работать. При условии, что ниже не будет кода (или дочерних скриптов), требующего установки IFS, например скрипта, который выполняет OldIFS = "$ IFS" .

Правильное решение.

Используя трюк для sh:

sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd'  # correct.
13
27.01.2020, 19:43
seq 10 |xargs

... или ...

seq 10 |paste -s -

Обе приведенные выше команды разделяют целые числа пробелами. xargs по умолчанию имитирует / bin / echo , поэтому каждое целое число разделяется одним пробелом. Однако по умолчанию максимальная длина командной строки составляет 128 КБ. Вы можете настроить это ...

seq 100000 | xargs -s2093009 | wc -l

... печатает 1. Значение для -s здесь не произвольно - я получил его после попытки более высокого значения (которое, по-видимому, все равно работало ) , но позже xargs напечатал полезное сообщение:

-s value should be <2093010

paste - одна из двух (насколько мне известно) санкционированных POSIX утилит для обработки строк произвольной длины :

paste использование спецификационного приложения :

Большинство стандартных утилит работают с текстовыми файлами . Утилиту cut можно использовать для преобразования файлов с произвольной длиной строки в набор текстовых файлов, содержащих одинаковые данные. Утилиту paste можно использовать для создания (или воссоздания) файлов с произвольной длиной строки.

текстовые файлы

Файл, содержащий символы, сгруппированные в ноль или более строк. Строки не содержат символов NUL, и ни одна из них не может превышать {LINE_MAX} байтов в длину, включая символ электронной строки \ n . Хотя POSIX.1-2008 не делает различий между текстовыми файлами и двоичными файлами (см. Стандарт ISO C) , многие утилиты выдают предсказуемый или осмысленный вывод только при работе с текстовыми файлами.Стандартные утилиты с такими ограничениями всегда указывают текстовые файлы в своих разделах STDIN или INPUT FILES .

paste по умолчанию использует разделитель табуляции, поэтому между каждым целым числом после второй команды будет табуляция. Вы можете ...

seq 10 |paste -sd ' ' - 

... использовать переключатель -d elimiter, чтобы изменить это поведение,

0
27.01.2020, 19:43

GNU seq принимает параметр разделителя ( -s ):

$ seq -s ' ' 1 5
1 2 3 4 5

$ var="$(seq -s ' ' 1 5)"
$ echo "$var"
1 2 3 4 5
22
27.01.2020, 19:43

Используйте это:

string="$(seq -s " " 1 10)"
3
27.01.2020, 19:43

С bash , zsh и ksh93 , вы можете использовать форму раскрытия фигурных скобок {start..end..step} :

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
28
27.01.2020, 19:43

Теги

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