arrays - shell数组添加元素 - shell语法数组




循环Bash中的字符串数组? (11)

我想写一个脚本,通过15个字符串循环(数组可能?)这可能吗?

就像是:

for databaseName in listOfNames
then
  # Do something
end

用于脚本或函数的隐式数组:

除了anubhava的正确答案:如果循环的基本语法是:

for var in "${arr[@]}" ;do ...$var... ;done

在bash有一个特例

当运行脚本或函数时,在命令行传递的参数将被分配给[email protected] array变量,您可以通过$1$2$3等访问。

这可以通过填充(用于测试)

set -- arg1 arg2 arg3 ...

这个数组上的循环可以简单地写成:

for item ;do
    echo "This is item: $item."
  done

请注意 ,保留的工作不存在,也没有数组名称!

样品:

set -- arg1 arg2 arg3 ...
for item ;do
    echo "This is item: $item."
  done
This is item: arg1.
This is item: arg2.
This is item: arg3.
This is item: ....

请注意,这与之相同

for item in "[email protected]";do
    echo "This is item: $item."
  done

然后进入脚本

#!/bin/bash

for item ;do
    printf "Doing something with '%s'.\n" "$item"
  done

将它保存在一个脚本chmod +x myscript.sh ,然后chmod +x myscript.sh

./myscript.sh arg1 arg2 arg3 ...
Doing something with 'arg1'.
Doing something with 'arg2'.
Doing something with 'arg3'.
Doing something with '...'.

功能相同:

myfunc() { for item;do cat <<<"Working about '$item'."; done ; }

然后

myfunc item1 tiem2 time3
Working about 'item1'.
Working about 'tiem2'.
Working about 'time3'.

简单的列表

List=(Item1 Item2 Item3 Item4 Item5 Item6)
for Item in ${List[@]} 
do
echo $Item 
done

OUT PUT:

 Item1
 Item2
 Item3
 Item4
 Item5
 Item6

如果一个条目有空格,将需要引用它:

List=(
     Item1 
     Item2
     Item3
     Item4
     Item5
     Item6
     'Item 7 needs to be quoted to preserve spaces'
     )

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

OUT PUT:

Item1
Item2
Item3
Item4
Item5
Item6
Item 7 needs to be quoted to preserve spaces

如果需要编号:

List=()
for Item in `seq 1 1 16`
    do 
       List+=(Item$Item)
    done
for Item in ${List[*]}
    do 
        echo $Item
    done

输出是:

Item1
Item2
Item3
Item4
Item5
Item6
Item7
Item8
Item9
Item10
Item11
Item12
Item13
Item14
Item15
Item16

单线循环,

 declare -a listOfNames=('db_a' 'db_b' 'db_c')
 for databaseName in ${listOfNames[@]}; do echo $databaseName; done;

你会得到这样的输出,

db_a
db_b
db_c

声明数组不适用于Korn shell。 对于Korn shell使用下面的例子:

promote_sla_chk_lst="cdi xlob"

set -A promote_arry $promote_sla_chk_lst

for i in ${promote_arry[*]};
    do
            echo $i
    done

尝试这个。 它正在工作和测试。

for k in "${array[@]}"
do
    echo $k
done

# For accessing with the echo command: echo ${array[0]}, ${array[1]}

当然,这是可能的。

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

有关详细信息请参阅Bash循环


我通过我的项目数组来循环执行git pull更新:

#!/bin/sh
projects="
web
ios
android
"
for project in $projects do
    cd  $HOME/develop/$project && git pull
end

本着与4ndrew的回答相同的精神:

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.名字中没有空格:

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

笔记

  1. 在第二个例子中,使用listOfNames="RA RB RC RD"具有相同的输出。

其他引入数据的方式包括:

  • stdin(下面列出),
  • variables ,
  • 一个数组 (接受的答案),
  • 一个文件 ...

从标准输入读取

# 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. 可以在脚本中指定bash IFS “字段分隔符到行”[ 1 ]分隔符以允许其他空格(即IFS='\n'或MacOS IFS='\r' )。
  2. 我也喜欢接受的答案:) - 我已经包含这些片段作为其他有用的方式也回答了这个问题。
  3. 在脚本文件的顶部包含#!/bin/bash表示执行环境。
  4. 花了几个月的时间才弄清楚如何编写这个简单的:)

其他来源( 阅读循环


这与user2533809的答案类似,但每个文件都将作为单独的命令执行。

#!/bin/bash
names="RA
RB
R C
RD"

while read -r line; do
    echo line: "$line"
done <<< "$names"

这也很容易理解:

FilePath=(
    "/tmp/path1/"    #FilePath[0]
    "/tmp/path2/"    #FilePath[1]
)

#Loop
for Path in "${FilePath[@]}"
do
    echo "$Path"
done

listOfNames="db_one db_two db_three"
for databaseName in $listOfNames
do
  echo $databaseName
done

要不就

for databaseName in db_one db_two db_three
do
  echo $databaseName
done




unix