Как мне получить числа, дополненные нулями, в {} (раскрытие фигурных скобок)?

Таким образом, решение для того, чтобы заставить Canusb работать в udev, было найдено Куртом Ван Дейком:

Иногда можно иметь условия гонки с правилами udev, поскольку не все атрибуты присутствуют при запуске uevent

Это обновленное /usr/local/bin/slcan_add.sh заставляет CanUsb правильно работать с udev при подключении:

#!/bin/sh
# Bind the USBCAN device
sleep 1
/usr/local/bin/slcand -o -c -f -s8 /dev/$1 slcan0
sleep 2
ifconfig slcan0 up

Мне еще предстоит выяснить, как заставить Ixxat Can-to-Usb V2 работать с SocketCan.

3
05.01.2017, 13:16
4 ответа

Расширения фигурных скобок Bash могут генерировать числа с ведущими нулями ( начиная с bash 4.0 alpha + ~ 2009-02-20 ):

$ echo {001..023}
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023

Итак, вы можете сделать:

for a in {001..218}; do  echo "bvrprdsve$a; $(ssh -q bvrprdsve$a "echo \$(free -m|grep Mem|/bin/awk '{print \$4}';free -m|grep Swap|/bin/awk '{print \$4}')")"; done >> /tmp/svemem.txt

Но давайте немного заглянем внутрь команды:

  1. Вы дважды вызываете free, используя grep, а затем awk:

     free -m | grep Mem | / bin / awk ' {print \ $ 4} '; 
    free -m | grep Swap | / bin / awk' {print \ $ 4} '
     

    Все можно свести к одному вызову free и awk :

     free -m | / bin / awk '/ Mem | Swap / {print \ $ 4}' 
     
  2. Кроме того, внутренняя команда могла быть уменьшено до этого значения:

     cmd = "echo \ $ (free -m | / bin / awk '/ Mem | Swap / {print \ $ 4}')" 
     

Затем весь сценарий будет выглядеть так:

b=bvrprdsve;
f=/tmp/svemem.txt;
cmd="echo \$(free -m|/bin/awk '/Mem|Swap/{print \$4}')";
for a in {001..218}; do echo "$b$a; $(ssh -q "$b$a" "$cmd")"; done >> "$f";
16
27.01.2020, 21:08

printf '% 04d' «$ a» выведет заполненную нулями четырехзначную строку, если $ a является целым числом.

Пример:

a=14
b="$( printf '%04d' "$a" )"

printf '%s\n' "$b"

выведет

0014

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

for a in {1..9}; do
  za="$( printf '%04d' "$a" )"
  # rest of code, using $za
done

Присваивание za выше также может быть выполнено с помощью

printf -v za '%04d' "$a"   # print to variable za

Чтобы быть более читаемым программистом на C

for (( a = 1; a < 10; ++a )); do
  za="$( printf '%04d' "$a" )"
  # rest of code, using $za
done

, я не просматривал остальную часть кода.

Примечание. В ksh можно установить атрибут переменной, чтобы ее раскрытие всегда заполнялось нулями:

typeset -Z4 za
for (( a = 1; a < 10; ++a )); do
  za="$a"
  printf "%s\n" "$za"
done

0001
0002
0003
0004
0005
0006
0007
0008
0009
9
27.01.2020, 21:08

Вы можете использовать seq -w 1 218 или seq -f "% 03g" 1 218 для создания ваши числа.

5
27.01.2020, 21:08

Хотя Расширение скобок имеет метод заполнения нулями -, я нашел Расширение параметров более полезным для изменения существующей переменной:

digits=00000
num=123

# Option 1:
temp=$digits$num
echo ${temp:(-${#digits})}
# prints 00123

# Option 2:
echo ${digits:${#num}:${#digits}}${num}
# prints 00123
3
08.07.2020, 10:52

Теги

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