2 Temmuz 2020 Perşembe

bash kodlama - test operator

Giriş
Aslında test komutunu çalıştırır. test komutunun man sayfası burada. Açıklaması şöyle
File operators:
    
      -a FILE        True if file exists.
      -b FILE        True if file is block special.
      -c FILE        True if file is character special.
      -d FILE        True if file is a directory.
      -e FILE        True if file exists.
      -f FILE         True if file exists and is a regular file.
      -g FILE        True if file is set-group-id.
      -h FILE        True if file is a symbolic link.
      -L FILE        True if file is a symbolic link.
      -k FILE        True if file has its `sticky' bit set.
      -p FILE        True if file is a named pipe.
      -r FILE         True if file is readable by you.
      -s FILE        True if file exists and is not empty.
      -S FILE        True if file is a socket.
      -t FD            True if FD is opened on a terminal.
      -u FILE        True if the file is set-user-id.
      -w FILE        True if the file is writable by you.
      -x FILE         True if the file is executable by you.
      -O FILE        True if the file is effectively owned by you.
      -G FILE        True if the file is effectively owned by your group.
      -N FILE        True if the file has been modified since it was last read.

String operators:
    
      -z STRING      True if string is empty.
      -n STRING      True if string is not empty.

 Other operators:
    
      -o OPTION      True if the shell option OPTION is enabled.
      -v VAR         True if the shell variable VAR is set.
      -R VAR         True if the shell variable VAR is set and is a name reference.
Shortcut Syntax
Şöyle yaparız. Burada hem test komutu hem de parantez içindeki komutların if/else veya shortcut syntax ile kullanımı gösteriliyor.
if [ -e /tmp/signal.txt ]; then /opt/myscript.sh; fi
# or
if test -e /tmp/signal.txt; then /opt/myscript.sh; fi

# or shortcut syntax
[ -e /tmp/signal.txt ] && /opt/myscript.sh
# or
test -e /tmp/signal.txt && /opt/myscript.sh

-eq seçeneği - Eşitlik kontrolü
Örnek
Şöyle yaparız.
if [ "$#" -eq 1 ] && [ -f "$1" ]; then

-n seçeneği - String boş değilse - True if string is not empty
String boş değilse 1 döner, boşsa 0 döner
Örnek
Şöyle yaparız. If/else yazmanın bir  başka yolu
# Check existence of JAVA_HOME
[ -n "${JAVA_HOME:-}" ] &&
{ echo "JAVA_HOME check: ADDED"; export PATH="${JAVA_HOME}/bin:$PATH"; } ||
{ echo "JAVA_HOME check: MISSING"; }
Örnek
Şöyle yaparız. Bir komut çalıştırıp çıktısını alırız ve eğer çıktı boş değilse dosyaya yazdırırız
var=$(mycommand)
[[ -n $var ]] && printf '%s\n' "$var" > myfile
Örnek
Şöyle yaparız
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
    ...
else
  ...
fi
Şöyle yaparız. Burada "command substitution" yapılıyor. Sonra -n ile string'in boş olmadığı kontrol ediliyor.
if [ "$(id -u)" -eq 0 ]
then
    if [ -n "$SUDO_USER" ] #String boş değilse 1 döner
    then
        printf "This script has to run as root (not sudo)\n" >&2
        exit 1
    fi
    printf "OK, script run as root (not sudo)\n"
else
    printf "This script has to run as root\n" >&2
    exit 1
fi
-v seçeneği - Değer Atanmış Değişken Kontrolü  -True if the shell variable VAR is set.

Örnek 
Elimizde şöyle bir kod olsun. USR1 signal gelirse ve sleep_pid değişkenine değer atanmışsa kontrolü yapılabiliyor.
#!/usr/bin/env bash

kill_the_sleeper () {
   
  if [ -v sleep_pid ]; then
    kill "$sleep_pid"
  fi
}

trap kill_the_sleeper USR1 EXIT

while true; do
  # Signals don't interrupt foreground jobs,
  # but they do interrupt "wait"
  # so we "sleep" as a background job
  sleep 5m &
  # We remember its PID so we can clean it up
  sleep_pid="$!"
  # Wait for the sleep to finish or someone to interrupt us
  wait
  # At this point, the sleep process is dead (either it finished, or we killed it)
  unset sleep_pid

  # PART X: code that executes every 5 mins
done
Bu script çalışırken USR signal gönderilir. Şöyle yaparız
kill -USR1 "$pid_of_the_script"
veya
pkill -USR1 -f my_fancy_script
-z seçeneği - True if string is empty
Örnek
Şöyle yaparız
if [ -z ${CONDITION} ]; then
Şu çalışmaz. CONDITION değişkenine değer atanmadığı halde hep true döner
if $CONDITION; then echo "True" else echo "False" fi


Hiç yorum yok:

Yorum Gönder