2017-06-24 2 views
1

J'essaie de décomposer mon script en parties plus petites pour le rendre plus organisé et plus lisible.Séparer le script bash en indices lorsque ce code contient des affectations de variables, des boucles et des entrées de stdin

Je voudrais prendre du code (qui contient une boucle while, une affectation de variable et une entrée utilisateur) et placer ce code dans un autre fichier. Voici un exemple de mon code. Il fonctionne exactement comme il le devrait.

script qui fonctionne

var1="hello" 
var2="world" 
echo "Defaults: Var1(a)-$var1 Var2(b)-$var2" 
read -p "Change Defaults? "; 
while [ $REPLY != "n" ] 
do 
     if [ $REPLY == "a" ] 
     then 
      read -p "Var1 = " 
      var1=$REPLY 
     elif [ $REPLY == "b" ] 
     then 
      read -p "Var2 = " 
      var2=$REPLY 
     fi 
     read -p "Change Defaults? "; 
done 
echo "$var1 $var2" 

Je voudrais que mon script pour effectuer la même chose, mais il suffit de regarder différentes et être structuré différemment

Ce que je voudrais le script pour ressembler

var1="hello" 
var2="world" 
echo "Defaults: Var1(a)-$var1 Var2(b)-$var2" 
cmd=$(cat other_file.txt) 
eval $cmd 
echo "$var1 $var2" 

Où other_file.txt contient

read -p "Change Defaults? "; 
while [ $REPLY != "n" ] 
do 
     if [ $REPLY == "a" ] 
     then 
      read -p "Var1 = " 
      var1=$REPLY 
     elif [ $REPLY == "b" ] 
     then 
      read -p "Var2 = " 
      var2=$REPLY 
     fi 
     read -p "Change Defaults? "; 
done 

Répondre

2

Utilisez . (alias source) pour importer une définition de fonction.

other_file.bash contiendrait (avec quelques améliorations)

foo() { 
    local REPLY 
    read -p "Change Defaults? " 
    while [[ $REPLY != n ]] 
    do 
     if [[ $REPLY == a ]] 
     then 
      read -p "Var1 = " var1 
     elif [[ $REPLY == b ]] 
     then 
      read -p "Var2 = " var2 
     fi 
     read -p "Change Defaults? " 
    done 
} 

Et dans votre script:

. otherfile.bash 

var1="hello" 
var2="world" 
echo "Defaults: Var1(a)-$var1 Var2(b)-$var2" 
foo 
echo "$var1 $var2" 
0

Commencez par déplacer le code commun dans une fonction. Lorsque la fonction fonctionne correctement, vous pouvez la déplacer dans un fichier d'inclusion. J'ai inventé le nom "include", car il ressemble à d'autres langues.
Un fichier d'inclusion peut également être inclus par d'autres fichiers. Assurez-vous donc de bien avoir testé votre fonction avant de la "déployer" dans un fichier d'inclusion.
Le fichier d'inclusion peut être inclus en l'approvisionnant (en utilisant source includefile de . includefile). Vous pouvez configurer un dossier avec uniquement des fichiers d'inclusion. J'ai un projet avec des sous-répertoires bin, shlib, config et sql. Le dossier shlib contient tous les fichiers. Lorsque vous faites une fonction, vous pouvez passer plus de temps dans ce qu'elle peut. Je changerais votre boucle changedefault avec

changevars() { 
    if [ $# -eq 0 ]; then 
     echo "${FUNCNAME} should be called with at least 1 argument" 
     return 
    fi 
    PS3="Change Defaults (n to quit)?" 
    select opt in "[email protected]" 
    do 
    if [[ $REPLY = n ]]; then 
     break; 
    fi 
    [[ $REPLY =~ ^[0-9]+$ ]] && [ $REPLY -le $# ] && 
     read -p "$opt (${!opt}) = " ${opt} 
    done 
} 

et appeler cette fonction avec

source yourpath/shlib/util.sh 
var1="hello" 
var2="world" 
echo "Defaults: Var1(a)-$var1 Var2(b)-$var2" 

changevars var1 var2 

echo "$var1 $var2"