Chcę napisać skrypt, który zapętla 15 ciągów znaków (ewentualnie tablica?) Czy to możliwe?
Coś jak:
for databaseName in listOfNames
then
# Do something
end
Możesz użyć tego w następujący sposób:
## declare an array variable
declare -a arr=("element1" "element2" "element3")
## now loop through the above array
for i in "${arr[@]}"
do
echo "$i"
# or do whatever with individual element of the array
done
# You can access them using echo "${arr[0]}", "${arr[1]}" also
Działa również w przypadku deklaracji tablicy wieloliniowej
declare -a arr=("element1"
"element2" "element3"
"element4"
)
To oczywiście możliwe.
for databaseName in a b c d e f; do
# do something like: echo $databaseName
done
Zobacz Bash Loops dla, podczas i do, aby uzyskać szczegółowe informacje.
for year in $(seq 2000 2013)
.DATABASES="a b c d e f"
.Żadna z tych odpowiedzi nie zawiera licznika ...
Wynik:
źródło
echo "$i / ${arraylength} : ${array[$i-1]}"
- w przeciwnym razie, jeśli$i
zawiera glob, zostanie rozwinięty, jeśli zawiera kartę, zostanie zmieniony na spacja itp.tak
Wynik:
Aby zachować spacje; pozycje listy pojedynczych lub podwójnych cytatów i rozszerzenia listy podwójnych cytatów
Wynik:
Aby utworzyć listę w wielu wierszach
Wynik:
Prosta zmienna listy
lub
Wyświetl zmienną listy:
Wynik:
Pętlę przez listę:
Wynik:
Utwórz funkcję, aby przejrzeć listę:
Za pomocą słowa kluczowego (polecenia) deklaruj, aby utworzyć listę, która jest technicznie nazywana tablicą:
Wynik:
Tworzenie tablicy asocjacyjnej. Słownik:
Wynik:
Zmienne CVS lub pliki na liście .
Zmiana wewnętrznego separatora pól z przestrzeni na to, co chcesz.
W poniższym przykładzie zmieniono go na przecinek
Wynik:
W razie potrzeby je ponumerować:
nazywa się to tyknięciem wstecznym. Umieść polecenie wewnątrz tyknięcia.
Znajduje się obok cyfry 1 na klawiaturze i powyżej klawisza tab. Na standardowej klawiaturze w języku angielskim.
Dane wyjściowe to:
Zapoznanie się z zachowaniem bashesa:
Utwórz listę w pliku
Wczytaj plik listy do listy i wyświetl
Instrukcja obsługi wiersza poleceń BASH: Specjalne znaczenie niektórych znaków lub słów w powłoce.
źródło
"${List[@]}"
być poprawny, z cytatami .${List[@]}
jest źle.${List[*]}
jest źle. SpróbujList=( "* first item *" "* second item *" )
- uzyskasz prawidłowe zachowaniefor item in "${List[@]}"; do echo "$item"; done
, ale nie z żadnego innego wariantu.List=( "first item" "second item" )
zostaną podzielone nafirst
,item
,second
,item
jak również).ls
wyników, co jest sprzeczne z najlepszymi praktykami .W tym samym duchu, co odpowiedź 4ndrew:
B. Brak białych znaków w nazwach:
Notatki
listOfNames="RA RB R C RD"
ma tę samą moc wyjściową.Inne sposoby wprowadzania danych obejmują:
Czytaj ze standardowego
IFS='\n'
lub dla MacOSIFS='\r'
)#!/bin/bash
u góry pliku skryptu wskazuje środowisko wykonywania.Inne źródła ( podczas pętli odczytu )
źródło
IFS
. (Dla wszystkich,IFS
pozwala określić konkretny ogranicznik, który pozwala na włączenie innych znaków spacji bez ciągów znaków).$databaseName
zawiera tylko całą listę, a zatem wykonuje tylko jedną iterację.Możesz użyć składni
${arrayName[@]}
źródło
Zaskoczony, że nikt tego jeszcze nie opublikował - jeśli potrzebujesz indeksów elementów podczas zapętlania tablicy, możesz to zrobić:
Wynik:
Uważam, że jest to o wiele bardziej eleganckie niż „tradycyjny” styl for-loop (
for (( i=0; i<${#arr[@]}; i++ ))
).(
${!arr[@]}
i$i
nie trzeba ich podawać, ponieważ są to tylko liczby; niektórzy i tak sugerowaliby je, ale to tylko osobiste preferencje).źródło
Jest to również łatwe do odczytania:
źródło
IFS=$'\n'
Może to działać również w przypadku innych rozwiązań w tym scenariuszu.Ukryta tablica dla skryptu lub funkcji:
Oprócz poprawnej odpowiedzi anubhavy : Jeśli podstawową składnią pętli jest:
jest szczególny przypadek wgrzmotnąć:
Po uruchomieniu skryptu lub funkcji, argumenty przekazywane w linii poleceń zostanie przypisana do
$@
zmiennej tablicowej, można uzyskać dostęp przez$1
,$2
,$3
, i tak dalej.Można to wypełnić (do testu) przez
Pętla na tej tablicy można napisać po prostu:
Zauważ, że zarezerwowana praca
in
nie jest obecna i nie ma też nazwy tablicy!Próba:
Zauważ, że to jest to samo, co
Następnie do skryptu :
Zapisz to w skrypcie
myscript.sh
,chmod +x myscript.sh
, a następnieTo samo w funkcji :
Następnie
źródło
Lub tylko
źródło
Prosta droga :
źródło
Tablica deklaracji nie działa dla powłoki Korna. Użyj poniższego przykładu dla skorupy Korna:
źródło
for i in ${foo[*]}
jest zasadniczo zawsze niewłaściwa -for i in "${foo[@]}"
jest to forma, która zachowuje granice oryginalnej listy i zapobiega globalnej ekspansji. I echo musi byćecho "$i"
Jest to podobne do odpowiedzi użytkownika 2533809, ale każdy plik zostanie wykonany jako osobne polecenie.
źródło
Jeśli używasz powłoki Korna, istnieje „ set -A databaseName ”, w przeciwnym razie istnieje „ deklaruj -nazwa bazy danych ”
Aby napisać skrypt działający na wszystkich powłokach,
Powinno działać na wszystkich powłokach.
źródło
$ bash --version
GNU bash, wersja 4.3.33 (0) -release (amd64-portbld-freebsd10.0)$ set -A databaseName=("db1" "db2" ....) || declare -a databaseName=("db1" "db2" ....)
bash: błąd składni w pobliżu nieoczekiwanego tokena `('Spróbuj tego. Działa i jest testowany.
źródło
array=( "hello world" )
lubarrray=( "*" )
; W pierwszym przypadku będzie to wydrukowaćhello
iworld
oddzielnie, w drugim będzie wydrukować listę plików, zamiast*
Możliwy pierwszy wiersz każdego skryptu / sesji Bash:
Użyj np .:
Może rozważyć:
echo
interpretuje-e
tutaj jako opcjęźródło
Zapętlenie pojedynczej linii,
otrzymasz taki wynik,
źródło
Tak naprawdę potrzebowałem czegoś takiego:
Na przykład:
(Zabiłoby wszystkie procesy z vlc w ich nazwie)
źródło
Przeglądam szereg moich projektów w celu
git pull
aktualizacji:źródło