从bash

时间:2015-10-27 13:09:21

标签: python bash

我正试图运行这个:

python -c "for i in range(10):\n  print i"

但是我收到了错误:

File "<string>", line 1
for i in range(10):\n  print i
                             ^
SyntaxError: unexpected character after line continuation character

根据this我假设bash应该已处理(即换行符号)命令行参数,但返回的错误显示相反的情况。我哪里错了,为什么会这样?

P.S。蟒-2.7

修改

让我解释一下我的动机。 这个代码示例肯定很傻。由于the doc表示“command可以是由换行符分隔的一个或多个语句,并且在正常模块代码中具有重要的前导空格”,因此我对如何将这些提到的换行符带到{{{ 1}}正确。 这里提出的解决方案是:

  1. 使用command区分循环内的多个命令。是的,虽然有效,但它仍然是单行,我无法使用它如果我想在循环之后运行一些命令;不能替代换行符。

  2. 输入需要换行符的;。这更准确地击中了目标但不幸的是,在我看来,这基本上破坏了从命令行运行python代码的整个想法,因为它需要交互模式。据我所知,它与输入命令ant命中^M键相同。因此,键入Enter并在其shell中工作没有区别。也就是说,我不能用bash脚本写这个。或者我可以吗?

  3. 可能这个问题应该分为两个:

    1. Bash逃脱:
        

      用双引号括起来的字符('“')保留引号内所有字符的字面值,除了'$','python'在双引号中保留它们的特殊含义(参见Shell Expansions)只有在跟随下列字符之一时,反斜杠才会保留其特殊含义:'$','`',''','\'或换行符。

    2. 这与所描述的情况如何对应? bash如何处理换行符?我发现将命令放在一元引号中没有任何改变。

      1. 如何以非交互方式将换行符传递给python。 (你可能会说 - 你为什么不用你想要的所有换行编写一个普通的python文件 - 你是对的,但我对文档中的确切含义感兴趣,因为它引用换行符)

3 个答案:

答案 0 :(得分:3)

删除\n

python -c "for i in range(10):  print i"

您可以使用;在for循环中使用多行

python -c "for i in range(10): print '1st newline';print '2nd newline';print i"

答案 1 :(得分:3)

您实际上需要将\n部分转换为实际换行符。这可以使用$''语法完成:

python -c $'for i in range(10):\n  print i'
0
1
2
3
4
5
6
7
8
9

您还可以使用echo -eprintf

来达到该结果
$ python -c "$(echo -e "for i in range(10):\n  print i")"

你也可以使用这里的字符串:

$ python <<< $(echo -e "for i in range(10):\n  print i")

有关详细信息,请参阅Bash手册页的3.1.2.4 ANSI-C Quoting部分。

答案 2 :(得分:1)

您可以通过在行中添加CR字符来运行多行python -c语句:

python -c "for i in range(10):^M print (i)^M print ('Hello:' + str(i*i))" 

其中^ M实际上并非后跟M,它实际上是您键入[CTRL-v] [CTRL-m]时获得的字符。注意这个字符后面的空格,这意味着for循环中有两个print语句,它应该打印:

0
Hello:0
1
Hello:1
....
9
Hello:81

您也可以在bash脚本中执行此操作:

#!/bin/bash
A="python -c \"for i in range(10):^M print (i)^M print ('Hello:' + str(i*i))\""
eval $A