Por ejemplo, verifique si $PWD
es un subdirectorio de / home. En otras palabras, estoy buscando una operación de cadena bash para verificar si una cadena comienza con otra.
25
Si desea probar de manera confiable si un directorio es un subdirectorio de otro, necesitará algo más que una verificación de prefijo de cadena. La respuesta de Gilles describe en detalle cómo hacer esta prueba correctamente.
Pero si desea una simple verificación de prefijo de cadena (¿tal vez ya ha normalizado sus rutas?), Esta es una buena:
test "${PWD##/home/}" != "${PWD}"
Si $PWD
comienza con "/ home /", se elimina en el lado izquierdo, lo que significa que no coincidirá con el lado derecho, por lo que "! =" Devuelve verdadero.
[ "${PWD##$VAR}" != "$PWD" ]
Y si esto fuera un [code-golf] ( stackoverflow.com/questions/tagged/code-golf)pregunta me habrías derrotado por dos caracteres ;-) También parece más legible ...${PWD/#$HOME/\~}
"${PWD%%/subdir*}"
para detectar si el usuario se encuentra actualmente ensubdir
un subdirectoriosubdir
, ya que %% captura desde el final de la cadena en lugar del principio. Esto debería ser útil para cualquiera que busque más información sobre la sustitución de parámetros: tldp.org/LDP/abs/html/parameter-substitution.htmlPara probar si una cadena es un prefijo de otra, en cualquier shell de estilo Bourne:
El mismo principio funciona para una prueba de sufijo o subcadena. Tenga en cuenta que en las
case
construcciones, a diferencia de los nombres de archivo,*
coincide con cualquier carácter, incluido uno/
o una inicial.
.En shells que implementan la
[[ … ]]
sintaxis (es decir, bash, ksh y zsh), se puede usar para hacer coincidir una cadena con un patrón. (Tenga en cuenta que el[
comando solo puede probar cadenas para la igualdad).Si está probando específicamente si el directorio actual está debajo
/home
, una simple prueba de subcadena no es suficiente, debido a los enlaces simbólicos.Si
/home
es un sistema de archivos propio, pruebe si el directorio actual (.
) está en ese sistema de archivos.Si tiene NetBSD, OpenBSD o GNU (es decir, Linux)
readlink
, puede usarreadlink -f
para quitar enlaces simbólicos de una ruta.De lo contrario, puede usar
pwd
para mostrar el directorio actual. Pero debe tener cuidado de no utilizar un shell integrado si su shell rastrea loscd
comandos y mantiene el nombre que utilizó para llegar al directorio en lugar de su ubicación "real".fuente
Versión cruda:
Tiene la desventaja de que primero hay que contar los caracteres y no se puede reemplazar
/home/
por algo general$1
.editar (gracias @Michael) por la generalización para comparar con
$VAR
uno puede usarfuente
${#var}
es la longitud de$var
, por lo que puede generalizar como[ "${PWD:0:${#1}}" = "$1" ]
No entiendo muy bien la pregunta, pero para encontrar al padre de $ PWD , sí
dirname $PWD
. Para buscar el padre del padre, ejecutedirname $(dirname $PWD)
, etc.fuente
/
. Ok, podría verificar de forma recursiva, pero ¿no hay algo más fácil?Utilizando
awk
:fuente
Hm, es una pena que
[
no tenga la opción de probar laSTRING1 starts with STRING2
condición.Puede intentarlo
echo $PWD | grep '^$VAR'
, pero puede fallar de maneras interesantes cuandoVAR
contiene símbolos especiales.awk
Laindex
función de debería poder hacer el truco. Pero todo esto parece demasiado pesado para una cosa tan fácil de probar.fuente
Si se encuentra la parte buscada de la ruta, "vacío" la variable:
fuente