LAMP サーバーを簡単にインストールするには、スクリプトに整数式が必要です。

LAMP サーバーを簡単にインストールするには、スクリプトに整数式が必要です。

私はLinuxに関しては初心者です。

先生は、さまざまなパッケージ(MYSQLのみ、PHP、またはすべてのパッケージなど)をインストールするオプションとともに、LAMPサーバーをインストールするスクリプトを生成するように指定しました。

合格後に修正されたコードは次のとおりです。https://shellcheck.net/

#!/bin/bash

function apache {
 sudo apt update
 sudo apt install apache2
 #ja deaktivizē apache2 serveri un izmetas errors, kad mēģina to aktivizēt:
    #sudo echo "deb http://archive.ubuntu.com/ubuntu trusty main universe restricted multiverse" > /etc/apt/sources.list

   #sudo apt-get update
   #sudo apt-get purge apache2*
   #sudo apt-get install apache2
#sudo service apache2 start
#sudo service apache2 status #Pārbaudīt vai viss strādā pareizi
 sudo ufw app list
 sudo ufw allow in "Apache" #Šis profils atver tikai 80. portu (parasta, nešifrēta tīmekļa trafika).
 sudo ufw enable #aktivizē ugunsmūri
 sudo ufw status #pārbauda vai 80 portam ir atļauts iziet caur ugunsmūri
 echo -e "Lai pārbaudītu vai viss sanāca, ieejiet jūsu pārlūkprogramma un ierakstiet šo http://jusu_servera_IP, Ip adresi var iegūt ar komandu hostname -I, tālāk ir dota jūsu IP adrese:"
 hostname -I #parādīs IP adresi(pirmā)
 echo "Ievadiet to konsolē, lai to varētu izmantot vēlāk" #write it in console to use it later
 read -r ip_address
 
 echo "Ievadi savu domēna vārdu"  #input your domain name
read -r domain




sudo mkdir /var/www/"$domain"
sudo chown -R "$USER":"$USER" /var/www/"$domain"
    
cd /etc/apache2/sites-available/

echo "<VirtualHost *:80>
    ServerName $domain
    ServerAlias www.$domain
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/$domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>" > "$domain".conf
    
echo "Direktorija $domain un fails $domain.conf ir izveidoti"
    

    
sudo a2ensite "$domain"
sudo a2dissite 000-default
sudo systemctl reload apache2
sudo apache2ctl configtest
sudo systemctl reload apache2


cd /var/www/"$domain"

echo "<html>
  <head>
    <title>$domain majaslapa</title>
  </head>
  <body>
    <h1>Sveiki pasaule!</h1>

    <p>Si ir galvena lapa jusu majaslapai <strong>$domain</strong>.</p>
  </body>
</html>" > index.html

#xdg-open http://localhost #lietojot operu met brīdinājumus
echo "Ierakstiet pārlūkprogramma http://localhost vai http://$ip_address"
}



function remove_apache {
#sudo service apache2 stop
sudo apt-get purge apache2 apache2-utils apache2.2-bin apache2-common
sudo apt-get autoremove --purge
echo -e "Vai jūs gribat arī noņemt apache izveidotās direktorijas (ja/ne) ?"
read -r manual

while [[ "$manual" != "ja" && "$manual" != "ne" ]]; do #salidzina && = AND

    echo "Jums jaievada ja vai ne, lai turpinātu."
    read -r manual
done

if  [ "$manual" = ja ]; then 
    echo "Lai izdzēstu direktorijas, kuras jūs gribat izdzēst ar komandu sudo rm -Rf (piemēram, sudo rm -Rf /etc/apache2 /usr/lib/apache 2), tālāk būs dotas jūsu direktorijas:(ja tomēr nevēlaties izdzēst šīs direktorijas, ierakstiet jebko citu)"
whereis apache2
    read -r remove_direktorijas
    
$remove_direktorijas

elif [ "$manual" = ne ]; then
    echo -e "Apache2 ir atinstalēta."

fi

}


function mysql {
sudo apt install mysql-server
echo -e "Tālāk varēs izvēlēties vai instalēt mysql drošību ar VALIDATE PASSWORD PLUGIN vai bez(spiežot jebkuru citu pogu izņemot y vai Y)"
echo -e "Tālāk prasīs MYsql administrātora paroli vienalga vai jūs VALIDATE PASSWORD PLUGIN instalējāt vai nē. Un citas lietas, kas būs aprakstītas tālāk." 
sudo mysql_secure_installation
echo -e "Lai izietu no MySQL konsoles rakstiet exit" 
sudo mysql
}

function remove_mysql {
sudo apt-get remove --purge mysql*
}

#function php {
#sudo apt install php libapache2-mod-php php-mysql | man ieķērās instalācija(loop) ja liku funkcijā šo
#sudo systemctl restart apache2
#php -v
#}

function remove_php {
sudo apt-get purge php7.*
sudo apt-get autoclean
sudo apt-get autoremove
}

function phpmyadmin {
sudo apt update
echo -e "Parādīsies uzvedne, izvelāties apache2(jānospiež taustiņš space un enter)" 
echo -e "Kad tiek vaicāts, vai datu bāzes iestatīšanai jāizmanto dbconfig-common, atlasiet Jā"
sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl
sudo phpenmod mbstring
sudo systemctl restart apache2
#xdg-open http://localhost/phpmyadmin
echo "Ierakstiet pārlūkprogramma http://localhost/phpmyadmin vai http://$ip_address/phpmyadmin"
}

