Я пишу bash-скрипт, куди хочу вийти, якщо користувач не має root. Умовно працює нормально, але сценарій не виходить.
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Я намагався використовувати &&
замість, ;
але не працюю.
Я пишу bash-скрипт, куди хочу вийти, якщо користувач не має root. Умовно працює нормально, але сценарій не виходить.
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Я намагався використовувати &&
замість, ;
але не працюю.
Відповіді:
Ви можете зробити це так:
[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }
("звичайний" умовний вираз з арифметичним двійковим оператором у першому твердженні), або:
(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }
(арифметичне оцінювання для першого тесту).
Зверніть увагу на зміну ()
-> {}
- фігурні дужки не породжують нижню частину корпусу. (Шукати man bash
"нижню оболонку".)
[[
для порівняння чисел, використовувати ((
.
[[
- це добре, якщо ви використовуєте -eq
замість цього ==
.
(( EUID )) && ...
В дужках навколо цих команд створюється піддіаграма . Ваша піддіаграма лунає "Повинен запустити скрипт", і тоді ви скажете підпакеті вийти (хоча це вже було б, оскільки команд більше не було). Найпростіший спосіб виправити це, мабуть, просто використовувати if
:
if [[ `id -u` != 0 ]]; then
echo "Must be root to run script"
exit
fi
id -u == 0
, що буде означати , що ви є корінь. Ти хочеш [[ $(id -u) != 0 ]]; then
.
[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;
також зверніть увагу на те $UID
, що економить нерест процесу. Я думаю, ти можеш навіть віддати перевагу $EUID
.
((UID)) && echo 'You have to be root.' && exit 1
.
set -e
буде скасований. Одним із варіантів вирішення цієї проблеми є [ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
.
З баш :
[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
echo
не вдасться (наприклад, тому, що stdout не можна записати ).
Дужки навколо ||
і &&
не потрібні, оскільки вони є правильними асоціативними. Наступні два вирази еквівалентні:
expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }
Тож &&
замість цього ;
буде добре працювати, як echo
повернеться правда.
[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
це може допомогти тобі, в баш
[oracle@rac1 ~]$ which bash
/bin/bash
[oracle@rac1 ~]$ cat test1.sh
if [ `id -u` != 0 ]
then
echo "Must be root to run the script
"
exit
fi
exit 1
щоб зрозуміти батьківський процес, що сталася проблема.