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。