首页 > 解决方案 > 如何在带有变量的bash中运行内联python?

问题描述

我想运行一个 python 内联命令以及我的 bash 脚本中的变量。它在没有导入行的情况下工作。

for filename in *.txt; do
    OUT=$(python3 -c "import pprint\nprint('$filename')")
    mv $file $OUT
done

但我收到错误消息SyntaxError: unexpected character after line continuation character

标签: pythonbashshell

解决方案


逐字传递,\n对 Python 没有意义。最方便的解决方法可能是改用分号,Python 支持分号只是为了让您可以在另一种语言的脚本中编写简单的单行代码。

    OUT=$(python3 -c "import pprint; print('$filename')")

你也可以传入一个实际的换行符;

    OUT=$(python3 -c "import pprint
print('$filename')")

虽然你为什么import pprint不使用它的时候呢?我猜你想要pprint()文件名,不是print()吗?

如果文件名包含文字单引号,这仍然可能失败。在 Python 方面,您可以通过将字符串读取为命令行参数来解决此问题。

    OUT=$(python3 -c "import pprint, sys; pprint.pprint(sys.argv[1])" "$filename")

顺便说一句,您不应该为您的私有 shell 变量使用大写字母,并引用该变量。

for filename in ./*.txt; do
    out=$(python3 -c "import pprint, sys; pprint.pprint(sys.argv[1])" "$filename")
    mv "$file" "$out"
done

添加./的内容避免了以破折号开头的文件名将被解析为mv. 实际上,更好的重构是执行重命名——也许还有循环!- 在 Python 中。在 shell 脚本中正确传递文件名并在工具之间完整地引用等比它应该的更具挑战性。

python3 -c 'import pprint, sys, shutil; for file in sys.argv[1:]: shutil.move(file, pprint.pformat(file))' ./*.txt

推荐阅读