I have this code bash code called xyz_to_mol
:
CARBONS=$(grep -ow "C" $1 | wc -l)
HYDROGENS=$(grep -ow "H" $1 | wc -l)
OXYGENS=$(grep -ow "O" $1 | wc -l)
ATYPES=0
ARRAY=($CARBONS $HYDROGENS $OXYGENS)
for i in "${ARRAY[@]}"
do
if [ $i -gt 0 ]; then
((ATYPES =1))
fi
done
echo "Choose co0, co1 or co2 basis set"
read BASIS_SET
echo "BASIS"
echo "$BASIS_SET"
echo ""
echo ""
echo "Atomtypes="$ATYPES" Generators=0 Integrals=1.00D-15 Angstrom"
echo "Charge=6.0 Atoms="$CARBONS""
grep "C" $1
echo "Charge=1.0 Atoms="$HYDROGENS""
grep "H" $1
if [ $OXYGENS -gt 0 ]; then
echo "Charge=8.0 Atoms="$OXYGENS""
grep "O" $1
fi
This works just as I want except for one thing: The line "Choose co0, co1 or co2 basis set"
should not be written to output file but instead as an instruction to the command line for the user. So If I use the script like this:
xyz_to_mol ketone.xyz > ketone.mol
the user should see an instruction: "Choose co0, co1 or co2 basis set"
. Then he or she should write co0
, co1
or co2
and the output file ketone.mol
should not contain the line "Choose co0, co1 or co2 basis set"
. How can I implement this?
CodePudding user response:
Prompts are typically written to standard error, not standard output. You can do that explicitly:
echo "Choose co0, co1 or co2 basis set" >&2
read BASIS_SET
or implicitly with the -p
option to read
:
read -p "Choose co0, co1, or co2 basis set" BASIS_SET
CodePudding user response:
One alternative is to send the file name as a parameter and write to the output file inside your script instead:
echo "BASIS" > $2
echo "$BASIS_SET" >> $2
echo "" >> $2
echo "" >> $2
echo "Atomtypes="$ATYPES" Generators=0 Integrals=1.00D-15 Angstrom" >> $2
echo "Charge=6.0 Atoms="$CARBONS"" >> $2
grep "C" $1 >> $2
echo "Charge=1.0 Atoms="$HYDROGENS"" >> $2
grep "H" $1 >> $2
if [ $OXYGENS -gt 0 ]; then
echo "Charge=8.0 Atoms="$OXYGENS"" >> $2
grep "O" $1 >> $2
fi
And call the script like:
xyz_to_mol ketone.xyz ketone.mol