Usando a lista de verificação no arquivo Bash

2

Eu quero criar um script bash que faça o seguinte:

Crie uma pasta de projeto com base no Projeto - Nome, tudo bem.

Crie algumas pastas com base nas opções do usuário - esta é a pergunta principal

Aqui está o meu código

#!/bin/bash       
if [ ! -d /home/latreche/wienlaid ]; then
    mkdir -p /home/latreche/wienlaid;
fi;

cd /home/latreche/wienlaid
echo -n "Project Name:"
read pn
dir2='eval echo $dir1'
mkdir $pn
mkdir $pn/optimization
mkdir $pn/optimization/$pn
mkdir $pn/scf
mkdir $pn/scf/$pn

Aqui está a seção de entrada do usuário

echo "Do you wish to calculate elastic properties?"
select yn in "Yes" "No"; do
    case $yn in
    Yes ) mkdir $pn/elastic;mkdir $pn/elastic/$pn ;break;;
    No ) exit;;
    esac
done

echo "Do you wish to calculate band properties?"
select yn in "Yes" "No"; do
    case $yn in
    Yes ) mkdir $pn/band;mkdir $pn/band/$pn ;break;;
    No ) exit;;
    esac
done

echo "Do you wish to calculate DOS properties?"
select yn in "Yes" "No"; do
    case $yn in
    Yes ) mkdir $pn/dos;mkdir $pn/dos/$pn ;break;;
    No ) exit;;
    esac
done

echo "Do you wish to calculate Electronic Desnity properties?"
select yn in "Yes" "No"; do
    case $yn in
    Yes ) mkdir $pn/eldensity;mkdir $pn/eldensity/$pn ;break;;
    No ) exit;;
    esac
done

echo "Do you wish to calculate Optical properties?"
select yn in "Yes" "No"; do
    case $yn in
    Yes ) mkdir $pn/optic;mkdir $pn/optic/$pn ;break;;
    No ) exit;;
    esac
done

echo "Do you wish to use Hubbard DFT+U correction?"
select yn in "Yes" "No"; do
    case $yn in
    Yes ) mkdir $pn/$pn+"U";mkdir $pn/$pn+"U"/$pn ;break;;
    No ) exit;;
    esac
done

echo "Do you wish to use mBj correction?"
select yn in "Yes" "No"; do
    case $yn in
    Yes ) mkdir $pn/mbj;mkdir $pn/mbj/$pn ;break;;
    No ) exit;;
    esac
done

echo "Do you wish to Antiferromagnetic calculation?"
select yn in "Yes" "No"; do
    case $yn in
    Yes ) mkdir $pn/antiferro;mkdir $pn/antiferro/$pn ;break;;
    No ) exit;;
    esac
done

Isso está funcionando bem, mas há muita repetição e perda de tempo.

Eu queria fazer as tarefas acima usando uma lista de verificação, então tentei isso

DISTROS=$(whiptail --title "Do you want to" --checklist \
"Do you want to" 15 60 4 \
"AFM" "Do Antiferromagnetic calculation" OFF \
"SO" "Include Spin Orbital correction" ON \
"mBj" "Do mBj correction" OFF \
"DFT+U" "Do DFT+U calculation" ON \
"Elastic" "Calculate Elatic properties" OFF 3>&1 1>&2 2>&3)

exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "Your favorite distros are:" $DISTROS
else
    echo "You chose Cancel."
fi

O último código não está fazendo o que eu quero porque não sei como recuperar dados de decisão dele e usá-lo.

    
por Eddy 20.03.2016 / 18:46

1 resposta

1

Se você usar a whiptail ' --separate-output option , poderá ser mais fácil trabalhar com:

--separate-output
      For checklist widgets, output result one line at a time, with no
      quoting.  This facilitates parsing by another program.

Em segundo lugar, ao olhar para o seu script original select , parece-me que:

  1. Você tem um nome de pasta para cada seleção ( antiferro para Antiferromagnetic, $pn+U para DFT + U, etc.).
  2. Para qualquer escolha, suas ações são sempre:

    mkdir $pn/<folder-name>
    mkdir $pn/<folder-name>/$pn
    

Você pode simplificar consideravelmente seu script, tornando esses nomes de pastas a saída de whiptail . Em vez de mBj que você usa atualmente, por exemplo, use mbj como tag.

Então você pode fazer:

whiptail --title "Do you want to" --checklist --separate-output \
    "Do you want to" 15 60 8 \
    "elastic" "Calculate Elastic properties" OFF \
    "band" "Calculate band properties" OFF \
    "dos" "Calculate band properties" OFF \
    "eldensity" "Calculate Electronic Density properties" OFF \
    "optic" "Calculate Optical properties" OFF \
    "$pn+U" "Do DFT+U calculation" ON \
    "mbj" "Do mBj correction" OFF \
    "antiferro" "Do Antiferromagnetic calculation" OFF \
    3>&1 1>&2 2>&3 |
    while read choice
    do
        mkdir "$pn/$choice/$pn" -p
    done

E você pode usar a opção mkdir de -p :

-p, --parents
  no error if existing, make parent directories as needed
    
por muru 05.06.2016 / 23:02