sudo fuser /dev/dm-31
/dev/dm-31: 24799
ps -fp 24799
vbox 24799 1 2 May18 ? 04:37:39 /usr/lib/virtualbox/VBoxHeadle.....
или при использовании LVM2 (на Ubuntu, SLES может варьироваться подробно):
ls -l /dev/mapper | grep dm-1$
lrwxrwxrwx 1 root root 7 May 11 19:01 vg_diablo-var -> ../dm-1
Можно также хотеть проверить man dmsetup
например. dmsetup info
[
просто другой символ, согласно удару; это не саморазграничивает. Таким образом, необходимо поместить пробелы вокруг [
и ]
. Хотя Вы были бы более обеспеченным использованием [[
и ]]
.
И команда после if
(да, [
команда), должен быть завершен с a ;
или новая строка.
Наконец, ==
(который не является posix, FWIW; posix предпочитает =
) строковое равенство, не числовое равенство.
Таким образом, Вы, возможно, имели в виду:
if [[ $a -eq 1 ]]; then echo yes; fi
Но Вы могли использовать арифметическую оценку вместо этого:
if ((a == 1)); then echo yes; fi
(В арифметике evalution, равенство ==
, и Вам не нужно $
перед именами переменной. Я знаю, что это сбивает с толку.)
Для получения дополнительной информации о [
: help test
.О нас [[
:помощь [[
(который основывается test
).О нас ((
: help let
.О нас bash
: man bash
[
команда в Bash, точно так же, как любая из других команд такой как if
, while
, и т.д. Вы видите это, если Вы проверяете страницу справочника дважды:
$ man [
NAME
bash, :, ., [, alias, bg, bind, break, builtin, caller, cd, command, .....
Можно также сказать, что это - реальная команда с этим примером:
$ type -a [
[ is a shell builtin
[ is /usr/bin/[
Первым результатом является встроенная версия [
это - часть Bash. Второй является версия [
это включено с GNU coreutils.
На Fedora Вы видите, какого об/мин это является часть:
$ rpm -qf /usr/bin/[
coreutils-8.5-7.fc14.x86_64
Учитывая это необходимо удостовериться, что существуют пробелы вокруг любых команд так, чтобы они были проанализированы правильно.
Выполнение этого:
$ if [$a == 1] ...
Было бы идентично этому:
$ lsblah
bash: lsblah: command not found...
ls
команда не может быть проанализирована правильно, потому что она не буферизуется с пробелами так, чтобы это было способно синтаксическим анализом.
Используйте:
if [ "$a" = 1 ]; then echo yes; fi
Ошибка, о которой сообщает bash:-bash :синтаксическая ошибка рядом с неожиданным токеном `}' — это попытка направить автора кода к ошибке, но bash может легко ошибиться и сигнализировать об ошибке. ошибка там, где ее нет.
На самом деле в коде есть несколько ошибок. Но давайте воспроизведем ошибку, о которой сообщает bash, в более простой строке кода:
$ if true then { true; } fi;
bash: syntax error near unexpected token `}'
Если линия немного изменится, сообщение об ошибке будет примерно в том же месте, но немного в другом:
$ if true then true; fi;
bash: syntax error near unexpected token `fi'
И это также сообщает об ошибке:
$ if true; then; true; fi;
bash: syntax error near unexpected token `;'
Все это происходит потому, что требуемый синтаксис (, скопированный из руководства ), является:
if list; then list; fi;
где list
— одна или несколько простых команд (или каналов, или составных команд ), которые заканчиваются новой строкой или точкой с запятой . Обратите внимание, что, как правило, новую строку можно заменить точкой с запятой и наоборот.
Это действительно (синтаксическая ошибка не сообщается)
if true; then true; fi
Это также верно:
if true
then true
fi
или:
if echo start; true; then echo decision; true; echo next; fi;
Или другие варианты перевода строки и/или точки с запятой.
Конечно, последняя точка с запятой не обязательна, но и не запрещена.
Кроме того,[
и ]
требуют, чтобы (обычно )пробелы различались bash как слова (токены )и поэтому воспринимались как тест
if [ $a == 1 ]; then { echo 'yes'; } fi; # still subtly incorrect.
Но, кроме того, расширение переменной должно быть заключено в кавычки ("$a"
), ==
допустимо в bash, но может быть недействительным в некоторых других оболочках, поэтому нам лучше использовать =
внутри одиночного [ ]
, 'yes'
технически не нужно заключать в кавычки (, даже если это не вредно ), и фигурные скобки { }
не нужны для одной простой команды, все это делает эту версию лучше :
if [ "$a" = 1 ]; then echo yes; fi
Или, если вы решите использовать bash/ksh/zsh[[ ]]
:
if [[ $a == 1 ]]; then echo yes; fi
И, наконец, тест с =
или ==
является сравнением строк, а не числовым, поэтому +1
будет не равным 1
, даже если они находятся в значении. Для численного тестирования вы можете использовать -eq
.
if [ "$a" = 1 ]; then echo yes; fi
или
if test "$a" -eq 1 ; then echo yes; fi
или
if /usr/bin/test "$a" -eq 1;then echo yes;fi
Оболочка вырежет командную строку для проверки в полу -двоеточии (, а затем добавит аргументы в команду проверки -строку -argc/argv, если она не была встроенной -в)
Но это не работает:
if test "$a"-eq 1; then echo yes; fi
Где оболочка должна разделить аргументы для проверки? поэтому он не будет разбивать строку «+1 -eq 1»
То, что тест является отдельной программой, становится очевидным, если сделать это:
sh:~$ LANG=C sh -c 'a=+1 ; if test "$a"-eq 1 ; then echo yes ; fi'
sh: 1: test: +1-eq: unexpected operator
по сравнению с этим:
sh:~$ LANG=C sh -c 'a=+1 ; if /usr/bin/test "$a"-eq 1;then echo yes;fi'
/usr/bin/test: missing argument after '1'
Хм, разные сообщения об ошибках для одних и тех же аргументов для проверки...