Я написал сценарий, в котором есть несколько вложенных операторов if.
if [ choice = "1" ]; then
if [ $package == *".tar.gz" ]; then //Could not find fi for this if
tar -zxvf folder.tar.gz
if [ $package == *".tar.bz2" ]; then
tar -xvfj folder.tar.bz2
./configure
make
make install
elif [ choice = "2" ]; then
dpkg -i package.deb
fi
//Expected fi
Написали, где я получаю fi ошибки в скрипте.
Основная структура условий следующая:
if [ condition ]; then
dosomething
fi
С else:
if [ condition ]; then
dosomething
elif [ condition ]; then
dootherthing
else
thelastchancetodosomething
fi
Кроме того, я думаю, что это условие в вашем коде неверно:
if [ $package == *".tar.gz" ]; then
tar -zxvf folder.tar.gz
fi
Если я правильно понимаю, это должно быть что-то вроде:
if echo $package | grep -qF ".tar.gz"; then
tar -zxvf $package
fi
О, и используйте #
для комментариев вместо //
.
Исправление вашего примера и улучшение отступа, чтобы сделать его более четким:
if [ choice = "1" ]; then
if echo $package | grep -qF ".tar.gz"; then
tar -zxvf $package
# You need to close previous `if` with a `fi` you want to use another
# `if` here below, but we can use `elif`, so we don't need to close it.
elif echo $package | grep -qF ".tar.bz2"; then
tar -xvfj $package
fi
cd ${package%.*.*} # this removes the .tar.* extension
./configure
make
make install
elif [ choice = "2" ]; then
dpkg -i $package
fi
Это типичный случай, когда вы хотите использовать case
:
case $choice in
(1)
case $package in
(*.tar.gz) tar -zxvf folder.tar.gz;;
(*.tar.bz2) tar -jxvf folder.tar.bz2;;
esac &&
./configure &&
make &&
make install
;;
(2)
dpkg -i package.deb
;;
esac