Bash: Поскольку цикл с двоичным диапазоном, сохраняющим управление, оценивает двоичный файл

Можно также использовать функцию, которая не ограничивает Вас наличием Вашего изменяющегося аргумента в конце:

runcom() { run-command --a --whole --lot --of --flags parameter "$1" ; }

runcom a
runcom b
3
22.11.2013, 09:13
4 ответа

seq не встроенное. Это - также не часть стандарта Posix. Но обычные реализации seq не имейте никакой способности упорядочить в основаниях кроме 10.

В ударе можно указать диапазон как {start..finish}. Однако это также не работает в основаниях кроме 10 (хотя это действительно работает с буквами: {a..f} расширяется до a b c d e f.

И насколько я знаю, вот именно для простых генераторов последовательности, который оставляет Вас с несколькими возможностями.

Глупый способ сделать это состоит в том, чтобы отфильтровать недвоичные значения. Это просто, но чрезвычайно неэффективно если a и b не являются крошечными:

for x in $(seq -w $a $b); do
  if [[ ! ($x =~ [2-9]) ]]; then
    echo $x
  fi
done

Вот лучшее решение. Принятие a и b та же длина (в противном случае, можно использовать printf для фиксации этого), следующее циклично выполнится через все двоичные числа от до b, включительно:

# We need a string of 0s at least as long as a:
z=${a//1/0}
while [[ ! ($a > $b) ]]; do
  # do something with $a
  # The following "increments" a by removing the last 0 (and trailing 1s)
  # and replacing that with a 1 and the same number of 0s.
  a=$(printf "%.*s" ${#a} ${a%0*}1$z)
done
1
27.01.2020, 21:16

Вы, соглашаются с этим:

for blah in $(seq "$((2#$a))" "$((2#$b))") ; do

Просто необходимо преобразовать десятичные значения из for цикл назад в двоичный файл с чем-то как dc.

Пример

$ for blah in $(seq "$((2#0011))" "$((2#1000))"); do \
     printf "%04d\n" $(echo "obase=2;$blah" | bc);done
0011
0100
0101
0110
0111
1000

printf используется для управления выводом так, чтобы он был дополнен начальными нулями и отформатирован к определенной ширине. Аргументы, %04d то, что указывает вывод.

Другой ключ, соединенный к этой команде, является использованием bc - калькулятор командной строки. Эта команда, например:

echo "obase=2;$blah" | bc

Принимает значение, $blah и преобразование его для базирования 2 (иначе. Двоичный файл) с помощью bc.

Без до н.э или dc

Если Вы находитесь в системе, это ограничило таким образом, что ни один из этих инструментов не присутствует, можно сделать преобразование непосредственно с помощью просто awk и эта функция от awkруководство.

Пример

Создайте файл со следующим содержанием, назовите его dec2bin.awk.

# bits2str --- turn a byte into readable 1's and 0's

function bits2str(bits, data, mask)
{
    if (bits == 0)
        return "0"

    mask = 1
    for (; bits != 0; bits = rshift(bits, 1))
        data = (and(bits, mask) ? "1" : "0") data

    while ((length(data) % 8) != 0)
        data = "0" data

    return data
}

{
  printf("%s\n", bits2str($1))
}

Теперь использовать вышеупомянутую функцию:

$ for blah in $(seq "$((2#0011))" "$((2#1000))"); do echo $blah \
     | awk -f dec2bin.awk; done
00000011
00000100
00000101
00000110
00000111
00001000
3
27.01.2020, 21:16

Это легче с zsh:

for ((i=2#$a; i<=2#$b; i++)) echo $(([##2]i))

Или с с 0 дополнениями:

for ((i=2#$a; i<=2#$b; i++)) printf '%04d\n' $(([##2]i))

Иначе можно использовать bc:

echo "ibase=obase=2; for (i=$a; i<=$b; i++) i" | bc

Или dc:

echo "2doi $a [p1+d$b!<a]dsax" | dc

К с 0 клавиатурами можно всегда передавать вывод по каналу к:

sed 's/^/000/;s/^0*\(.\{4\}\)/\1/'
1
27.01.2020, 21:16

Этот метод сделает большую обработку, таким образом, не хороший для больших спектров.

seq -f '%04g' 0011 1000 | grep -v '[2-9]'

0
27.01.2020, 21:16
  • 1
    @Stephane кавычки, которые Вы добавили и те, Ваши удаленные являются оба дополнительными в этом случае. Я всегда рекомендовал бы иметь их. –  ctrl-alt-delor 22.11.2013, 12:42
  • 2
    Нет, кавычки вокруг [2-9] не являются дополнительными. Это заставит это перестать работать с csh, tcsh или zsh если не будет никакого файла, соответствующего тому шаблону в текущем каталоге, или хуже с другими оболочками (не ловят рыбу), то он перестанет работать плохо и более неясно если будут файлы, соответствующие тому шаблону в текущем каталоге. Вы правы что кавычки вокруг % необходимы для fish оболочка. одинарные кавычки лучше, чем двойные кавычки как в Вашей более ранней версии, так как это означает, что она также работает с rc и es. Как это записано теперь, это работало бы с любой оболочкой (в системах, где GNU seq установлен). –  Stéphane Chazelas 22.11.2013, 13:01
  • 3
    @stephane Извините, я пропустил те случаи, где он не работал, это - то, почему я рекомендую использовать кавычки, где когда-либо они могут быть необходимы. –  ctrl-alt-delor 22.11.2013, 13:38

Теги

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