这已经让我发疯了......
我想列出目录中的文件,并根据除最新文件之外的所有文件的编号进行交互,这是代码片段
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
。 ;)