Как хранить полный путь каталога из скрипта Bash?

[ - та же команда, что и test . В некоторых системах * nix одна ссылка на другую. Например, если вы запустите:

strings /usr/bin/test 
strings /usr/bin/[

, вы увидите тот же результат.

Большинство sh-shells / posix-shells включают встроенные команды [ и test . То же самое верно и для echo . В большинстве оболочек есть как команда / bin / echo , так и встроенная . Вот почему иногда кажется, что, например, echo не работает одинаково в разных системах.

test или [ возвращают только код выхода 0 или 1 . Если проверка прошла успешно, код выхода равен 0.

# you can use [ command but last argument must be ] 
# = inside joke for programmers 
# or use test command. Args are same, but last arg can't be ] :)
# so you can't write 
#    [-f file.txt] because [-f is not command and last argument is not ]
# after [ have to be delimiter as after every commands
[ -f file.txt ] && echo "file exists" || echo "file does not exist"
test -f file.txt && echo "file exists" || echo "file does not exist"
[ 1 -gt 2 ] && echo yes || echo no
test 1 -gt 2  && echo yes || echo no
# use external command, not builtin
/usr/bin/[ 1 -gt 2 ] && echo yes || echo no

Вы также можете использовать [ с if :

if [ -f file.txt ] ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi
# is the same as
if test -f file.txt  ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi

Но вы можете использовать if с каждая команда, , если предназначена для проверки кода выхода. Например:

cp x y 2>/dev/null && echo cp x y OK ||  echo cp x y not OK

Или, используя if :

if cp x y 2>/dev/null ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

Вы можете получить тот же результат, используя только команду test для проверки сохраненного кода выхода. в переменную stat :

cp x y 2>/dev/null 
stat=$?
if test "$stat" = 0 ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

Вы также можете использовать [[]] и (()) для тестирования, но это не то же самое, что [ и test , несмотря на почти одинаковый синтаксис:

Наконец, чтобы узнать, что такое команда, вы можете использовать:

type -a command
2
12.10.2018, 14:21
5 ответов

Для каталога вы можете использовать команду pwdили переменную $PWD.

Пример

$ DIRECTORY=.
$ TRUEDIR=$(cd -- "$DIRECTORY" && pwd)
$ echo $TRUEDIR
/home/steve
$
2
27.01.2020, 22:08

Использовать реальный путь:

echo "$(realpath $DIRECTORY)"
1
27.01.2020, 22:08

Вы можете добавить проверку абсолютного пути:

read DIRECTORY
[ "${DIRECTORY:0:1}" = "/" ] || DIRECTORY="$PWD/$DIRECTORY"
echo "$DIRECTORY"
0
27.01.2020, 22:08

Абсолютный путь начинается с /, относительный — нет. Вы можете превратить относительный путь в абсолютный, добавив путь к текущему каталогу и косую черту перед относительным путем.

case $DIRECTORY in
  /*) DIRECTORY="$PWD/$DIRECTORY";;
esac

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

Результирующий путь может содержать символические ссылки. Это почти всегда правильно, но если вы хотите канонизировать символические ссылки, см. Преобразование относительного пути в абсолютный путь без символической ссылки

1
27.01.2020, 22:08

realpath (принятый ответ )устарел и недоступен в большинстве установок. Я бы использовал его замену:

readlink -f "$DIRECTORY"

Он также обрабатывает ~и./ и будет следовать символическим ссылкам.

Если вы хотите разрешить пользователю вводить несуществующий $DIRECTORY, используйте:

readlink -m "$DIRECTORY"
-1
27.01.2020, 22:08

Теги

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