如何在bash脚本中使用带有变量的“head”命令?

4

我一直在尝试创建一个脚本,可以根据我创建的某些变量从文件中读取特定的行。

SCRIPTNUM=$(tail -1 leet.txt)
LINE=$(echo $SCRIPTNUM | python leetSolver.py)
PART1=$(head "-$LINE" leet.txt)
FLAG=$(printf "$PART1" | tail -1)
FLAGFORMAT="$FLAG\n"
printf $FLAGFORMAT

从这里开始,我面临的最大问题是遇到了以下错误:

head: invalid trailing option -- 
Try `head --help' for more information.

当逐行通过终端输入代码时,代码可以正常工作。有没有办法让这个代码工作呢?值得注意的是,使用一个常量(例如head -5)可以起到作用。


3
当使用 $LINE 时,它的值是什么? - Etan Reisner
$LINE 应该是 leet.txt 文件中我想获取的行数。 - user3892426
是的,它应该是。问题在于它实际上包含了什么。根据我在答案中列出的测试,它似乎至少包含一个尾随空格。 - Etan Reisner
2个回答

1
这里的快速测试表明问题在于您的$LINE变量具有尾随空格(即'5 '而不是'5')。尝试删除它们。
$ head '-5g' file
head: invalid trailing option -- g
Try `head --help' for more information.

$ head '-5.' file
head: invalid trailing option -- .
Try `head --help' for more information.

$ head '-5 ' file
head: invalid trailing option --
Try `head --help' for more information.

我尝试了一些命令来删除空格,但它们似乎在脚本中没有起作用。需要注意的是,我尝试将echo替换为printf,但这似乎也没有起作用。 LINE = $(echo $SCRIPTNUM | python leetSolver.py | tr -d'\ r \ n')printf“$LINE” - user3892426
回显不是问题,Python脚本的输出才是。你尝试了哪些命令?我认为@MarkSetchell的回答中的任何一个都应该适用于此。如果在赋值后添加echo "$LINE" | xxd,你会得到什么输出? - Etan Reisner
你具体尝试了什么来得到那个结果?我是字面意思,指的是在 LINE=... 行之后将那一行插入到你的脚本中。如果你已经这样做了,那么你的脚本使用的是 DOS 的行结尾符,这可能是问题的一部分。 - Etan Reisner
我刚刚直接添加到了赋值语句下面。 LINE=$(echo $SCRIPTNUM | python leetSolver.py | tr -cd '[:digit:]' ) echo "$LINE" | xxd - user3892426
尝试通过dos2unix或类似工具运行您的脚本,将其转换为Unix行结尾,并再次尝试。 - Etan Reisner
那个修复了头部问题!还有一些其他的格式问题,但我可以解决。谢谢! - user3892426

0

更改此行

LINE=$(echo $SCRIPTNUM | python leetSolver.py)

LINE=$(echo $SCRIPTNUM | python leetSolver.py | tr -d '\r\n ')

这将删除任何尾随的换行符、回车符或空格。
或者,如果你喜欢可以使用`sed`。
LINE=$(echo $SCRIPTNUM | python leetSolver.py | sed 's/[^0-9]//g' )

或者,如果你喜欢 tr

LINE=$(echo $SCRIPTNUM | python leetSolver.py | tr -cd '[:digit:]' )

将删除所有非数字字符。


如果您知道结果始终是一个数字,那么可以不引用$LINE的用法。尽管这在一般情况下显然不太安全。 - Etan Reisner
printf '%s' "$var" is suggested over echo "$var" - Kangur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接