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.
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.
Respuestas:
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/#$HOME/\~}
"${PWD%%/subdir*}"
para detectar si el usuario se encuentra actualmente en subdir
un subdirectorio subdir
, 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.html
Para probar si una cadena es un prefijo de otra, en cualquier shell de estilo Bourne:
case $PWD/ in
/home/*) echo "home sweet home";;
*) echo "away from home";;
esac
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).
if [[ $PWD/ = /home/* ]]; then …
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.
if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
echo 'The current directory is on the /home filesystem'
fi
Si tiene NetBSD, OpenBSD o GNU (es decir, Linux) readlink
, puede usar readlink -f
para quitar enlaces simbólicos de una ruta.
case $(readlink -f .)/ in $(readlink -f /home)/*) …
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 los cd
comandos y mantiene el nombre que utilizó para llegar al directorio en lugar de su ubicación "real".
case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
"$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …
Versión cruda:
[ ${PWD:0:6} = "/home/" ]
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 usar
[ "${PWD:0:${#VAR}}" = $VAR ]
${#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, ejecute dirname $(dirname $PWD)
, etc.
/
. Ok, podría verificar de forma recursiva, pero ¿no hay algo más fácil?
Utilizando awk
:
echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'
Hm, es una pena que [
no tenga la opción de probar la STRING1 starts with STRING2
condición.
Puede intentarlo echo $PWD | grep '^$VAR'
, pero puede fallar de maneras interesantes cuando VAR
contiene símbolos especiales.
awk
La index
función de debería poder hacer el truco. Pero todo esto parece demasiado pesado para una cosa tan fácil de probar.
Si se encuentra la parte buscada de la ruta, "vacío" la variable:
[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
[ "${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 ...