Loop through an array of strings in Bash?

前端 未结 19 2785
情深已故
情深已故 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: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 < 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.

提交回复
热议问题