24 Temmuz 2020 Cuma

bash parameter expansion - Genellikle String İşlemleri İçindir

Giriş
Parameter expansion çok fazla farklı söz dizimine/forma sahip. Bu yüzden bence karışık bir konu. Bazı temel özellikler şöyle

Temel Kullanım

1. Değişkenin Değerine Erişmek
Bir değişkenin değerine erişmek istediğimizde parameter expansion yapmak gerekir. Bu durumda $foo şeklinde kullanırız. Yani dolar işaretinden sonra değişken ismi gelir. 

Bazen değişkene bitişik olarak başka karakterler de bulunur. Bu durumda değişken ismini süslü parantezler içine almak gerekir. ${foo}abc şeklide kullanırız

2. Değişkene Varsayılan Değer Atamak - Default Expansion
Değişkene değer atanmamışsa varsayılan bir değer kullanmak isteyebiliriz. Açıklaması şöyle
One useful form of parameter expansion is to use a default value for a variable if it is not set. This is done with the syntax: ${VAR:-DFLT}.
Örnek
Şöyle yaparız
TEST_MODE=${TEST_MODE:-0}

3. Değişkenini Uzunluğuna Erişmek
Açıklaması şöyle
The final form of parameter expansion I want to mention is one which simply expands to the length of the variable's value, its form is ${#VAR}.
Örnek
Şöyle yaparız
str=abcdef
echo ${#str}
Çıktı olarak 6 alırız

Gelişmiş Kullanım

1. Replace a Substring veya String Substitution
Açıklaması şöyle
Another useful form of parameter expansion is to expand a variable and do string substitution on the value using the form ${VAR/search/replace}
Örnek
Şöyle yaparız. var1 değişkeni içindeki placeholder var2 ile yer değişiyor
var1='<tr>
    <th>unique_placeholder_var2</th>
  </tr>'
var2=test
echo "${var1/unique_placeholder_var2/"$var2"}"

Örnek
Şöyle yaparız
files=(*)
echo "${files[@]/#/--hidden-import=}"
Açıklaması şöyle. Eşleşmenin başına "--hidden-import="  eklemesi yapar.
Here the # in ${var/#match/replacement} makes it replace the (zero-length) matching string only at the beginning of the variable. Also note the usage of files[@] to get all elements of the array instead of just the first one.
Çıktı olarak şunu alırız
--hidden-import=cpu_mon --hidden-import==disk_mon --hidden-import==mem_mon
2. Remove Suffix - % veya %% Kullanılır
Açıklaması şöyle. Tek % karakteri varsa en kısa eşleşme silinir, çift % karakteri varsa en uzun eşleşme silinir.
The form ${VAR%pattern} removes a matching suffix (single percent for the shortest suffix, double for the longest). 
Remove Suffix ve Remove Prefix ile ilgili hatırlatıcı bir not şöyle
Note: if you have trouble remembering which is which of these two syntaxes, the "#" is to the left of the "%" key on your keyboard, just as prefixes come before suffixes. Also note that these are glob patterns not regular expressions.
Örnek
Şöyle yaparız. TLC_2017.csv isimli dosyayı TLC_2017_prepped.csv haline getirir
for file in TLC*.csv; do
    cut -d, -f2- "${file}" > "${file%.*}_prepped.csv"
done
Açıklaması şöyle
${file%.*} removes everything after the last dot of $file. If you want to remove everything after the first dot, then you would use %%.

Likewise, ${file#*.} and ${file##*.} remove everything before the first/last dot.

3. Remove Prefix - 
# veya ## Kullanılır
Açıklaması şöyle. Tek hash karakteri varsa en kısa eşleşme silinir, çift hash karakteri varsa en uzun eşleşme silinir.
The form ${VAR#pattern} removes any prefix from the expanded value that matches the pattern. The removed prefix is the shortest matching prefix, if you use double pound-signs/hash-marks the longest matching prefix is removed.
Örnek
Şöyle yaparız. İlk karakteri siler
$ line=abc; echo "${line#?}"
bc
Açıklaması şöyle
More generally, ${variablename#word} removes word from the beginning of the contents of variablename. This is called prefix removal. word is treated as a glob which means that ? matches any single character.
Örnek
Şöyle yaparız. proj_env_repo ile başlayan bir sürü değişken bulunur. Bu değişkenlerin isminden proj_env_repo çıkarılır. Böylece TF_ENV_db_username değişkeni username değeri ile export edilir.
proj_env_repo_db_username=username
proj_env_repo_db_host=host
proj_env_repo_db_port=port

for variable in "${!proj_env_repo@}"; do
    export "TF_ENV${variable#proj_env_repo}"="${!variable}"
done

4. Extract Substring
Açıklaması şöyle. Offset olarak eksi sayılar da kullanılabilir. 
Another expansion that exists is to extract substrings from the expanded value using the form ${VAR:offset:length}. This works in the expected form: offsets start at zero, if you don't specify a length it goes to the end of the string. 
Örnek
Bir sayının ilk karakterine erişmek için şöyle yaparız.
$ var=901.32.02
$ first_char="${var:0:1}"
$ echo "${first_char}"
9
Örnek
Eksi sayı verirsek sondan itibaren ileriye doğru sayar. Eksi sayıları echo ${str:-3:2} şeklinde yazamıyoruz çünkü "Default Expansion" ile karışıyor. Bu yüzden eksi sayıları parantez içine almak lazım. Şöyle yaparız. Çıktı olarak "fg" alırız
str=abcdefgh
echo ${str:$((-3)):2}
Açıklaması şöyle
The "$((...))" causes bash to treat the value as an arithmetic expansion (ie a number)

5. Convert Uppercase to Lowercase veya tersi
Örnek
Şöyle yaparız.
$ str="HELLO"
$ printf '%s\n' "${str,,[HEO]}"
heLLo

Hiç yorum yok:

Yorum Gönder