Site Tools


bash

Литература

http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html

http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html#INTERNALVARIABLES – список внутренних переменных
http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html#COMPARISON-OPS – операторы сравнения переменных
http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html#FTO – операторы проверки файлов (-e -f и т.д.)

Примеры

Мониторинг сайта.

Z="perrino.ru";  for i in {1..1000} ; do sleep 1; echo $i; timelimit -q -t5 curl -silent $Z > /dev/null || notify-send "$Z timeout" ; done
for i in {1..10000} ; do sleep 0.3; ps aux | grep -v "TTY\|vsftpd\|bash\|ps aux\|sshd"; done
for i in {1..10000} ; do sleep 0.3; echo ======= ;  mysqladmin processlist | grep -v Sleep | grep -A10 ovxbkr; done
nohup sh -c 'for i in  $(seq 1 288000) ; do sleep 0.3; ps aux | grep -v "TTY\|vsftpd\|bash\|ps aux\|sshd" ; done >> psaux_user.log' & # логирование на 24 часа.
for i in `cat test3` ; do echo $i; dig $i A +short | grep --colour 78.108.90.16;  done;
for ((i=0;i<=90;i+=1)); do bzgrep 'f12965' ftp.log.$i.bz2; done >> f12965.txt
for i in $( ls ); do
          echo item: $i
      done
      
     COUNTER=0
       while [  $COUNTER -lt 10 ]; do
           echo The counter is $COUNTER
           let COUNTER=COUNTER+1 
       done
for i in `ifconfig`; do $i; done;

выполнить ifconfig

#!/bin/bash
read -p "Введите имя пользователя : " USER
if ! grep $USER /etc/passwd
then
      echo "$n не существует."
else
      echo "$n существует."
fi

Получаем строку введенную в ручную

Проверка на выполнение программы и последуйщий запуск, если не запущена
#!/bin/bash
T2="openvpn"
T1=$(ps -C openvpn | tail -n1 | awk '{print $4}')
if [ "$T1" = "$T2" ];
then
     echo "запущен"
else
     openvpn --config /etc/openvpn/client-static.conf
fi

Выполняем команду, результат в переменную. Проверка, запущен ли openvpn если нет, то запускаем openvpn –config /etc/openvpn/client-static.conf

=Смотрим время выполнения комманды в милисекундах и секундах= #!/bin/bash # example: /root/this.sh “php /root/strange.php” before=“$(date +%s.%N)” $1 after=“$(date +%s.%N)” elapsed_seconds=“$(echo $after - $before |bc)” echo $elapsed_seconds : $1

Часть кода - выполнять колличество раз в столько то часов

#!/bin/bash
LOGPATH="/root/bash/log"
COUNT=8
HOUR=1

# Exit if less $COUNT in $HOUR
function needSend(){ 
  for i in $(tail -n$COUNT $LOGPATH/`date +%m-%Y` | awk '{print $1}'); do
      SECOND=$(echo "$i + (3600 * $HOUR) - `date +%s`" | bc)
      echo $SECOND
      if [ "$SECOND" -lt 0 ]; then
          echo less 0
          #Отправить sms
          return 0 # 0 for true
      fi
  done
#Не отправлять sms
return 1
}

if needSend ; then
  echo `date +%s" "%F` success >> $LOGPATH/`date +%m-%Y`
  echo SendSMS
fi

Примеры однострочных команд

Переименовка всех директорий из _directory в directory
ls -1 | grep ^_ | while read i ; do echo "mv $i ${i:1}" ; done | bash
Поднятие первого символа в переменной (выполнение рандомных команд)
cat base | while read i ; do echo $(echo ${i::1} | tr -s [:lower:] [:upper:])${i:1} ; done ;

Discussion

qwe, 2014/04/22 18:09

for i in {1..10000} ; do sleep 0.3; echo ======= ; echo “show full processlist\G” | mysql -uuser -ppass | grep -v Sleep ; done

Constantin Conovaloff, 2014/09/18 15:06
for seeFile in `find . -type f -iname '*.php'` ; do echo $seeFile ; git annotate $seeFile | grep Kolesnikov | grep 'SELECT' ; done
Constantin Conovaloff, 2014/11/25 20:10

простой пример перебора файла и взаимодействия:

for i in $(find . -iname '*\.log' | grep -i 'keystone\|nova\|ceilometer\|neutron\|glance') ; do echo "LOGMARKER" >> $i ; done
Constantin Conovaloff, 2014/11/28 14:14

перечисление в пути

ls -alh ./some/{mcpu,php}/some
Constantin Conovaloff, 2014/11/29 15:28
echo -e {a..z}{0,1,2,3,4,5,6,7,8,9}{0..9}\\n # {0,1,2,3,4,5,6,7,8,9} == {0..9}
echo $(ls /{t*,dev})  #Перечисление
Constantin Conovaloff, 2014/12/11 13:37
for i in {1..999999} ; do sleep 0.4 ; echo ; done & tail -f ./var.log
Constantin Conovaloff, 2014/12/26 16:00

regexp

if [[ "$what_compare" =~ "^[A-Za-z0-9._%+-]+<b>@</b>[A-Za-z0-9.-]+<b>\.</b>[A-Za-z]{2,4}$" ]]
then
    echo "This email address looks fine: $email"
