首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python脚本中调用shell脚本时将变量从python传递到shell脚本

如何在python脚本中调用shell脚本时将变量从python传递到shell脚本
EN

Stack Overflow用户
提问于 2013-08-29 04:45:45
回答 2查看 4.1K关注 0票数 1

设想情况:

我有一个叫做bc4j.py的python脚本,它有一个全局变量

代码语言:javascript
复制
correctBc4jfiles = [] 

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

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

  1. 我想知道correctBc4jfiles变量保存的文件数
  2. 我想迭代这个变量correctBc4jfiles。我将如何在shell脚本中迭代它。
  3. 我希望将correctBc4jfiles变量的值赋值给另一个属于shell脚本本身的数组变量。
  4. 我们可以将多个变量从python传递到shell脚本吗?就像在这种情况下,我们只传递一个变量correctBc4jfiles?我该怎么做?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-08-29 05:52:54

如果只传递一个参数,您可以拥有这样一个python脚本:

代码语言:javascript
复制
import subprocess
correctBc4jfiles = ["1","2","3"]
subprocess.call(["/bin/bash", "/path/to/mail.sh"] + correctBc4jfiles)

有这样一个bash脚本:

代码语言:javascript
复制
#!/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脚本传递每个变量的值数,如下所示:

代码语言:javascript
复制
import subprocess

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

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

让巴什来解释它:

代码语言:javascript
复制
#!/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.

它给出了这样的输出:

代码语言:javascript
复制
var0=([0]="|1|" [1]="|2|" [2]="|3|")
var1=([0]="|4|" [1]="|5|" [2]="|6|")
varindex=2
varprefix=var

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

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

代码语言:javascript
复制
myarray1=("${var0[@]}")
myarray2=("${var1[@]}")
票数 1
EN

Stack Overflow用户

发布于 2013-08-29 05:15:47

您可以:

  • 逐步遍历列表,然后对每个文件调用一次mail.sh。这是最可靠的方法。
  • 将列表中的项转换为以空格分隔的字符串,然后将其传递给mail.sh (假设mail.sh设置正确,则应该接受多个参数)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18502456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档