在 Bash 文件中使用清单

在 Bash 文件中使用清单

我想创建一个执行以下操作的 bash 脚本:

根据 Project 创建一个项目文件夹——命名这个就可以了。

根据用户选择创建一些文件夹——这是主要问题

这是我的代码

#!/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

这是用户输入部分

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

这种方法虽然有效,但是存在大量重复和浪费时间的情况。

我想使用清单来完成上述任务,所以我尝试了这个

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

最后的代码没有实现我想要的效果,因为我不知道如何从中检索决策数据并使用它。

答案1

如果你使用whiptail--separate-output选择,使用起来可能更容易:

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

其次,从查看您原来的select基于 的脚本来看,在我看来:

  1. 每个选择都有一个文件夹名称(antiferro对于反铁磁、$pn+U对于DFT+U等)。
  2. 对于任何选择,你的行动始终是:

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

通过将这些文件夹名称设为 的输出,您可以大大简化脚本whiptailmBj例如,使用 而不是您当前使用的mbj作为标签。

然后你可以这样做:

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

您可以使用mkdir-p选项:

-p, --parents
  no error if existing, make parent directories as needed

相关内容