function remove_phpmyadmin {
sudo apt-get remove phpmyadmin
sudo apt-get purge phpmyadmin
sudo apt-get autoremove
}

while  true 
do
echo "1. Instalēt Apache"
echo "2. Instalēt MySQL"
echo "3. Instalēt PHP"
echo "4. Instalēt phpMyAdmin"
echo "5. Instalēt LAMP(Visu)"
echo "6. Atinstalēt Apache"
echo "7. Atnstalēt MySQL"
echo "8. Atnstalēt PHP"
echo "9. Atinstalēt phpMyAdmin"
echo "10. Atinstalēt LAMP(Visu)"
echo "0. Iziet"

read -r INPUT


if [ "$INPUT" -eq 1 ]; then
apache
elif [ "$INPUT" -eq 2 ]; then
mysql
elif [ "$INPUT" -eq 3 ]; then
php
elif [ "$INPUT" -eq 4 ]; then
phpmyadmin
elif [ "$INPUT" -eq 5 ]; then
apache 
mysql
sudo apt install php libapache2-mod-php php-mysql
sudo systemctl restart apache2
php -v
phpmyadmin
elif [ "$INPUT" -eq 6 ]; then
remove_apache
elif [ "$INPUT" -eq 7 ]; then
remove_mysql
elif [ "$INPUT" -eq 8 ]; then
remove_php
elif [ "$INPUT" -eq 9 ]; then
remove_phpmyadmin
elif [ "$INPUT" -eq 10 ]; then
remove_apache
remove_mysql
remove_php
remove_phpmyadmin
elif [ "$INPUT" -eq 0 ]; then
exit
fi
done

エラーは私のルートパーティションを埋めるsyslogファイルを生成しているので(shellcheck.netには記載されていません)、この問題を解決するにはどうすればよいですか?

システムログメッセージ:

https://i.stack.imgur.com/bjVzH.jpg

これらのメッセージは、単にその行の行を記述するために必要な整数式です。

elif [ "$INPUT" -eq 5 ]; then

AdminBeeが提案したように「読み取り」の後に挿入しecho "$INPUT" てスクリプトを実行した後、ターミナルでEnterキーを押すと、次の結果が表示されます。

./lamp: line 161: [: : integer expression expected
./lamp: line 163: [: : integer expression expected
./lamp: line 165: [: : integer expression expected
./lamp: line 167: [: : integer expression expected
./lamp: line 169: [: : integer expression expected
./lamp: line 176: [: : integer expression expected
./lamp: line 178: [: : integer expression expected
./lamp: line 180: [: : integer expression expected
./lamp: line 182: [: : integer expression expected
./lamp: line 184: [: : integer expression expected
./lamp: line 189: [: : integer expression expected

ベストアンサー1

問題は次のテストにあります。

if [ "$INPUT" -eq 1 ]; then

整数の等価性をテストした後、空の場合-eq(または有効な整数でない限り)失敗します。$INPUTこの場合、実際には整数でテストする必要はありません(例:「01」、「+1」、「1」をすべて同じように扱う必要はありません)。比較のために文字列を使用する方が安全です=

if [ "$INPUT" = 1 ]; then

(必要に応じて二重引用符を使用できますが、1必須ではありません。)しかし、elseすべてのテストの後に句を追加することもお勧めします。

else
    echo "Unrecognized command: $INPUT"
    # Maybe exit here?
fi

(もちろん、適切な翻訳が必要です。)別のオプションは、case一連のif/elifなどの代わりにステートメントを使用することです。

case "$INPUT" in
    1) apache ;;
    2) mysql ;;
    ...
    0) exit ;;
    *) echo "Unrecognized command: $INPUT"
        # Maybe exit here?
        ;;
esac

スクリプトにエラーチェックを追加することをお勧めします。デフォルトでは、シェルスクリプトのコマンドが失敗した場合、スクリプトの残りの部分は、エラーが発生しなかったかのように盲目的に続行されます。このセクションを例に挙げてみましょう。

cd /etc/apache2/sites-available/

echo "<VirtualHost *:80>
    ...
    </VirtualHost>" > "$domain".conf
    

cd何らかの理由でコマンドが失敗した場合、echoその時点のディレクトリには.confファイルが生成され続けます。-eshebang行に追加するのはおそらく最も簡単な方法です。

#!/bin/bash -e

テスト中のコマンドまたは同様のコマンド以外のコマンドが失敗した場合は、bashに終了するように指示します。残念ながら、時にはそれほどスマートではありません。まったく間違っているとは思えないことでやめるまたは明らかな理由で終了できません。はい間違い。これが難しい理由の詳細については、以下を参照してください。BashFAQ#105:(set -eまたはset -o errexit、またはtrap ERR)が私が期待どおりに機能しないのはなぜですか?

個々のコマンドのエラーチェックは実際には良いですが、より多くの作業が必要です。

他のセミスタイルの提案:小文字または大文字と小文字が混在する変数名を使用してください。input代わりにINPUT)特別な意味を持つすべての大文字の名前の1つが誤って使用されるのを防ぎます。echo -e一部のバージョンでは、出力の一部として「-e」のみを印刷するため、使用しないでください。(特別な処理が必要な場合printfの代わりにecho)とインデントコード(内部関数定義、ループ、条件文など)を使用して読みやすくします。

おすすめ記事