نصوص شل مفيدة في أي برنامج

سحق إنه برنامج كمبيوتر وظيفته تفسير الطلبات. يعتمد على الصدفة يونكس وقد كتب للمشروع جنو كونه مترجم الأوامر الافتراضي في معظم توزيعات جنو / لينكس. اسمه هو اختصار ل بورن قذيفة ثانية (صدفة أخرى بورن)والتلاعب بالكلمات (ولد من جديد يعني ولادة جديدة) في قذيفة بورن (sh)، والذي كان من أوائل مترجمي يونكس الرئيسيين.

سنقوم اليوم بعرض بعض البرامج النصية التي يمكن أن تكون مفيدة جدًا للمطورين. معظم العمل في أي قذيفة يونكس، على الرغم من أن البعض يطلب تنفيذها على وجه التحديد بواسطة سحق.

منع المستخدمين غير المتميزين من تشغيل البرنامج النصي

تقوم بعض البرامج النصية بتنفيذ مهام إدارية ، لذلك قد نريد فقط المستخدم الجذر لتشغيل البرنامج النصي. في هذه الحالة يمكننا استخدام شيء مثل هذا:

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Este script debe ser ejecutado por el usuario root" 1>&2
exit 1
fi

السماح بتنفيذ البرنامج النصي فقط لمستخدم معين

على غرار الكود أعلاه ، قد نريد مستخدمًا معينًا فقط لتشغيل البرنامج النصي. نقوم بذلك:

#!/bin/bash
AUTHORIZED_USER="usuario_permitido"
if [ $USER != $AUTHORIZED_USER ]; then
echo "Este script debe ser ejecutado por el usuario $AUTHORIZED_USER" 1>&2
exit 1
fi

تحقق من تشغيل الخدمة / العملية

إذا أردنا معرفة ما إذا كانت هناك عمليات لأي خدمة أو برنامج قيد التشغيل ، فيمكننا استخدام هذا البرنامج النصي (في هذه الحالة تحقق من أن البرنامج الخفي لـ Apache يركض):

#!/bin/sh
SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
echo "El servicio $SERVICE esta ejecutandose"
else
echo "Chanfle! El servicio $SERVICE esta detenido"
fi

قم بإنشاء ملف قفل

نحتاج أحيانًا إلى التأكد من عدم تنفيذ البرنامج النصي مرتين أو أكثر في وقت واحد. لهذا يمكننا الاستفادة من ملفات القفل. هذه نسخة بسيطة من البرنامج النصي تسمح لنا بالقيام بذلك:

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if [ ! -e $lockfile ]; then
touch $lockfile
echo "hago muchas cosas importantes aqui"
rm $lockfile
else
echo "ya hay otro proceso corriendo"
fi

في هذه الحالة ، يتم التحقق من أن الملف أيا كان يوجد. في حالة وجوده ، لا يقوم البرنامج النصي بتنفيذ مهامه. إذا لم يكن موجودًا ، يقوم بإنشاء الملف وتشغيل المهام التي يحتاجها للتشغيل ويزيله. لكن هذا لا يمكن الاعتماد عليه تمامًا. ماذا لو تم إغلاق البرنامج النصي أثناء تشغيله فجأة؟

في هذه الحالة لن يتم حذف ملف القفل ، وبالتالي لن يسمح لنا بتشغيل البرنامج النصي مرة أخرى. لتغطية هذه الحالات ، يمكننا الاستفادة من الأمر trap الذي يسمح لنا بتنفيذ الأوامر في حالة انتهاء البرنامج النصي الخاص بنا بشكل غير متوقع. هذا إصدار أكثر تقدمًا يحفظ أيضًا PID للبرنامج النصي الذي ينفذه داخل ملف القفل:

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
echo "hago muchas cosas aqui tranquilamente"
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Ya hay otro proceso de este script ejecutandose"
echo "corriendo con el PID: $(cat $lockfile)"
fi

دعونا نفهم الأمر بشكل أفضل قليلاً فخ. بناء الجملة الخاص به هو في الأساس: إشارة الأمر trap [إشارة…] ؛ حيث تكون الإشارة هي إشارة الإنهاء التي تريد التقاطها. إذا كنت تريد رؤية قائمة بالإشارات المتاحة ، يمكنك تشغيل أمر kill -l. للحالة السابقة ، تم استخدام الإشارات INT (يلتقط الإنهاء الناتج عن Ctrl + c)، مصطلح (الإنهاء الناتج عن أمر القتل) والخروج (الإنهاء العادي للبرنامج النصي ، إما بسبب عدم وجود أسطر أخرى لتنفيذها أو لأنه يواجه أمر الخروج).

قائمة الخيارات

لعمل قائمة حيث نسمح للمستخدم بتحديد سلسلة من الخيارات ، يمكننا استخدام المخطط التالي:

#!/bin/bash
clear
while :
do
echo " Escoja una opcion "
echo "1. quien soy?"
echo "2. cuanto espacio tengo"
echo "3. que es esto?"
echo "4. Salir"
echo -n "Seleccione una opcion [1 - 4]"
read opcion
case $opcion in
1) echo "este eres:";
whoami;;
2) echo "tienes esto";
df;;
3) uname -r;;
4) echo "chao";
exit 1;;
*) echo "$opc es una opcion invalida. Es tan dificil?";
echo "Presiona una tecla para continuar...";
read foo;;
esac
done

اطلب التأكيد قبل تشغيل البرنامج النصي

في بعض الأحيان يكون من المفيد جعل المستخدم يؤكد تنفيذ مجموعة من العبارات ، أي الرسالة النموذجية التي تطلب من المستخدم كتابة نعم أو لا. يمكننا القيام بهذا على النحو التالي:

#!/bin/bash
while true; do
echo
read -p "esta seguro de hacer lo que sea que vaya a hacer " yn
case $yn in
yes ) break;;
no ) exit;;
* ) echo "por favor responda yes o no";;
esac
done
echo "si se ejecuta esto es que aceptaste"

نهاية المقال. ببساطة عظيمة 

التحرير: يجب أن تكون حذرًا مع المسافات وعلامات التبويب ، والتي لا تظهر لسبب ما


أضف كمصدر مفضل في جوجل