Warum wird am zu lesenden Eingang keine Tilde-Erweiterung durchgeführt?

7

Warum ist in der Ausgabe dieses Skripts keine Tilde-Erweiterung aufgetreten?

#!/bin/bash

read -p "Enter filename: " fname
if [[ -d $fname ]]
then
        echo "$fname is a directory"
else
        echo "$fname is not a directory"
fi

Ausgabe:

$ bash -x test_cd.sh 
+ read -p 'Enter filename: ' fname
Enter filename: ~/Music
+ [[ -d ~/Music ]]
+ echo ' ~/Music is not a directory'
 ~/Music is not a directory
jestadi
quelle

Antworten:

7

Dies liegt einfach daran, readdass vor dem Speichern der Zeichenfolge keine Tilde-Erweiterung durchgeführt wird und später auch kein variabler Inhalt ausgeführt wird. Sie können $HOMEstattdessen verwenden und eingeben

$HOME/Music

oder lassen Sie das Skript testen ~/und ersetzen (aus dieser Antwort entnommen ):

case "$fname" in "~/"*)
  fname="${HOME}/${x#"~/"}"
esac

Sie können auch verwenden bashExpansion Parameter ersetzen ~/mit $HOMEam Anfang der Zeichenfolge:

if [[ -d ${fname/#~\//$HOME\/} ]]

Diese Variable wird erweitert, bevor die Substitution durchgeführt wird.

Dessert
quelle