для моего первого курса CS мне нужно знать Shell Scripting, но я действительно ужасен в этом. Я написал этот сценарий, например
#!/bin/bash
[ $(whoami) != "root" ] && echo "Run as superuser" && exit 1
while getopts "ugb: " opt; do
case $opt in
u)
read -p "Wat is de naam van de user die je wilt toevoegen?: " username
[ $username == ""] && echo "Geen usename meegegeven!" && exit 1
read -p "Wat is de groepsnaam voor de gebruiker?: " group_name
[ "$(getent group $group_name)" == "" ] && echo "De groep bestaat niet, exiting" \ && exit 1
echo "adduser -m -g $group_name $username"
create_softlink $group_name $username
g)
read -p "Wat is de groepnaam voor de user?: " group_name
[ "$(getent group $group_name)" != "" ] && echo "De groep bestaat, exiting" \ && exit 1
addgroup "$groupname"
mk_shared_folder "$groupname"
b)
BACKUP_FOLDER="/var/backup"
[ ! -d "$BACKUP_FOLDER"] && mkdir -p "$BACKUP_FOLDER"
[ -d "$SHARED_FOLDER/$1"] && echo "Shared folder bestaat niet" && exit 1
zip "$SHARED_FOLDER/$1" "$BACKUP_FOLDER/$1-$(date +"%m-%d-%y")"
Теперь я хочу выполнить этот сценарий. Например создание пользователя. В простом сценарии вы просто выполняете ./ scriptname.sh
. Но я не знаю, что это за команда.
Мне очень жаль, если в этом нет никакого смысла. Я действительно плохо разбираюсь в этом и сам почти ничего не понимаю.
РЕДАКТИРОВАТЬ: мой вопрос отмечен как повторяющийся. Однако ./scriptname.sh НЕ запускает сценарий.
Для запущения скрипта необходимо сделать одно из следующих. Скажем, Ваш сценарий хранится в /home/maarten/script.sh
:
Дайте его bash
как аргумент:
bash /home/maarten/script.sh
Сделайте это исполняемым файлом и выполните его путем записи его пути на командной строке:
chmod +x /home/maarten/script.sh
/home/maarten/script.sh
Сделайте это исполняемым файлом и переместите его в каталог, который находится в Вашем $PATH
:
chmod +x /home/maarten/script.sh
mkdir -p ~/bin && mv /home/maarten/script.sh ~/bin
Если a bin
каталог существует в Вашем корневом каталоге (~/bin
средства $HOME/bin
), это будет автоматически добавлено к Вашему $PATH
в следующий раз Вы входите в систему. Для добавления его вручную для текущей сессии, не выходя из системы и затем обратно в снова можно работать source ~/.profile
или PATH="$PATH:~/bin
.
Теперь, Ваш сценарий также имеет некоторые синтаксические ошибки. Вам нужны пробелы после [
и прежде ]
, while
должен быть закончен do
, case
должен быть закончен esac
и каждый оператор выбора с ;;
, и необходимо всегда заключать переменные в кавычки:
#!/bin/bash
[ $(whoami) != "root" ] && echo "Run as superuser" && exit 1
while getopts "ugb: " opt; do
case $opt in
u)
read -p "Wat is de naam van de user die je wilt toevoegen?: " username
[ "$username" == "" ] && echo "Geen usename meegegeven!" && exit 1
read -p "Wat is de groepsnaam voor de gebruiker?: " group_name
[ "$(getent group $group_name)" == "" ] && echo "De groep bestaat niet, exiting" && exit 1
## I removed the echo since you probably want to run the command
adduser -m -g "$group_name" "$username"
## I assume your real script has a function called
## "create_softlink", right? This won't work otherwise
create_softlink "$group_name" "$username"
;;
g)
read -p "Wat is de groepnaam voor de user?: " group_name
[ "$(getent group $group_name)" != "" ] && echo "De groep bestaat, exiting" \ && exit 1
addgroup "$groupname"
## Like "create_softlink" above, I am assuming you have a
## function called "mk_shared_folder" somewhere.
mk_shared_folder "$groupname"
;;
b)
BACKUP_FOLDER="/var/backup"
[ ! -d "$BACKUP_FOLDER" ] && mkdir -p "$BACKUP_FOLDER"
## Note that $1 is the 1st parameter passed to the script.
## However, since you're using getopts, and b expects an argument
## that argument is available as $OPTARG when the current $opt is b
## I have changed the script accordingly.
[ -d "$SHARED_FOLDER/$2" ] && echo "Shared folder bestaat niet" && exit 1
zip "$SHARED_FOLDER/$OPTARG" "$BACKUP_FOLDER/$OPTARG-$(date +"%m-%d-%y")"
;;
esac
done