24 Haziran 2020 Çarşamba

bash kodlama - gömülü değişkenler

Giriş
bash içinde bazı değişkenler otomatik olarak tanımlı. Bu değişkenlere "built-in variables" deniyor.
bash içinde aynı zamanda bazı komutlar da otomatik olarak tanımlı. Bu komutlara "built-in commands" deniliyor.

Gömülü Değişkenler her zaman çift tırnak içinde kullanılmalı. Bazı örneklerde öyle gösterimese de bunu bir kural olarak benimsemek lazım. Şöyle yaparız.
$ echo 'echo "$1"' > injection.sh
$ bash injection.sh '/*'
/*
Değişken Listesi
Değişken listesi şöyle
Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.
Positional Parameter Değişkenleri
Positional Parameter için gömülü değişkenler yazısına taşıdım

"$*" değişkeni - tüm parametreleri tek bir string olarak temsil eder
Açıklaması şöyle.
   Special Parameters
       The shell treats several parameters specially.  These parameters may  only
       be referenced; assignment to them is not allowed.
       *      Expands  to the positional parameters, starting from one.  When the
              expansion is not within double quotes,  each  positional  parameter
              expands  to  a  separate  word.  In contexts where it is performed,
              those words are subject to  further  word  splitting  and  pathname
              expansion.   When  the  expansion  occurs  within double quotes, it
              expands to a single word with the value of each parameter separated
              by  the first character of the IFS special variable.  That is, "$*"
              is equivalent to "$1c$2c...", where c is the first character of the
              value  of  the  IFS  variable.  If IFS is unset, the parameters are
              separated by spaces.  If IFS is null,  the  parameters  are  joined
              without intervening separators.
Örnek ver

"$@" değişkeni - tüm parametreleri array olarak temsil eder
$@ değişkeni yazısına taşıdım.

$# değişkeni - number of positional parameters
Açıklaması şöyle
$# is a special variable in bash, that expands to the number of arguments (positional parameters) i.e. $1, $2 ... passed to the script in question or the shell in case of argument directly passed to the shell e.g. in bash -c '...' .....

This is similar to argc in C.
Örnek - betiğe geçen parametre sayısı
Şöyle yaparız
$ bash -c 'echo $#'
0

$ bash -c 'echo $#' _ x
1

$ bash -c 'echo $#' _ x y
2

$ bash -c 'echo $#' _ x y z
3
Örnek - betiğe geçen parametre sayısı
Belli sayıda parametre bekliyorsak betiğin başında şöyle yaparız.
if [[ $# -ne 1 ]]; then
  echo 'One argument required for file name'
  exit 1
fi
Örnek - metoda geçen parametre sayısı
Burada dikkat edilmesi gereken nokta eğer $# gömülü değişkenini bir metod içinde kullanırsak metoda geçen parametre sayısını dönmesi. Şöyle yaparız. Sonuç olarak 3 alırız.
#!/bin/sh

f() {
  echo "$#"
}

f a b c
Dolayısıyla şu kod betiğe geçen parametre sayısını kontrol etmek için uygun değil.
#!/bin/sh

check_args() { # doesn't work!
  if [ "$#" -ne 2 ]; then
    printf '%s: error: need 2 arguments, got %d\n' "$0" "$#" >&2
    exit 1
  fi
}

# Maybe check some other things...
check_args
# Do other stuff...
Doğru kod şöyle
#!/bin/sh

check_args() { # works -- the caller must pass the number of arguments received
  if [ "$1" -ne 2 ]; then
    printf '%s: error: need 2 arguments, got %d\n' "$0" "$1" >&2
    exit 1
  fi
}

# Maybe check some other things...
check_args "$#"
$? değişkeni
$? değişkeni yazısına taşıdım.

$$ değişkeni - process id of script
$$ değişkeni yazısına taşıdım.

$- değişkeni
set built-in komutu tarafından atanan seçenekler erişmek için kullanılır
Örnek
set -e yapılıp yapılmadığını anlamak için şöyle yaparız
if [[ $- == *e* ]]
$_ değişkeni
Açıklaması şöyle.
When Bash invokes an external command, the variable ‘$_’ is set to the full pathname of the command and passed to that command in its environment.
$! değişkeni
$! değişkeni yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder