Программа смены прав доступа и регистра имени файлов-каталогов на Bash

в 11:56, , рубрики: bash, bash-скрипт, linux, Linux для всех, Разработка под Linux

В рамках задания на лабораторных занятиях нам необходимо было написать скрипт, который должен был, при вводе соответствующего ключа, менять регистр букв в имени файла/каталога с верхнего на нижний и наоборот, менять регистр первой буквы каждого слова в имени на верхний, отдельными ключами, которые не должны исполняться самостоятельно, делать те же преобразования, но с выводом информации в терминал и выполнять изменения регистра рекурсивно.

С подначек преподавателя наш скрипт обрастал дополнительными возможностями. Так в нашем скрипте сначала появились проверки на наличие запрещенных символов в именах файлов и кириллицы, проверка на наличие прав на запись (нами было решено ограничиться файлами с правами на запись):

Код

if [[ -w "$n" ]]; then
if [[ "$adress" != *[А-Яа-яЁё]* ]] && [[ "$adress" != *["`':?<>|!]* ]]; then

После добавления различных проверок и предусмотрения различного рода ошибок, возник вопрос, что будет если система не сможет воспроизводить русский язык? Вопрос это имел место быть, т.к. вся информация выдаваемая пользователя писалась на русском. Некоторое время мы игнорировали этот вопрос, преподаватель про него не вспоминал и ладно, зато мы переделали наш скрипт и сделали для него графический интерфейс при помощи Zenity.
Для удобства работы мы разбили скрипт на несколько файлов, в начальном файле задаются переменные, которые затем передаются дальше, и проводится проверка на наличие Zenity.

Код

pr_way=`pwd`
pr_way="${pr_way#*$USER/}"
pr_name="$0"
pr_name="${pr_name#*/}"
start_scr="0"
#----------------------------------------------------------------
if find /usr/bin/zenity
then
cd selection
./language.sh "$pr_way" "$pr_name" "$start_scr"
else
echo "Zenity is not installed on this computer."
fi

Сделав полностью графический интерфейс мы вернулись к вопросу языка. Ограничились тремя языками: русским, английским и белорусским. Язык выбирается автоматически, в зависимости от вашего системного языка, если он не окажется одним из этих трех, то просто откроется окно выбора языка, где вы сможете выбрать его самостоятельно.

Код

if [[ $LANG == *["ru"]* ]]; then
	./key-ru.sh "$pr_way" "$pr_name" "$start_scr"
elif [[ $LANG == *["en"]* ]]; then
	./key-en.sh "$pr_way" "$pr_name" "$start_scr"
elif [[ $LANG == *["by"]* ]]; then
	./key-by.sh "$pr_way" "$pr_name" "$start_scr"
elif [[ $LANG != *["ru"]* ]] && [[ $LANG == *["en"]* ]] && [[ $LANG == *["by"]* ]]; then
language=$(zenity 
	--list --width=400 --height=150 
	--title="Language selection" 
	--text="Sorry. This program does not support your system language. Please, select language below." 
	--column="Language" 
	"Russian" 
	"English" 
	"Belarussian" )

image

После определения языка, на котором вы будете работать дальше, открывается окно с выбором ключа.

image

После того как вы определились, что хотите сделать, выбрав ключ, переходите к выбору файла/каталога, с которым вы будете это делать.

image

Завершив работу, программа вам сообщит о том, что произошло и любезно поинтересуется хотите ли вы продолжать дальше.

image

Бонусом мы добавили в нашу программу возможность смены прав доступа файлов/каталогов, это было нашим предыдущим заданием, поэтому и было решено совместить их.

Код

#!/bin/bash
#получение переменных из предыдущего скрипта
adress="$1"
pr_way="$2"
pr_name="$3"
echo 
cd
#проверка на наличие в адресе "/", что означает, что нужный файл/каталог находится в каком-то каталоге
if [[ "$adress" == *["/"]* ]]; then
#отсечение пути и имени файла/каталога от адреса
way="${adress%/*}"
name="${adress##*/}"
cd "$way"
else
#в случае отсутствия "/" в адресе, именем файла/каталога становится адрес
name="$adress"
fi
#окно выбора формата ввода прав доступа
format=$(zenity 
	--list --width=400 --height=150 
	--title="Выбор формата прав доступа" 
	--text="Выберите, пожалуйста, формат присвоения прав доступа." 
	--column="Формат" 
	"Числовой" 
	"Буквенный" )
#завершение программы при закрытии окна
if [ $? -eq "1" ];then
	exit
fi
case "$format" in
	Числовой)
#окно ввода числового формата выбора прав доступа
mod=$(zenity 
	--entry 
	--title="Выбор прав доступа" 
	--text="Введите, пожалуйста, права, которые Вы хотите присвоить '$name'.
Права должны состоять из трехзначного числа, включающего в себя цифры от 0 до 7:
0 – ничего не разрешено;
1 – разрешено только исполнение;
2 – разрешена только запись;
3 – разрешены исполнение и запись;
4 – разрешено только чтение;
5 – разрешены чтение и исполнение;
6 – разрешены чтение и запись;
7 – все разрешено." 
	--entry-text="")
#завершение программы при закрытии окна
if [ $? -eq "1" ];then
	exit
fi	
#проверка правильности ввода формата (3х значаное число, состоящее из цифр от 0 до 7)
if [[ $mod == *[0-7]* ]] && [[ ${#mod} = 3 ]]; then
#изменение прав доступа
	chmod $mod "$name"
#результат выполнения программы
	zenity --info --title="Завершение программы" --text="'$name' успешно присвоены права '$mod'."
else
	zenity --error --title="Ошибка!" --text="Введен неверный формат прав доступа. Пожалуйста, проверьте введенного Вами формата прав доступа и повторите позже."
fi
;;
	Буквенный)
#окно ввода буквенного формата прав доступа
mod=$(zenity 
	--entry --width=600 
	--title="Выбор прав доступа" 
	--text="Введите пожалуйста права, которые Вы хотите дать '$name'.
Права должны включать в себя того, у кого будут изменены права (u/g/o/a),
знак, который изменяет права (+/-/=) и какие права будут изменены (r/w/x):
u – пользователь;
g – группа;
o – остальные;
a – все;
+ – разрешить;
- – запретить;
= – присвоить;
r – чтение;
w – запись;
x – исполнение." 
	--entry-text="")
#завершение программы при закрытии окна
if [ $? -eq "1" ];then
	exit
fi
#проверка правильности ввода формата прав доступа и последующее изменение прав доступа и вывод результата
if  [[ $mod == *[ugoa]*+*[rwx]* || $mod == *[ugoa]*-*[rwx]* || $mod == *[ugoa]*"="*[rwx]* ]]; then
	chmod $mod "$name"
	zenity --info --title="Результат" --text="'$name' успешно присвоены права '$mod'."
elif [[ $mod == +*[rwx]* ]] || [[ $mod == -*[rwx]* ]] || [[ $mod == =*[rwx]* ]]; then
	pre_mod="${mod%[-+=]*}"
	pre_mod+=" "
	if [[ $pre_mod == " " ]]; then
		pre_mod="${pre_mod/ /a}"
		echo "$pre_mod"
		pre_mod+="$mod"
		mod="$pre_mod"
		echo "$mod"
	fi
	chmod $mod "$name"
	zenity --info --title="Результат" --text="'$name' успешно присвоены права '$mod'."
else
	zenity --error --title="Ошибка!" --text="Введен неверный формат прав доступа. Пожалуйста, проверьте введенного Вами формата прав доступа и повторите позже."
fi
;;
esac
cd
cd ""$pr_way"/selection"
#окно выбора следующего шага или завершение программы при закрытии окна
next=$(zenity 
	--list --width=400 --height=200 
	--title="Выбор следующего шага" 
	--text="Выберите, пожалуйста, с какого пункта Вы хотите продолжить работу в программе,
либо закройте данное, окно, если хотите завершить работу." 
	--column="Выбор" 
	"Выбор ключа" 
	"Выбор файла или папки" )
case $next in
	"Выбор ключа") 
start_scr="0"
./key-ru.sh "$pr_way" "$pr_name" "$start_scr"
;;
	"Выбор файла или папки") 
start_scr="C"
./key-ru.sh "$pr_way" "$pr_name" "$start_scr"
;;
esac

Ссылка на всю нашу работу, для подробного ознакомления с ней, прилагается.

Автор: Кирилл Гарифов

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js