如何从 shell 脚本(bash)创建所需数量的变量?

如何从 shell 脚本(bash)创建所需数量的变量?

我正在制作一个脚本,用于使用 Upstart 监视某些用户进程,但是,由于它是为我工作的公司提供的,因此他们要求我通用......怎么样?好吧,被监视的进程数量可能会有所不同,就像数量和名称一样,所以我需要创建它,以便用户可以输入“n”个进程并为 shell 提供其路径名,以便我可以将它们存储在变量中并传递 Upstart一个包含它们的脚本,所以我的问题是:如何根据需要创建尽可能多的变量?

到目前为止,这是我的脚本......

./script input

#!/bin/bash

FILENAME=$1
i=1

while read LINE
do
[rutaServ$i]=$LINE
echo "ruta -> [rutaServ$i]"
i=`expr $i + 1`
done < $FILENAME

正如您所看到的,我暂时从纯文本文件中获取路径名,其中仅包含/home/user行,但是当我运行此脚本时,出现以下错误[rutaServ1]=/home/user: The file or directory doesn't exists

这样做的正确方法是什么?

答案1

看起来你的数组语法有点不对劲。另外,不需要索引变量;您可以使用+=运算符附加到数组。

#!/bin/bash

FILENAME=$1

rutaServ=()
while read LINE
do
rutaserv+=($LINE)
echo "ruta -> $LINE"
done < "$FILENAME"

bashv4 有一个新命令mapfile(或readarray)可以一次性将文件内容读入数组:

mapfile rutaServ < "$FILENAME"

要访问数组中的值:

for x in "${rutaserv[@]}"; do
    echo "$x"
done

答案2

脚本可以这样调用吗script.sh process1 process2?然后你可以用以下方式引用参数$@

# set process1 process2 # set arguments for testing

for x in "$@"; do 
    echo "ruta -> $x"
done

[rutaServ$i]=$LINE应该是rutaServ[$i]=$LINErutaServ+=("$LINE").

相关内容