【发布时间】:2015-03-01 22:26:40
【问题描述】:
我正在尝试用 bash 编写一个小程序,其中一部分需要能够从 txt 文件中获取一些值,其中不同的文件由一行分隔,然后将每一行添加到变量中或添加每行到一个数组。
到目前为止,我已经尝试过:
FILE=$"transfer_config.csv"
while read line
do
MYARRAY[$index]="$line"
index=$(($index+1))
done < $FILE
echo ${MYARRAY[0]}
这只是产生一个空行,而不是配置文件第一行的内容。
我没有返回任何错误,这就是为什么我不太确定为什么会发生这种情况。
通过使用os.system("$HOME/bin/mcserver_config/server_transfer/down/createRemoteFolder") 的python 脚本调用bash 脚本,但如果我只是在python 程序生成bash 脚本读取的文件后调用它,它就可以工作。
我几乎 100% 确定这不是目录问题,因为 bash 脚本顶部的 pwd 将其显示在正确的目录中,并且 python 程序也在正确的位置创建数据文件.
非常感谢任何帮助。
编辑:
我还尝试了subprocess.call("path_to_script", shell=True) 看看它是否会有所作为,我知道这不太可能,但它没有。
【问题讨论】:
-
您使用的是什么版本的 bash?我怀疑循环是在子shell中运行的,因此运行实际脚本的shell看不到对变量的更改,但是较新版本的bash在将stdin重定向到常规文件时不会这样做。(我无法重现该行为使用 bash 4.3)
-
@Wintermute 我正在使用
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)。我将如何阻止您在评论中所说的事情发生? -
您的代码对我来说很好用。运行脚本时 csv 文件是否在当前目录中?此外,它可能没有任何区别,但请注意
FILE=$"transfer_config.csv"会导致文件名根据当前语言环境进行翻译。为避免这种情况,请删除$。 -
您的 bash 和我的(我的是 4.3.33)不太可能在这里表现不同。文件是否在脚本的工作目录中,运行脚本的用户是否具有读取权限?
-
只需使用
mapfile而不是您的while 循环:mapfile -t myarray < "$file",并使用declare:declare -p myarray检查您的数组的内容。