bir bash betiğinde bağımsız değişkenler arasında geçiş yapma


16

Bilinmeyen miktarda argüman içeren bir bash betiği yazmak istiyorum.

Bu argümanları nasıl gözden geçirebilir ve onlarla bir şeyler yapabilirim?

Yanlış bir girişim şöyle görünür:

#!/bin/bash
for i in $args; do 
    echo $i
done

Yanıtlar:


28

Bunun için özel bir sözdizimi var:

for i do
  printf '%s\n' "$i"
done

Daha genel olarak, geçerli komut dosyasının veya işlevin parametre listesine özel değişken aracılığıyla erişilebilir $@.

for i in "$@"; do
  printf '%s\n' "$i"
done

Etrafında çift tırnak işareti gerektiğini unutmayın $@, aksi takdirde parametreler joker karakter genişletme ve alan bölme işleminden geçer. "$@"sihir: çift tırnaklara rağmen, parametreler kadar alana genişler.

print_arguments () {
  for i in "$@"; do printf '%s\n' "$i"; done
}
print_arguments 'hello world' '*' 'special  !\characters' '-n' # prints 4 lines
print_arguments ''                                             # prints one empty line
print_arguments                                                # prints nothing

5
#! /usr/bin/env bash
for f in "$@"; do
  echo "$f"
done

Alıntı $@yapmalısınız, çünkü argümanların alıntı yaparsanız boşluk (veya yeni satır, vb.) İçermesi veya a ile kaçması mümkündür \. Örneğin:

./myscript one 'two three'

Bu alıntılar nedeniyle üç değil iki argüman. Alıntı yapmazsanız $@, bu argümanlar kod içinde bölünür.


2
Bunun için bir stenografi varfor f; do ...
glenn jackman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.