【问题标题】:Bash script - Pass different argumentsBash 脚本 - 传递不同的参数
【发布时间】:2015-12-31 14:53:45
【问题描述】:

此脚本必须运行 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。

【问题讨论】:

标签: bash scripting arguments parameter-passing


【解决方案1】:

这与您标记为正确的解决方案的作用相同,但更易于阅读。

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

【讨论】:

    【解决方案2】:

    当您有 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
    

    【讨论】:

      【解决方案3】:

      在您的脚本中,您仅循环遍历 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
      

      ~

      【讨论】:

      • 好的,谢谢。你能告诉我如何同时循环名称和目录吗?它可能会帮助我理解它并将其用于将来的其他事情。
      • @GoldFlake129:这里已经有一些很好的答案:stackoverflow.com/q/17403498/951890
      猜你喜欢
      • 1970-01-01
      • 2018-03-03
      • 2021-11-18
      • 2012-12-29
      • 2011-11-14
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多