Bash脚本 - 传递不同的参数

时间:2015-10-03 13:52:33

标签: 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 --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。

3 个答案:

答案 0 :(得分:2)

在您的脚本中,您只是遍历NAME数组而不是NAME和DIR数组。有关如何并行循环遍历数组的更多详细信息,可以参考以下问题:Iterate over two arrays simultaneously in bash

我认为在您的情况下更直接的解决方案是使用函数:

#!/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

答案 1 :(得分:1)

如果您有2个或更多相同大小的数组, 并希望对相应的索引做一些事情, 你需要迭代索引而不是像你那样迭代元素。

例如,像这样:

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

<强>更新

你在评论中提到,如果有错误,你想要摆脱循环。这是一种方法:

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

答案 2 :(得分:0)

这与您标记为正确的解决方案完全相同,但只是更容易阅读。

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