Заявление Тердона «Это очень далеко от« простого » if
». это
преуменьшение. Как указал Джон Кугельман, ,
&&
и ||
имеют равный приоритет и обрабатываются слева направо.
BinaryZebra предложила идею преобразования логических выражений
в каскадные операторы if
. Моя лучшая попытка «упростить»
if A && B || C && D then result=0 else result=1 fi
if A then if B then if D ← then result=0 else result=1 fi else if C then if D then result=0 else result=1 fi else result=1 fi fi else if C then if D then result=0 else result=1 fi else result=1 fi fi
очень далека от простого.
Как вы можете видеть из вышеизложенного,
причина, по которой это не работает, заключается в том, что
(в отмеченной строке), если A и B оба истинны ,
он все еще проходит проверку D ( [["$ 1" == "Зашифровать"]]
).
Как показывает BinaryZebra без упоминания, вы можете использовать некоторые математические обозначения в сценариях sh / bash; например, вы можете сказать
if (A && B) || (C && D) then ︙
или, в несколько упрощенной версии вашего кода,
if ( [["$2" == "load" ]] && [[ "$1" == "Decrypt" ]] ) || ( [[ "$2" == "load" ]] && [[ "$1" == "Encrypt" ]] ) then ︙
Особенностью этого является то, что код в круглых скобках запускается в подоболочке. Если это проблема, вы можете вместо этого использовать фигурные скобки:
if { [["$2" == "load" ]] && [[ "$1" == "Decrypt" ]] ; } || { [[ "$2" == "load" ]] && [[ "$1" == "Encrypt" ]] ; } then ︙
Обратите внимание, что перед }
должны быть ;
перед }
(необязательно разделенные пробел),
и должны быть пробелы до и после {
и после }
.
Конечно, вы должны использовать методы, представленные в других ответах, для упрощения вашего теста, например , а не выполнение одного и того же теста на
$ 2
дважды.
Связано: Приоритет привязки каналов и перенаправления с дизъюнктами, конъюнктами и т. Д.? и Когда «если» не требуется?
Сначала :не забудьте перевести новый диск в автономный режим и убедиться, что он не подключен и не используется каким-либо образом.
Скопировать таблицы разделов со старого диска ada0
на новый дискada3
:
% doas gpart backup ada0 | doas gpart restore -F ada3
Теперь ada3
имеет те же три раздела, что иada0
:
% doas gpart show ada3
=> 40 3907029088 ada3 GPT (1.8T)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 3902832640 3 freebsd-zfs (1.8T)
3907028992 136 - free - (68K)
Удалить старые метаданные ZFS (раздел уведомления p3):
% doas dd if=/dev/zero of=/dev/ada3p3
Заменить диск (уведомление о разделе p3):
% doas zpool replace -f zroot 15120424524672854601 /dev/ada3p3
Make sure to wait until resilver is done before rebooting.
If you boot from pool 'zroot', you may need to update
boot code on newly attached disk '/dev/ada3p3'.
Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
Запустите указанную команду, чтобы обновить загрузочную информацию на новом диске:
% doas gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3
partcode written to ada3p1
bootcode written to ada3
UUID теперь другие:
% gpart list ada0 | grep uuid | sort
rawuuid: 7f842536-bcd0-11e8-b271-00259014958c
rawuuid: 7fbe27a9-bcd0-11e8-b271-00259014958c
rawuuid: 7fe24f3e-bcd0-11e8-b271-00259014958c
% gpart list ada3 | grep uuid | sort
rawuuid: 9c629875-c369-11e8-a2b0-00259014958c
rawuuid: 9c63d063-c369-11e8-a2b0-00259014958c
rawuuid: 9c66f76e-c369-11e8-a2b0-00259014958c
% gpart list ada0 | grep efimedia | sort
efimedia: HD(1,GPT,7f842536-bcd0-11e8-b271-00259014958c,0x28,0x400)
efimedia: HD(2,GPT,7fbe27a9-bcd0-11e8-b271-00259014958c,0x800,0x400000)
efimedia: HD(3,GPT,7fe24f3e-bcd0-11e8-b271-00259014958c,0x400800,0xe8a08000)
% gpart list ada3 | grep efimedia | sort
efimedia: HD(1,GPT,9c629875-c369-11e8-a2b0-00259014958c,0x28,0x400)
efimedia: HD(2,GPT,9c63d063-c369-11e8-a2b0-00259014958c,0x800,0x400000)
efimedia: HD(3,GPT,9c66f76e-c369-11e8-a2b0-00259014958c,0x400800,0xe8a08000)
Теперь выполняется повторное серебрение диска:
% zpool status zroot
pool: zroot
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Sat Sep 29 01:01:24 2018
64.7G scanned out of 76.8G at 162M/s, 0h1m to go
15.7G resilvered, 84.22% done
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
ada0p3 ONLINE 0 0 0
ada1p3 ONLINE 0 0 0
ada2p3 ONLINE 0 0 0
replacing-3 OFFLINE 0 0 0
15120424524672854601 OFFLINE 0 0 0 was /dev/ada3p3/old
ada3p3 ONLINE 0 0 0
После восстановления серебра:
% zpool status zroot
pool: zroot
state: ONLINE
scan: resilvered 18.6G in 0h7m with 0 errors on Sat Sep 29 01:09:22 2018
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
ada1p3 ONLINE 0 0 0
ada2p3 ONLINE 0 0 0
ada3p3 ONLINE 0 0 0
errors: No known data errors