1

设想:

我有一个名为的 python 脚本bc4j.py,其中有一个全局变量

correctBc4jfiles = [] 

此变量包含所有文件的列表

现在我想调用另一个 shell 脚本,例如mail.sh在这个 python 脚本和那个 shell 脚本中

  1. 我想知道correctBc4jfiles变量包含的文件数
  2. 我想迭代这个变量correctBc4jfiles。我将如何在 shell 脚本中迭代它。
  3. 我想将correctBc4jfiles变量的值分配给另一个属于 shell 脚本本身的数组变量。
  4. 我们可以将多个变量从 python 传递到 shell 脚本吗?就像在这种情况下我们只传递一个变量correctBc4jfiles?我怎样才能做到这一点?

谢谢

4

2 回答 2

1

为了只传递一个参数,你可以有一个这样的 python 脚本:

import subprocess
correctBc4jfiles = ["1","2","3"]
subprocess.call(["/bin/bash", "/path/to/mail.sh"] + correctBc4jfiles)

并有一个像这样的 bash 脚本:

#!/bin/bash

# I want to know the number of files the correctBc4jfiles variable holds

echo "$#"

# I want to iterate this variable correctBc4jfiles. how will i iterate it in shell script.

for A in "$@"; do
    echo "$A"
done

# I want to assign the value of the correctBc4jfiles variable into another array variable which belongs to the shell script itself.

ANOTHER=("${@}")

# for A in "${ANOTHER[@]}"; do ...

我们可以将多个变量从 python 传递到 shell 脚本吗?就像在这种情况下我们只传递一个变量correctBc4jfiles?我怎样才能做到这一点?

您必须让您的 python 脚本传递每个变量的值的数量,例如:

import subprocess

var0 = ["|1|", "|2|", "|3|"]
var1 = ["|4|", "|5|", "|6|"]

subprocess.call(["/bin/bash", "script.sh"] + [str(len(var0))] + var0 + [str(len(var1))] + var1)

让 bash 解释它:

#!/bin/bash

varprefix='var'
varindex=0

declare -i  count

while [[ $# -gt 0 ]]; do
    count=$1
    if [[ count -gt 0 ]]; then
        eval "${varprefix}$(( varindex++ ))=(\"\${@:2:count}\")"
        shift "$count"
    fi
    shift
done

set | grep ^var  ## Just show what variables were made.

它给出这样的输出:

var0=([0]="|1|" [1]="|2|" [2]="|3|")
var1=([0]="|4|" [1]="|5|" [2]="|6|")
varindex=2
varprefix=var

因此,您已经可以使用 varX。

如果您不喜欢 varX 格式,您可以将值复制到所需的数组变量:

myarray1=("${var0[@]}")
myarray2=("${var1[@]}")
于 2013-08-29T05:52:54.433 回答
0

你可以:

  • 逐步浏览列表,然后mail.sh为每个文件调用一次。这是最可靠的方法。

  • 将列表中的项目转换为空格分隔的字符串,然后将其传递给mail.sh(假设mail.sh设置正确,它应该接受多个参数)。

您不能做的是将['a.txt','b.txt','c.txt']批发传递给脚本。

于 2013-08-29T05:15:47.227 回答