【问题标题】:Absolute path to file as a variable in bash文件的绝对路径作为bash中的变量
【发布时间】:2019-03-27 01:51:48
【问题描述】:

我编写了一个程序,它应该搜索一长串随机数字以找到 pi 的最长十进制描述(但不超过 9)。代码是:

read -p 'Please specify one: ' fil1
dire=$( locate $fil1 )
if[ <grep -o '314159265' $dire | wc -w> -gt 0 ]
then
echo The longest decimal representation has 9 digits.
return [0]
fi
if[ <grep -o '31415926' $dire | wc -w> -gt 0 ]
then

等等

我的错误消息是wc: 0] No such file or directory ./pierex.sh: line 7: grep: No such file or directory,并且在这些命令出现的每一行中也是如此。我做错了什么?

【问题讨论】:

  • 将您的代码放在您的问题中,而不是您的代码的图片。
  • if 语句中的 [ 周围需要空格。你不应该在grep ... | wc -2 周围有&lt; 和&gt;,你应该有$( 和)。

标签: linux bash


【解决方案1】:

类似的行:

if [<grep -o '31415925' $dir3 | wc -c> -gt 0]

应该是:

if [ $(grep -o '31415925' $dir3 | wc -c) -gt 0 ]

替换命令输出的语法是$(command),而不是&lt;command&gt;。 [ 命令需要在命令名称和参数之间有一个空格,就像所有其他命令一样。

顺便说一句,您可以在不重复运行 grep 的情况下执行此操作。您可以使用:

match=$(grep -o -E '3(1(4(1(5(9(26?)?)?)?)?)?)?' "$dire")

这将返回最长的匹配,然后你可以得到$match的长度。这假设文件中只有一个匹配项;如果没有,您可以按长度对结果进行排序并获得最长的结果。见Sort a text file by line length including spaces

还要注意,所有这些正则表达式都将匹配另一个数字中间某处的 π 的数字,例如4231314。为了防止这种情况,您应该在开头匹配一个非数字:

grep -o -E '(^|[^0-9])31415925'

【讨论】:

  • 您可能会警告您的 oneliner 只能工作,因为小数没有 3。查找 31315 的相同方法将失败:echo 3131315 | grep -o -E '3(1(3(1(5?)?)?)?)?'
  • 非常感谢,帮了大忙!
  • @WalterA 原来的方法也有这个问题。解决方案是在开头匹配一个非数字。我已将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2014-03-15
  • 2013-03-23
  • 2013-12-10
  • 1970-01-01
相关资源
最近更新 更多