
我想创建一个执行以下操作的 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
基于 的脚本来看,在我看来:
- 每个选择都有一个文件夹名称(
antiferro
对于反铁磁、$pn+U
对于DFT+U等)。 对于任何选择,你的行动始终是:
mkdir $pn/<folder-name> mkdir $pn/<folder-name>/$pn
通过将这些文件夹名称设为 的输出,您可以大大简化脚本whiptail
。mBj
例如,使用 而不是您当前使用的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