Các tập lệnh shell hữu ích trong bất kỳ chương trình nào

Bash là một chương trình máy tính có chức năng diễn giải các lệnh. Nó dựa trên shell của Unix và được viết cho dự án GNU , là trình thông dịch lệnh mặc định trong hầu hết các bản phân phối GNU/Linux . Tên của nó là viết tắt của Bourne-Again Shell , một cách chơi chữ (born-again có nghĩa là tái sinh) ám chỉ đến Bourne shell (sh) , một trong những trình thông dịch Unix chính đầu tiên.

Hôm nay chúng ta sẽ giới thiệu một số tập lệnh shell rất hữu ích cho các nhà phát triển. Hầu hết chúng hoạt động trên bất kỳ shell Unix nào , mặc dù một số yêu cầu phải chạy Bash cụ thể.

Ngăn người dùng không có đặc quyền chạy tập lệnh

Một số tập lệnh thực hiện các tác vụ quản trị vì vậy chúng tôi có thể chỉ muốn người dùng root chạy tập lệnh. Trong trường hợp đó, chúng ta có thể sử dụng một cái gì đó như sau:

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

Chỉ cho phép thực thi tập lệnh cho một người dùng cụ thể

Tương tự như đoạn mã ở trên, chúng tôi có thể chỉ muốn một người dùng cụ thể chạy tập lệnh. Chúng tôi làm như vậy:

#!/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

Xác minh rằng một dịch vụ / quy trình đang chạy

Nếu muốn kiểm tra xem có tiến trình nào từ một dịch vụ hoặc chương trình đang chạy hay không, ta có thể sử dụng đoạn mã này (trong trường hợp này, nó kiểm tra xem tiến trình nền Apache có đang chạy hay không) :

#!/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

Tạo một tệp khóa

Đôi khi chúng ta phải đảm bảo rằng script không chạy đồng thời hai hoặc nhiều lần. Đối với điều này, chúng tôi có thể sử dụng các tệp khóa. Đây là một phiên bản đơn giản của tập lệnh cho phép chúng tôi thực hiện việc này:

#!/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

Trong trường hợp này, kịch bản kiểm tra xem tệp `loquesea.lock` có tồn tại hay không. Nếu có, kịch bản sẽ KHÔNG thực hiện các tác vụ của nó. Nếu không tồn tại, nó sẽ tạo tệp, thực hiện các tác vụ cần thiết, rồi xóa tệp đó. Tuy nhiên, điều này không hoàn toàn đáng tin cậy. Điều gì sẽ xảy ra nếu kịch bản của chúng ta bị đóng đột ngột khi đang chạy?

Trong trường hợp đó, tệp khóa sẽ không bị xóa và do đó nó sẽ không cho phép chúng tôi chạy lại tập lệnh. Để giải quyết những trường hợp đó, chúng ta có thể sử dụng lệnh trap cho phép chúng ta thực hiện các lệnh trong trường hợp tập lệnh của chúng ta kết thúc bất ngờ. Đây là phiên bản nâng cao hơn cũng lưu PID của tập lệnh thực thi nó trong tệp khóa:

#!/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

Hãy cùng tìm hiểu kỹ hơn về lệnh `trap` . Cú pháp của nó về cơ bản là: `trap command signal [signal …];` trong đó `signal` là tín hiệu kết thúc mà bạn muốn bắt. Nếu bạn muốn xem danh sách các tín hiệu có sẵn, bạn có thể chạy lệnh `kill -l`. Trong ví dụ trước, các tín hiệu được sử dụng là `INT` (bắt tín hiệu kết thúc do Ctrl+c tạo ra) , `TERM` (kết thúc do lệnh `kill` tạo ra) và `EXIT` (kết thúc bình thường của script, hoặc vì không còn dòng nào để thực thi hoặc vì gặp lệnh `exit`).

Menu tùy chọn

Để tạo một menu mà chúng tôi cho phép người dùng chọn một loạt các tùy chọn, chúng tôi có thể sử dụng lược đồ sau:

#!/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

Yêu cầu xác nhận trước khi chạy tập lệnh

Đôi khi, rất hữu ích khi yêu cầu người dùng xác nhận việc thực thi một loạt câu lệnh, tức là, thông báo điển hình yêu cầu người dùng nhập có hoặc không. Chúng ta có thể làm như thế này:

#!/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"

Kết thúc bài viết. Đơn giản là tuyệt vời 

Chỉnh sửa: Tôi cần phải cẩn thận hơn với khoảng trắng và dấu tab, vì không hiểu sao tôi lại dùng chúng không đúng ¬¬


Thêm vào danh sách nguồn ưu tiên trên Google.