Radiofisik

my knowledge base

bash

Использование параметров

$@ - хранит разделенную строку аргументов переданных скрипту
$# - хранит количество переданных аргументов
#!/bin/bash
args=("$@")
echo ${args[0]} ${args[1]}
echo $#     


$ ./script.sh test arguments
test arguments
2

Массивы

# задание
my_array=(apple banana "Fruit Basket" orange)

# переопределение элемента
my_array[4]="carrot"  

# количество элементов в массиве
echo ${#my_array[@]} 

# доступ к последнему элементу
echo ${my_array[${#my_array[@]}-1]}

Арифметические операции

A=3
B=$((100 * $A + 5)) 
echo $B # 305

Работа со строками

# длинна строки
STRING="test"
echo ${#STRING}            # 4

# вырезка подстроки
POS=1
LEN=3
echo ${STRING:$POS:$LEN}  

# замена подстроки
STRING="to be or not to be"
echo ${STRING[@]/be/eat}        # to eat or not to be

STRING="to be or not to be"
echo ${STRING[@]//be/eat}        # to eat or not to eat

# удаление куска
STRING="to be or not to be"
echo ${STRING[@]// not/}        # to be or to be

# замена с начала
STRING="to be or not to be"
echo ${STRING[@]/#to be/eat now}    # eat now or not to be

# замена с конца
STRING="to be or not to be"
echo ${STRING[@]/%be/eat}        # to be or not to eat

Условные операторы

NAME="George"
if [ "$NAME" = "John" ]; then
  echo "John Lennon"
elif [ "$NAME" = "George" ]; then
  echo "George Harrison"
else
  echo "This leaves us with Paul and Ringo"
fi

При этом в [] могут быть числовые сравнения

comparison    Evaluated to true when
$a -lt $b    $a < $b
$a -gt $b    $a > $b
$a -le $b    $a <= $b
$a -ge $b    $a >= $b
$a -eq $b    $a is equal to $b
$a -ne $b    $a is not equal to $b

и строковые сравнения

comparison    Evaluated to true when
"$a" = "$b"     $a is the same as $b
"$a" == "$b"    $a is the same as $b
"$a" != "$b"    $a is different from $b
-z "$a"         $a is empty

при этом пробел до после = необходим, и для избегания оценки выражений переменные надо заключать в кавычки

mycase=1
case $mycase in
    1) echo "You selected bash";;
    2) echo "You selected perl";;
    3) echo "You selected phyton";;
    4) echo "You selected c++";;
    5) exit
esac

Циклы

# for
NAMES=(Joe Jenny Sara Tony)
for N in ${NAMES[@]} ; do
  echo "My name is $N"
done

# while
COUNT=4
while [ $COUNT -gt 0 ]; do
  echo "Value of count is: $COUNT"
  COUNT=$(($COUNT - 1))
done

# until
COUNT=1
until [ $COUNT -gt 5 ]; do
  echo "Value of count is: $COUNT"
  COUNT=$(($COUNT + 1))
done

Функции и обработка ctrl + c

#!/bin/bash

function booh {
    echo "booh!"
}

trap booh SIGINT SIGTERM
echo "it's going to run until you hit Ctrl+Z"
echo "hit Ctrl+C to be blown away!"

while true        
do
    sleep 60       
done

Используемые метериалы

  • https://www.learnshell.org/