Преобразование значения в «двоичное число» в сценарии оболочки

Это очень зависит от приложения. Редактор должен быть настроен таким образом, чтобы он генерировал имена файлов с добавленной точкой, а не с добавленной тильдой. Это может быть вообще невозможно в некоторых редакторах, которые позволяют указывать только суффикс резервной копии .

Однако, если вас беспокоит просмотр файлов резервных копий, вы можете хотя бы получить ls , чтобы не отображать их.

С GNU ls (из GNU coreutils) вы можете использовать параметр -B или - ignore-backups . При этом явно не будут перечислены файлы, соответствующие * ~ . Это эквивалентно -I '* ~' или - ignore = '* ~' .

В файле инициализации оболочки ( ~ / .bashrc для bash ) добавьте либо

alias ls='command ls -B'

, либо

function ls { command ls -B "$@"; }

. Если файлы резервных копий не отображаются в файловых менеджерах, возможно, тоже нужно сделать, но то, как вы это сделаете (если возможно), зависит от используемого файлового менеджера.

5
15.08.2015, 06:43
3 ответа

Вы можете использовать библиотеку POSIX Awk stdlib :

$ awklib 'BEGIN {print base_conv(304, 10, 2)}'
100110000

Или:

$ awklib 'BEGIN {print base_conv(ARGV[1], 10, 2)}' 304
100110000
0
27.01.2020, 20:35

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

#! /bin/sh

E=[24680] # even nums
O=[13579] # odd  nums

lookuptbl() {
   case $1 in
      $E[01]* ) echo 0 ;; $E[23]* ) echo 1 ;;
      $E[45]* ) echo 2 ;; $E[67]* ) echo 3 ;;
      $E[89]* ) echo 4 ;; $O[01]* ) echo 5 ;;
      $O[23]* ) echo 6 ;; $O[45]* ) echo 7 ;;
      $O[67]* ) echo 8 ;; $O[89]* ) echo 9 ;;
   esac
}

divby2() {
   set -- "0$1"

   while case $1 in ? ) break ;; esac; do
      set -- "${1#?}" "${2-}$(lookuptbl "$1")"
   done

   echo $2
}

dec2bin() {
   case $1 in *[!0]* ) :;; * ) echo 0; return ;; esac

   while :
   do
      case $1 in *[!0]* ) :;; * ) break;; esac
      case $1 in
         *$E ) set -- "$(divby2 "$1")" "0${2-}" ;;
         *$O ) set -- "$(divby2 "$1")" "1${2-}" ;;
      esac
   done

   echo "$2"
}

# And then... (assuming pure number given from command line)
num=${1:-304}
dec2bin "$num"

результат

100110000
2
27.01.2020, 20:35

С ksh или зш:

$ typeset -i2 n=304
$ echo "$n"
2#100110000
$ echo "${n#*#}"
100110000

С зш:

$ echo $(([##2]304))
100110000

С кш93:

$ printf '%..2d\n' 304
100110000
1
27.01.2020, 20:35

Теги

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