저는 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 파일이 계속 생성됩니다. -e
shebang 줄에 추가하는 것이 아마도 가장 간단한 방법일 것입니다.
#!/bin/bash -e
테스트 중인 명령이나 이와 유사한 명령이 아닌 명령이 실패하면 bash에게 종료하라고 지시합니다. 불행히도 때로는 그다지 똑똑하지 않습니다.전혀 잘못된 것 같지 않은 일로 인해 그만 두는 것, 또는명백한 이유로 종료할 수 없습니다.예실수. 이것이 어려운 이유에 대한 자세한 설명은 다음을 참조하세요.BashFAQ #105: set -e
(또는 set -o errexit
, 또는 trap ERR
)이 내가 예상한 대로 작동하지 않는 이유는 무엇입니까?
개별 명령에 대한 오류 검사는 실제로 더 좋지만 더 많은 작업이 필요합니다.
다른 세미 스타일 제안:소문자 또는 대소문자가 혼합된 변수 이름을 사용하세요.( input
대신 INPUT
) 특별한 의미를 지닌 모두 대문자 이름 중 하나를 실수로 사용하는 것을 방지합니다.echo -e
일부 버전에서는 출력의 일부로 "-e"만 인쇄하므로 사용하지 마세요 .(특별한 처리가 필요한 경우 printf
대신 echo
) 및 들여쓰기 코드(예: 내부 함수 정의, 루프, 조건문 등)를 사용하여 가독성을 높입니다.