Например, проверьте, $PWD
является ли подкаталог / home. Другими словами, я ищу операцию строки bash, чтобы проверить, начинается ли одна строка с другой.
25
Если вы хотите надежно проверить, является ли каталог подкаталогом другого, вам потребуется нечто большее, чем просто проверка префикса строки. Ответ Жиля подробно описывает, как правильно выполнить этот тест.
Но если вам нужна простая проверка префикса строки (может быть, вы уже нормализовали свои пути?), Это хорошо:
test "${PWD##/home/}" != "${PWD}"
Если $PWD
начинается с "/ home /", он удаляется с левой стороны, что означает, что он не будет совпадать с правой стороной, поэтому "! =" Возвращает true.
[ "${PWD##$VAR}" != "$PWD" ]
И если бы это был [code-golf] ( stackoverflow.com/questions/tagged/code-golf)question, вы бы меня избили двумя символами ;-) Также это выглядит более читабельно ...${PWD/#$HOME/\~}
"${PWD%%/subdir*}"
для определения, находится ли пользователь в данный моментsubdir
или в подкаталогеsubdir
, так как %% записывает с конца строки вместо начала. Это должно быть полезно всем, кто ищет дополнительную информацию о замене параметров: tldp.org/LDP/abs/html/parameter-substitution.htmlЧтобы проверить, является ли строка префиксом другой, в любой оболочке стиля Борна:
Тот же принцип работает для проверки суффикса или подстроки. Обратите внимание, что в
case
конструкциях, в отличие от имен файлов,*
совпадает любой символ, включая/
или начальный.
.В оболочках, которые реализуют
[[ … ]]
синтаксис (т. Е. Bash, ksh и zsh), его можно использовать для сопоставления строки с шаблоном. (Обратите внимание, что[
команда может только проверять строки на равенство.)Если вы специально проверяете, находится ли текущий каталог под ним
/home
, простого теста подстроки недостаточно из-за символических ссылок.Если
/home
это отдельная файловая система, проверьте, находится ли текущий каталог (.
) в этой файловой системе.Если у вас есть NetBSD, OpenBSD или GNU (то есть Linux)
readlink
, вы можете использоватьreadlink -f
для удаления символических ссылок из пути.В противном случае вы можете использовать,
pwd
чтобы показать текущий каталог. Но вы должны позаботиться о том, чтобы не использовать встроенную оболочку, если ваша оболочка отслеживаетcd
команды и сохраняет имя, которое вы использовали для доступа к каталогу, а не его «фактическое» местоположение.источник
Сырая версия:
Недостаток в том, что сначала нужно считать символы, и нельзя заменить
/home/
чем-то общим$1
.редактировать (спасибо @Michael) за обобщение для сравнения
$VAR
можно использоватьисточник
${#var}
это длина$var
, так что вы можете обобщить это как[ "${PWD:0:${#1}}" = "$1" ]
Я не очень хорошо понимаю вопрос, но чтобы найти родителя $ PWD , сделайте
dirname $PWD
. Чтобы найти родителя родителя, запуститеdirname $(dirname $PWD)
и так далее ...источник
/
. Хорошо, я могу проверить рекурсивно, но разве нет ничего проще?Использование
awk
:источник
Хм, жаль, что
[
нет возможности проверитьSTRING1 starts with STRING2
условие.Вы можете попробовать
echo $PWD | grep '^$VAR'
, но он может потерпеть неудачу интересными способами, когдаVAR
содержит специальные символы.awk
«Sindex
функция должна быть в состоянии сделать трюк. Но все это кажется слишком тяжелым для такой легкой вещи, чтобы проверить.источник
Если найденная часть пути найдена, я «очищаю» переменную:
источник