执行使用 shell 变量的“sed”命令时出错

执行使用 shell 变量的“sed”命令时出错

这已经让我发疯了......

我想列出目录中的文件,并根据除最新文件之外的所有文件的编号进行交互,这是代码片段


FILECOUNT=$(ls -lt [dir]*.log | grep -c .log )
for (( c=2; c<=$FILECOUNT; c++ ))
do
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")

我一直在$c解释方面遇到问题,上面的格式可以工作,但 sed 命令失败...尽管在 cli 中输入日志的最后一行就像一个魅力


 FILECOUNT=24

 (( c=2 ))

 (( c<=24 ))

C is : 2

 'ls -1t [dir]*.log | sed -n '\''2 p'\'''

 line 41: ls -1t [dir]*.log | sed -n '2 p': No such file or directory

任何帮助将不胜感激!

显然[dir]是一个有效的目录

答案1

您遇到的主要问题是您将命令替换中的所有内容都放在双引号中:

FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")

这将指示 shell 查找可执行文件逐字名称 ls -1t [dir]*.log | sed -n '$c p'"ls并且不带参数,这与使用选项-1t和操作数执行命令相反,[dir]*.log该命令的输出将sed通过选项-n和参数通过管道传输到可执行文件'$c p'。尝试删除双引号,如

FILEDIR=$(ls -1t [dir]*.log | sed -n '$c p')

然而那么您将面临单引号命令中禁用变量扩展的问题sed。一推荐方式是打破单引号参数并将变量放在双引号感叹词中,如

FILEDIR=$(ls -1t [dir]*.log | sed -n "$c"' p')

另外,我必须发出强制警告不解析输出ls。 ;)

相关内容