Bash 脚本 - 传递不同的参数
Bash script - Pass different arguments
此脚本必须 运行 4 次并相应地更改其路径。但是只有 Name 改变了 4 次而 path 保持不变。
知道脚本有什么问题吗?我是 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 数组上循环。关于如何并行遍历数组的更多细节,可以参考这个问题:Iterate over two arrays simultaneously in bash
我认为您的情况更直接的解决方案是使用函数:
#!/bin/sh
run () {
/sbin/myprogram start --read /tmp/tmp.txt --path "" --name ""
}
run /home/path1 NAME1
run /home/path2 NAME2
run /home/path3 NAME3
run /home/path4 NAME4
~
当您有 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
这与您标记为正确的解决方案的作用相同,但更易于阅读。
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
此脚本必须 运行 4 次并相应地更改其路径。但是只有 Name 改变了 4 次而 path 保持不变。 知道脚本有什么问题吗?我是 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 数组上循环。关于如何并行遍历数组的更多细节,可以参考这个问题:Iterate over two arrays simultaneously in bash
我认为您的情况更直接的解决方案是使用函数:
#!/bin/sh
run () {
/sbin/myprogram start --read /tmp/tmp.txt --path "" --name ""
}
run /home/path1 NAME1
run /home/path2 NAME2
run /home/path3 NAME3
run /home/path4 NAME4
~
当您有 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
这与您标记为正确的解决方案的作用相同,但更易于阅读。
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