Если elif еще не работает в bash ChromeOS

Я пытаюсь создать сценарий bash, который в основном берет кучу .deb, распаковывает их и помещает двоичные файлы и библиотеки в /usr/local/opt/{lib}bin.

Сценарий проверяет, смонтирован ли / как ro или rw, и если он смонтирован как ro, то перемонтирует его как rw. Однако на хромбуках, чтобы смонтировать / как rw, вам необходимо удалить_rootfs_verification для рассматриваемого раздела. Сценарий не может повторить то, что указано выше, когда rootfs_verification включен для /, и должен выйти из 1, вместо этого он продолжается.

Вот часть сценария, о которой я говорю

### ChromeOS's Specific!!!
# The following assumes rootfs_verification for / has already been removed 
if grep $rootfs /proc/mounts | grep ro; then
  mount -o remount,rw / &> mount.out 

elif 
 grep -iw 'read-write' mount.out; then 

   echo '\nrootfs_verification for the root partition must to be removed in order to remount,rw  /
To remove rootfs_verification run the following command and than reboot the system:
"sudo /usr/share/vboot/bin/make_dev_ssd.sh  --remove_rootfs_verification --partitions 4"'

else exit 1

fi

Весь сценарий WIP можно найти здесь https://pastebin.com/ekEPSvYy.

Вот что происходит, когда я его выполняю

localhost /usr/local # ./kvm_install.sh 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   124    0   124    0     0    322      0 --:--:-- --:--:-- --:--:--   345
100   135  100   135    0     0    170      0 --:--:-- --:--:-- --:--:--   170
100 60384  100 60384    0     0  57950      0  0:00:01  0:00:01 --:--:--  344k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   143    0   143    0     0    407      0 --:--:-- --:--:-- --:--:--   412
100   154  100   154    0     0    202      0 --:--:-- --:--:-- --:--:--   202
100 1298k  100 1298k    0     0   929k      0  0:00:01  0:00:01 --:--:-- 3020k
/dev/root / ext2 ro,seclabel,relatime,block_validity,barrier,user_xattr,acl 0 0
./kvm_install.sh: line 31: /etc/env.d/30kvm: Read-only file system
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 66802  100 66802    0     0  69657      0 --:--:-- --:--:-- --:--:-- 74555
./kvm_install.sh: line 39: ar: command not found
tar (child): control.tar.gz: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
md5sum: md5sums: No such file or directory

По сути, здесь происходит то, что ar не может быть найден, так как скрипт не смог добавить переменные PATH в /etc/env.d/30kvm, поскольку корневой раздел не может быть смонтирован, поскольку root_verification включен в /.

Я попытался добавить команду elif «grep» в [[, как некоторые предлагали здесь, но это не сработало и добавило дополнительные проблемы с синтаксисом.

Я нахожусь в процессе изучения основ написания сценариев bash. Прошу прощения, если сценарий написан коряво.

Спасибо

В конце концов я так и сделал.

 if grep $rootfs /proc/mounts | grep 'ro,'; then
      mount -o remount,rw / &> mount.out

if
    grep 'read-write' mount.out; then
     echo 'something to echo' && exit 1
    fi
    fi

Это некрасиво, но работает, пока я не найду/узнаю лучший способ реализации цикла.


person mailman    schedule 09.06.2019    source источник
comment
mount.out создается только в разделе if. Если он доступен для чтения в разделе elif, это не тот, который был создан непосредственно выше, а ваш предыдущий успешный if запуск. Это не может быть хорошо ;-) Я недостаточно много работаю с mount опциями, чтобы иметь возможность давать полезные комментарии по этому поводу. Похоже, вы понимаете проблему, но я бы добавил операторы отладки, такие как echo "inside elif", чтобы вы были уверены, что сценарий следует по пути, который вы ожидаете. Удачи.   -  person shellter    schedule 09.06.2019
comment
Также обратите внимание, что grep ro будет соответствовать /dev/root / ext2 rw, а также /dev/root / ext2 ro.   -  person that other guy    schedule 09.06.2019
comment
@shellter Я не совсем уверен, что вы имели в виду: mount.out создается только в разделе if. Если в разделе elif есть доступный для чтения, это не тот, который был создан непосредственно выше, а из вашего предыдущего успешного запуска if. Спасибо   -  person mailman    schedule 10.06.2019
comment
Я должен был предварить этот комментарий словами «На основе предоставленного вами кода», но теперь я вспоминаю, что вы включили только часть своего сценария. В любом случае ваш mount.out может вызывать подозрения, поскольку вы изучаете его в части elif, поэтому убедитесь, что в нем есть актуальная информация. Я думаю, что моя идея отладки - это то, с чего вам следует начать, если у вас все еще есть проблемы. Удачи.   -  person shellter    schedule 10.06.2019


Ответы (1)


чтобы сделать вывод команды переменной, выполните:

$variable="$(command)"

если вы хотите использовать grep, используйте синтаксис:

command | grep text

если вы хотите сделать операторы if, используйте синтаксис:

if [ some text ]; text
    commands
elif [ some text ]
    commands
else
    commands
fi

чтобы найти текст, проверьте эту корзину

grep -iw недействителен на хромбуке

rootfs имеет другой путь, зависящий от многих вещей, если вы хотите сохранить его, поскольку $rootfs выполняет эту команду

rootfs="$(rootdev -s)"

также вы допустили ошибку, это "|" а также "&"

command1 | command to edit command1
command1 || run this command if command1 fails
command1 && run this command if command1 succeeds 
person lucas    schedule 10.06.2019