Можно также использовать функцию, которая не ограничивает Вас наличием Вашего изменяющегося аргумента в конце:
runcom() { run-command --a --whole --lot --of --flags parameter "$1" ; }
runcom a
runcom b
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
Вы, соглашаются с этим:
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
.
Если Вы находитесь в системе, это ограничило таким образом, что ни один из этих инструментов не присутствует, можно сделать преобразование непосредственно с помощью просто 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
Это легче с 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/'
Этот метод сделает большую обработку, таким образом, не хороший для больших спектров.
seq -f '%04g' 0011 1000 | grep -v '[2-9]'
[2-9]
не являются дополнительными. Это заставит это перестать работать с csh
, tcsh
или zsh
если не будет никакого файла, соответствующего тому шаблону в текущем каталоге, или хуже с другими оболочками (не ловят рыбу), то он перестанет работать плохо и более неясно если будут файлы, соответствующие тому шаблону в текущем каталоге. Вы правы что кавычки вокруг %
необходимы для fish
оболочка. одинарные кавычки лучше, чем двойные кавычки как в Вашей более ранней версии, так как это означает, что она также работает с rc
и es
. Как это записано теперь, это работало бы с любой оболочкой (в системах, где GNU seq
установлен).
– Stéphane Chazelas
22.11.2013, 13:01