else
    echo "This email address is flawed: $email"
fi
Constantin Conovaloff, 2015/04/14 15:38

Увести sleep в background

(for i in {1..99999} ; do sleep 0.5 ; echo ; done) &
Constantin Conovaloff, 2015/04/15 15:15

Стандартный конфиг запуска

#!/bin/sh
### BEGIN INIT INFO
# Provides:          stacktach
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/stop stacktach workers 
### END INIT INFO

. /lib/lsb/init-functions

if [ -f /etc/default/stacktach ]
then
        . /etc/default/stacktach
fi

WORKDIR=${STACKTACH_INSTALL_DIR:-/srv/www/stacktach/app}
DAEMON=/usr/bin/python
ARGS=$WORKDIR/worker/start_workers.py
PIDFILE=/var/run/stacktach.pid

export DJANGO_SETTINGS_MODULE="${DJANGO_SETTINGS_MODULE:-settings}"

case "$1" in
  start)
    echo "Starting stacktach workers"
    cd $WORKDIR
    if id -un stacktach >/dev/null 2>&1
    then
            /sbin/start-stop-daemon --start --pidfile $PIDFILE --chuid stacktach --make-pidfile -b --exec $DAEMON $ARGS
    else
            /sbin/start-stop-daemon --start --pidfile $PIDFILE --make-pidfile -b --exec $DAEMON $ARGS
    fi
    ;;
  stop)
    echo "Stopping stacktach workers"
    /sbin/start-stop-daemon --stop --pidfile $PIDFILE --verbose
    ;;
  restart)
    echo "Restarting stacktach workers"
    /sbin/start-stop-daemon --stop --pidfile $PIDFILE  --retry 5
    /sbin/start-stop-daemon --start --pidfile $PIDFILE --make-pidfile -b --exec $DAEMON $ARGS
    ;;
  status)
    status_of_proc -p "${PIDFILE}" "$DAEMON" "stacktach" && exit 0 || exit $?
    ;;
  *)
    echo "Usage: stacktach.sh {start|stop|restart|status}"
    exit 1
    ;;
esac

exit 0
Constantin Conovaloff, 2015/08/12 13:08

Переопределение приветствия(приглашения (host@name: )) в консоле

PROMPT_COMMAND указывает на команду, которую нужно вызывать при каждом выводе приветствия

 ~ $ env | grep -i prompt
PROMPT_COMMAND=set_bash_prompt

Вот пример функции, который вызывается при каждом приветствие

konovalov@kondr ~ $ type set_bash_prompt
set_bash_prompt является функцией
set_bash_prompt () 
{ 
    set_prompt_symbol $?;
    if is_git_repository; then
        set_git_branch;
    else
        if is_svn_repository; then
            set_svn_branch;
        else
            BRANCH='';
        fi;
    fi;
    PS1="\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \[\033[00m\]${BRANCH}\[\033[01;34m\]${PROMPT_SYMBOL}\[\033[00m\] "
}
prompt () 
{ 
    local EXIT=${?};
    if [[ $(grep -c docker /proc/self/cpuset) != 0 ]]; then
        DOCKER="(docker) ";
    else
        DOCKER="";
    fi;
    if [[ ${EUID} == 0 ]]; then
        if [[ ${HOSTNAME} == "myserver.ru" ]]; then
            PS1="\[\033[1;31m\]\h\[\033[1;34m\] : \w [";
        else
            PS1="$DOCKER\[\033[1;36m\]\h\[\033[1;34m\] : \w [";
        fi;
        if [[ ${EXIT} == 0 ]]; then
            PS1+="\[\033[1;32m\]";
        else
            PS1+="\[\033[1;31m\]";
        fi;
        PS1+="${EXIT}\[\033[1;34m\]] #\[\033[m\] ";
    else
        PS1="${debian_chroot:+($debian_chroot)}$DOCKER\[\033[1;32m\]\u@\h\[\033[m\]:\[\033[1;34m\]\w [";
        if [[ ${EXIT} == 0 ]]; then
            PS1+="\[\033[1;32m\]";
        else
            PS1+="\[\033[1;31m\]";
        fi;
        PS1+="${EXIT}\[\033[1;34m\]] \$\[\033[m\] ";
    fi
}
Constantin Conovaloff, 2016/03/15 16:30

for each array

params=(
	"kam pam"
	"ram pam sam"
	)

for i in "${params[@]}"; do
	echo "PROGRAMM $i"
done
# ./start_migrate.sh 
PROGRAMM: kam pam
PROGRAMM: ram pam sam
Constantin Conovaloff, 2016/03/15 17:13

file script name

_script="$(readlink -f ${BASH_SOURCE[0]})"
_base="$(dirname $_script)"
Constantin Conovaloff, 2018/04/06 18:55
DATA="{\"value\":\"+7 921 $(shuf -i 11-99 -n 1)-$(shuf -i 11-99 -n 1)-$(shuf -i 111-999 -n 1)\",\"validation_error\":false}" ; echo \'$DATA\' ; curl 'https://halvacard.ru/order/sendsms.json' -H 'Origin: https://halvacard.ru' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' --data-binary "$DATA" --compressed
You could leave a comment if you were logged in.
bash.txt · Last modified: 2014/11/29 13:34 by conovaloff

Page Tools