Puis-je utiliser une variable dans un fichier chemin d'accès en bash? Si oui, comment?
Je suis en train d'écrire un petit script shell pour trouver les plus récemment ajoutés fichier dans un répertoire, puis déplacez ce fichier ailleurs. Si j'utilise:
ls -t ~/directory | head -1
et puis cela stocker dans la variable VARIABLE_NAME, pourquoi ne puis-je pas alors puis déplacer ce dossier ~/otherdirectory via:
mv ~/directory/$VARIABLE_NAME ~/otherdirectory
J'ai cherché et Cherché sur google, mais il ne semble pas avoir d'information sur l'utilisation des variables dans les chemins de fichiers? Est-il une meilleure façon de le faire?
Edit: Voici la partie du script:
ls -t ~/downloads | head -1
read diags
mv ~/downloads/$diags ~/desktop/testfolder
Oui, vous pouvez utiliser des variables de chemin d'accès. Ce n'est pas nécessairement le problème que vous avez rencontré. Vous pouvez rencontrer certains problèmes comme par exemple l'expansion de
Ce n' $NOM_VARIABLE contenir?
J'ai mis à jour le post avec le script de la partie qui gère le stockage/déménagement de la variable.
La partie du script est insuffisant, car il ne montre pas comment VARIABLE_NAME reçoit sa valeur. En outre, il serait utile si vous décrit l'effet observé: Avez-vous un message d'erreur, ou le fichier à afficher dans un endroit différent?
La première partie du script (non publié) crée un couple répertoires dans /de bureau et fonctionne très bien. Quand j'arrive à un point où je suis de déplacer le fichier, il me semble que le script se bloque et rien de ce qui se passe réellement.
~
. Ou vous pouvez avoir des problème avec les noms de fichiers et les noms de répertoire contenant l'espace. Je ne suis pas un lecteur d'esprit donc je ne serait pas nécessairement savoir ce que les erreurs que vous avez lorsque vous avez fait une tentative.Ce n' $NOM_VARIABLE contenir?
J'ai mis à jour le post avec le script de la partie qui gère le stockage/déménagement de la variable.
La partie du script est insuffisant, car il ne montre pas comment VARIABLE_NAME reçoit sa valeur. En outre, il serait utile si vous décrit l'effet observé: Avez-vous un message d'erreur, ou le fichier à afficher dans un endroit différent?
La première partie du script (non publié) crée un couple répertoires dans /de bureau et fonctionne très bien. Quand j'arrive à un point où je suis de déplacer le fichier, il me semble que le script se bloque et rien de ce qui se passe réellement.
OriginalL'auteur TheVideotapes | 2016-02-22
Vous devez vous connecter pour publier un commentaire.
Vous pouvez effectuer les opérations suivantes dans votre script:
Dans ce cas,
diags
est affectée de la valeur dels -t ~/downloads | head -1
, qui peut être appelée parmv
.OriginalL'auteur Alexander Maru
Les commandes suivantes
sont probablement pas ce que vous avez l'intention: la commande de lecture ne reçoit pas l'aide de la commande avant. Au lieu de cela, il attend l'entrée stdin, qui est pourquoi vous croyez que le script de "blocage". Peut-être que vous avez voulu faire ce qui suit (au moins c'était ma première tentative erronée à fournir une meilleure solution):
Cependant, ce sera (comme mentionné par alvits) également ne pas fonctionner, parce que chaque élément de la pipe fonctionne comme une commande séparée: La variable diags n'est donc pas partie de la société mère de shell, mais d'un sous-processus.
La bonne solution est donc:
Il existe, cependant, d'autres problèmes possibles, ce qui rendrait le subséquentes commande mv échouer:
Essayez d'exécuter bash en mode debug, c'est-à-bash -x. Vous pouvez aussi mettre le x dans la ligne shebang: #/bin/bash -x
C'est un très bien connu de problème avec l'utilisation des variables dans un sous-shell ou de tuyaux. La variable locale
$diags
a été affecté à la sortie dels -t ~/downloads | head -1
, cependant, il a été perdu après l'exécution de la ligne. Vous devez utiliserprintf -v diag '%s' $(ls -t ~/downloads | head -1)
.Oups, certes vous avez raison, la corriger qu'une partie de la réponse.
Merci à vous deux! Un ami m'a montré shellcheck.net et il a vu le shell interne est exécuté question tout de suite, j'ai donc été en mesure de comprendre cela. J'ai fini avec
diags=$(ls -t ~/downloads | head -1)
et cela a été respecté dansmv -v ~/downloads/"$diags" ~/desktop/testfolder
OriginalL'auteur Dirk Herrmann