Bash脚本-传递不同的参数

Bash脚本-传递不同的参数,bash,scripting,arguments,parameter-passing,Bash,Scripting,Arguments,Parameter Passing,此脚本必须运行4次,并相应地更改其路径。但只有名称更改了4次,路径保持不变。 你知道剧本有什么问题吗?我对bash还不熟悉 #!bin/bash File=/tmp/tmp.txt NAME=(NAME1 NAME2 NAME3 NAME4) DIR=(/home/path1 /home/path2 /home/path3 /home/path4) for NAME in "${NAME[@]}" do /sbin/myprogram start --re

此脚本必须运行4次,并相应地更改其路径。但只有名称更改了4次,路径保持不变。 你知道剧本有什么问题吗?我对bash还不熟悉

#!bin/bash

File=/tmp/tmp.txt
NAME=(NAME1 NAME2 NAME3 NAME4)
DIR=(/home/path1 /home/path2 /home/path3 /home/path4)

for NAME in "${NAME[@]}"
     do
             /sbin/myprogram start --read $FILE --path $DIR --name $NAME
     done;
通常,我会尝试自动执行此命令:

/sbin/myprogram start --read /tmp/tmp.txt --path /home/path1 --name NAME1
/sbin/myprogram start --read /tmp/tmp.txt --path /home/path2 --name NAME2
/sbin/myprogram start --read /tmp/tmp.txt --path /home/path3 --name NAME3
/sbin/myprogram start --read /tmp/tmp.txt --path /home/path4 --name NAME4
我们可以修改脚本以作为开始吗

for FILE in /tmp/txt
然后每次分别读取NAME和Dir


我不想把它直接放在脚本中,因为可能有更多的路径、名称,甚至可能有多个txt

在脚本中,您只在NAME数组上循环,而不是在NAME和DIR数组上循环。有关如何并行循环阵列的更多详细信息,请参阅以下问题:

我认为在您的情况下,一个更简单的解决方案是使用函数:

#!/bin/sh

run () {
    /sbin/myprogram start --read /tmp/tmp.txt --path "$1" --name "$2"
}

run /home/path1 NAME1
run /home/path2 NAME2
run /home/path3 NAME3
run /home/path4 NAME4

~

如果有两个或多个相同大小的数组, 想对相应的索引做些什么, 您需要遍历索引,而不是像以前那样遍历元素

例如,像这样:

for ((i = 0; i < ${#NAME[@]}; ++i))
do
    /sbin/myprogram start --read $FILE --path ${DIR[$i]} --name ${NAME[$i]}
done
((i=0;i<${NAME[@]};++i))的
for
做
/sbin/myprogram start--read$FILE--path${DIR[$i]}--name${name[$i]}
完成
更新

您在评论中提到,如果出现错误,您希望中断循环。有一种方法可以做到这一点:

for ((i = 0; i < ${#NAME[@]}; ++i))
do
    /sbin/myprogram start --read $FILE --path ${DIR[$i]} --name ${NAME[$i]} || break
done
((i=0;i<${NAME[@]};++i))的
for
做
/sbin/myprogram start--read$FILE--path${DIR[$i]}--name${name[$i]}| | break
完成

这与您标记为正确的解决方案具有相同的功能,但更易于阅读

File=/tmp/tmp.txt
NAME=(NAME1 NAME2 NAME3 NAME4)
DIR=(/home/path1 /home/path2 /home/path3 /home/path4)

for index in ${!NAME[*]}; do 
   /sbin/myprogram start --read $FILE --path ${DIR[$index]} --name ${NAME[$index]}
done

你可以看看这个帖子:好的,谢谢。你能告诉我如何循环name和DIR吗?它可能会帮助我理解它,并在将来用于其他用途。@goldflake 129:这里已经有了一些很好的答案: