diff --git a/courses/bash/ex02/ex01.sh b/courses/bash/ex02/ex01.sh new file mode 100644 index 00000000..18af4b5b --- /dev/null +++ b/courses/bash/ex02/ex01.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 'pattern'" + exit 1 +fi + +pattern=$1 + +find . -type d | while read -r dir; do + # Get the relative path + rel_path=${dir#./} + + if echo "$rel_path" | grep -w -q "$pattern"; then + echo "$rel_path" + fi +done diff --git a/courses/bash/ex02/ex02.sh b/courses/bash/ex02/ex02.sh new file mode 100644 index 00000000..18af4b5b --- /dev/null +++ b/courses/bash/ex02/ex02.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 'pattern'" + exit 1 +fi + +pattern=$1 + +find . -type d | while read -r dir; do + # Get the relative path + rel_path=${dir#./} + + if echo "$rel_path" | grep -w -q "$pattern"; then + echo "$rel_path" + fi +done diff --git a/courses/bash/ex03/ex03.sh b/courses/bash/ex03/ex03.sh new file mode 100644 index 00000000..34ea4a88 --- /dev/null +++ b/courses/bash/ex03/ex03.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +if [ "$#" -ne 4 ]; then + echo "Usage: $0 filename keyword1 keyword2 keyword3" + exit 1 +fi + +filename=$1 +keyword1=$2 +keyword2=$3 +keyword3=$4 + +if [ ! -f "$filename" ]; then + echo "File '$filename' not found!" + exit 1 +fi + + +search_keyword() { + local keyword=$1 + echo "Keyword: $keyword" + count=$(grep -c "$keyword" "$filename") + echo "Number of matches: $count" + grep -n "$keyword" "$filename" || true + echo +} + +search_keyword "$keyword1" +search_keyword "$keyword2" +search_keyword "$keyword3" diff --git a/courses/bash/ex04/ex04.sh b/courses/bash/ex04/ex04.sh new file mode 100644 index 00000000..92b7c7f7 --- /dev/null +++ b/courses/bash/ex04/ex04.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +echo "Searching for pattern: $1" + +if [ -z "$1" ]; then + echo "Usage: $0 pattern" + exit 1 +fi + +pattern="$1" + +find . -type f | while read -r file; do + echo "Checking file: $file" + grep -nH "$pattern" "$file" 2>/dev/null +done diff --git a/courses/bash/ex05/ex05.sh b/courses/bash/ex05/ex05.sh new file mode 100644 index 00000000..d911e4bf --- /dev/null +++ b/courses/bash/ex05/ex05.sh @@ -0,0 +1,50 @@ + #!/bin/bash + +if [ "$#" -lt 2 ]; then + echo "Usage: $0 {-m|-s|-e|-o} number1 number2 ..." >&2 + exit 1 +fi + +operation=$1 +shift + +sum=0 +count=0 +even_sum=0 +odd_sum=0 + +for number in "$@"; do + sum=$(echo "$sum + $number" | bc) + count=$((count + 1)) + if [ $((number % 2)) -eq 0 ]; then + even_sum=$(echo "$even_sum + $number" | bc) + else + odd_sum=$(echo "$odd_sum + $number" | bc) + fi +done + +case $operation in + -s) + echo "Sum: $sum" + ;; + -e) + echo "Sum of even numbers: $even_sum" + ;; + -o) + echo "Sum of odd numbers: $odd_sum" + ;; + -m) + if [ $count -ne 0 ]; then + mean=$(echo "scale=2; $sum / $count" | bc) + echo "Mean: $mean" + else + echo "No numbers provided to calculate mean" + fi + ;; + *) + echo "Invalid option. Usage: $0 {-m|-s|-e|-o} number1 number2 ..." >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/courses/bash/ex06/ex06.sh b/courses/bash/ex06/ex06.sh new file mode 100644 index 00000000..d960cfed --- /dev/null +++ b/courses/bash/ex06/ex06.sh @@ -0,0 +1,17 @@ + #!/bin/bash + +map() { + if [ "$#" -lt 2 ]; then + echo "Usage: map command arg1 arg2 ..." + return 1 + fi + + local command=$1 + shift + + for arg in "$@"; do + $command "$arg" + done +} + + diff --git a/courses/bash/ex07/kirill b/courses/bash/ex07/kirill new file mode 100644 index 00000000..e69de29b diff --git a/courses/bash/ex09/ex09.sh b/courses/bash/ex09/ex09.sh new file mode 100644 index 00000000..d42a3848 --- /dev/null +++ b/courses/bash/ex09/ex09.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +usage() { + echo "Usage: $0 [OPTIONS] FILE" + echo "Options:" + echo " -u, --url Extract URLs from the file" + echo " -e, --email Extract emails from the file" + echo " -h, --help Display this help and exit" +} + +extract_urls() { + grep -oE 'https?://[^\s/$.?#].[^\s]*' "$1" +} + +extract_emails() { + grep -oE '[\w._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}' "$1" +} + +options=$(getopt -o ueh --long url,email,help -- "$@") +if [ $? -ne 0 ]; then + usage + exit 1 +fi + +eval set -- "$options" + +url_flag=false +email_flag=false + +while true; do + case "$1" in + -u | --url) + url_flag=true + shift + ;; + -e | --email) + email_flag=true + shift + ;; + -h | --help) + usage + exit 0 + ;; + --) + shift + break + ;; + *) + usage + exit 1 + ;; + esac +done + + is provided +if ! $url_flag && ! $email_flag; then + echo "Error: You must specify at least one option (--url or --email)." + usage + exit 1 +fi + + +if [ $# -ne 1 ]; then + echo "Error: You must specify a file." + usage + exit 1 +fi + + file +file="$1" +if $url_flag; then + echo "Extracting URLs from $file:" + extract_urls "$file" +fi + +if $email_flag; then + echo "Extracting emails from $file:" + extract_emails "$file" +fi diff --git a/courses/cunix/ex01/src/strlen.c b/courses/cunix/ex01/src/strlen.c new file mode 100644 index 00000000..a777d22f --- /dev/null +++ b/courses/cunix/ex01/src/strlen.c @@ -0,0 +1,15 @@ +#include +size_t my_strlen(const char *str) { + const char *s = str; + while (*s != '\0') { + s++; + } + return s - str; +} + +int main() { + const char *my_string = "Hello, World!"; + size_t length = my_strlen(my_string); + printf("Length of the string is %zu\n", length); + return 0; +}