解决方案是使用

解决方案是使用

cut -d$'\n' -f5 /home/me/Documents/file.txt

在终端中运行并返回文件的第五行时,此代码运行正常。但在脚本中

AWKED=`cut -d$'\n' -f5 /home/me/Documents/file.txt`

给出这个输出

cut:分隔符必须是单个字符

尝试“cut --help”获取更多信息。

为什么它的行为与直接在终端中运行时不同?

编辑:

我也尝试过使用<而且我尝试过

awked=$(cat /home/me/Documents/file.txt | cut -d$'\n' -f5)

同样,它在终端中运行良好,但在脚本中却不行,出现与以前相同的错误。

编辑2:

输出grep -i awked script.sh | od -c

0000000   a   w   k   e   d   =   $   (   c   u   t       -   d   $   '
0000020   \   n   '       -   f   5       /   h   o   m   e   /   m   e
0000040   /   D   o   c   u   m   e   n   t   s   /   f   i   l   e   .
0000060   t   x   t   )  \n
0000065

答案1

解决方案是使用<重定向并使用shebang #!/bin/bash

AWKED=`cut -d$'\n' -f5 < /home/me/Documents/file.txt`

  • 大写变量保留供系统使用
  • 反引号(`)用于旧式命令替换,例如
foo=`命令`

建议改用该foo=$(command)语法。$() 中的反斜杠处理不太令人惊讶,并且 $() 更容易嵌套。请参阅http://mywiki.wooledge.org/BashFAQ/082

最后:

#!/bin/bash

awked=$(cut -d $'\n' -f5 < /home/me/Documents/file.txt)

答案2

原始脚本的第一行是#!/bin/sh,更改为#!/bin/bash解决了该问题。正如 Gilles Quenot 所说,$'\n'这是一种 bashism。因此,它不会被 dash 解释,而 sh 默认链接到 dash。

相关内容