如何使用变量在bash中运行内联python?

ikr*_*reb 0 python bash shell

我想与来自我的 bash 脚本的变量一起运行 python 内联命令。它在没有导入行的情况下工作。

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

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

tri*_*eee 5

\n被传递的逐字,并且没有意义到Python。最方便的解决方法可能是使用分号代替,Python 几乎只支持分号,以允许您在另一种语言的脚本中编写简单的单行代码。

    OUT=$(python3 -c "import pprint; print('$filename')")
Run Code Online (Sandbox Code Playgroud)

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

    OUT=$(python3 -c "import pprint
print('$filename')")
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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