Loop through an array of strings in Bash?

前端 未结 19 2781
情深已故
情深已故 2020-11-22 03:59

I want to write a script that loops through 15 strings (array possibly?) Is that possible?

Something like:

for databaseName in listOfNames
then
  # D         


        
相关标签:
19条回答
  • 2020-11-22 04:24

    If you are using Korn shell, there is "set -A databaseName ", else there is "declare -a databaseName"

    To write a script working on all shells,

     set -A databaseName=("db1" "db2" ....) ||
            declare -a databaseName=("db1" "db2" ....)
    # now loop 
    for dbname in "${arr[@]}"
    do
       echo "$dbname"  # or whatever
    
    done
    

    It should be work on all shells.

    0 讨论(0)
  • 2020-11-22 04:25

    That is possible, of course.

    for databaseName in a b c d e f; do
      # do something like: echo $databaseName
    done 
    

    See Bash Loops for, while and until for details.

    0 讨论(0)
  • 2020-11-22 04:25

    You can use the syntax of ${arrayName[@]}

    #!/bin/bash
    # declare an array called files, that contains 3 values
    files=( "/etc/passwd" "/etc/group" "/etc/hosts" )
    for i in "${files[@]}"
    do
        echo "$i"
    done
    
    0 讨论(0)
  • 2020-11-22 04:31

    Simple way :

    arr=("sharlock"  "bomkesh"  "feluda" )  ##declare array
    
    len=${#arr[*]}  # it returns the array length
    
    #iterate with while loop
    i=0
    while [ $i -lt $len ]
    do
        echo ${arr[$i]}
        i=$((i+1))
    done
    
    
    #iterate with for loop
    for i in $arr
    do
      echo $i
    done
    
    #iterate with splice
     echo ${arr[@]:0:3}
    
    0 讨论(0)
  • 2020-11-22 04:33

    Yes

    for Item in Item1 Item2 Item3 Item4 ;
      do
        echo $Item
      done
    

    Output:

    Item1
    Item2
    Item3
    Item4
    

    To preserve spaces; single or double quote list entries and double quote list expansions.

    for Item in 'Item 1' 'Item 2' 'Item 3' 'Item 4' ;
      do
        echo "$Item"
      done
    

    Output:

    Item 1
    Item 2
    Item 3
    Item 4
    

    To make list over multiple lines

    for Item in Item1 \
                Item2 \
                Item3 \
                Item4
      do
        echo $Item
      done
    

    Output:

    Item1
    Item2
    Item3
    Item4
    


    Simple list variable

    List=( Item1 Item2 Item3 )
    

    or

    List=(
          Item1 
          Item2 
          Item3
         )
    

    Display the list variable:

    echo ${List[*]}
    

    Output:

    Item1 Item2 Item3
    

    Loop through the list:

    for Item in ${List[*]} 
      do
        echo $Item 
      done
    

    Output:

    Item1
    Item2
    Item3
    

    Create a function to go through a list:

    Loop(){
      for item in ${*} ; 
        do 
          echo ${item} 
        done
    }
    Loop ${List[*]}
    

    Using the declare keyword (command) to create the list, which is technically called an array:

    declare -a List=(
                     "element 1" 
                     "element 2" 
                     "element 3"
                    )
    for entry in "${List[@]}"
       do
         echo "$entry"
       done
    

    Output:

    element 1
    element 2
    element 3
    

    Creating an associative array. A dictionary:

    declare -A continent
    
    continent[Vietnam]=Asia
    continent[France]=Europe
    continent[Argentina]=America
    
    for item in "${!continent[@]}"; 
      do
        printf "$item is in ${continent[$item]} \n"
      done
    

    Output:

     Argentina is in America
     Vietnam is in Asia
     France is in Europe
    

    CVS variables or files in to a list.
    Changing the internal field separator from a space, to what ever you want.
    In the example below it is changed to a comma

    List="Item 1,Item 2,Item 3"
    Backup_of_internal_field_separator=$IFS
    IFS=,
    for item in $List; 
      do
        echo $item
      done
    IFS=$Backup_of_internal_field_separator
    

    Output:

    Item 1
    Item 2
    Item 3
    

    If need to number them:

    ` 
    

    this is called a back tick. Put the command inside back ticks.

    `commend` 
    

    It is next to the number one on your keyboard and or above the tab key. On a standard american english language keyboard.

    List=()
    Start_count=0
    Step_count=0.1
    Stop_count=1
    for Item in `seq $Start_count $Step_count $Stop_count`
        do 
           List+=(Item_$Item)
        done
    for Item in ${List[*]}
        do 
            echo $Item
        done
    

    Output is:

    Item_0.0
    Item_0.1
    Item_0.2
    Item_0.3
    Item_0.4
    Item_0.5
    Item_0.6
    Item_0.7
    Item_0.8
    Item_0.9
    Item_1.0
    

    Becoming more familiar with bashes behavior:

    Create a list in a file

    cat <<EOF> List_entries.txt
    Item1
    Item 2 
    'Item 3'
    "Item 4"
    Item 7 : *
    "Item 6 : * "
    "Item 6 : *"
    Item 8 : $PWD
    'Item 8 : $PWD'
    "Item 9 : $PWD"
    EOF
    

    Read the list file in to a list and display

    List=$(cat List_entries.txt)
    echo $List
    echo '$List'
    echo "$List"
    echo ${List[*]}
    echo '${List[*]}'
    echo "${List[*]}"
    echo ${List[@]}
    echo '${List[@]}'
    echo "${List[@]}"
    

    BASH commandline reference manual: Special meaning of certain characters or words to the shell.

    0 讨论(0)
  • 2020-11-22 04:33

    In the same spirit as 4ndrew's answer:

    listOfNames="RA
    RB
    R C
    RD"
    
    # To allow for other whitespace in the string:
    # 1. add double quotes around the list variable, or
    # 2. see the IFS note (under 'Side Notes')
    
    for databaseName in "$listOfNames"   #  <-- Note: Added "" quotes.
    do
      echo "$databaseName"  # (i.e. do action / processing of $databaseName here...)
    done
    
    # Outputs
    # RA
    # RB
    # R C
    # RD
    

    B. No whitespace in the names:

    listOfNames="RA
    RB
    R C
    RD"
    
    for databaseName in $listOfNames  # Note: No quotes
    do
      echo "$databaseName"  # (i.e. do action / processing of $databaseName here...)
    done
    
    # Outputs
    # RA
    # RB
    # R
    # C
    # RD
    

    Notes

    1. In the second example, using listOfNames="RA RB R C RD" has the same output.

    Other ways to bring in data include:

    • stdin (listed below),
    • variables,
    • an array (the accepted answer),
    • a file...

    Read from stdin

    # line delimited (each databaseName is stored on a line)
    while read databaseName
    do
      echo "$databaseName"  # i.e. do action / processing of $databaseName here...
    done # <<< or_another_input_method_here
    
    1. the bash IFS "field separator to line" [1] delimiter can be specified in the script to allow other whitespace (i.e. IFS='\n', or for MacOS IFS='\r')
    2. I like the accepted answer also :) -- I've include these snippets as other helpful ways that also answer the question.
    3. Including #!/bin/bash at the top of the script file indicates the execution environment.
    4. It took me months to figure out how to code this simply :)

    Other Sources (while read loop)

    0 讨论(0)
提交回复
热议问题