我想将命令的结果存储到我的 shell 脚本中的变量中。我似乎无法让它工作。我想要目录中最近日期的文件。
PRODUCT= 'ls -t /some/dir/file* | head -1 | xargs -n1 basename'
它行不通
你有两个选择,$
或者 backsticks `
。
1)x=$(ls -t /some/dir/file* | head -1 | xargs -n1 basename)
或者
2)x=`ls -t /some/dir/file* | head -1 | xargs -n1 basename`
echo $x
编辑:删除(2)不必要的括号。
您遇到的问题是命令需要用反引号而不是单引号括起来。这称为“命令替换”。
Bash 允许您使用$()
命令替换,但这并非在所有 shell 中都可用。我不知道它是否在 KSH 中可用;如果是,它可能并非在所有版本中都可用。
如果$()
语法在您的 ksh 版本中可用,则绝对应该使用它;它更容易阅读(反引号太容易与单引号混淆);倒钩也很难筑巢。
但是,这仅解决了您的命令的一个问题:ls
返回目录和文件,因此如果在指定目录中修改的最新内容是子目录,那么您将看到它。
如果您只想查看文件,我建议使用以下某些版本(我使用的是支持默认变量的 Bash,您可能不得不使用 的语法$1
)
lastfile ()
{
find ${1:-.} -maxdepth 1 -type f -printf "%T+ %p\n" | sort -n | tail -1 | sed 's/[^[:space:]]\+ //'
}
这在目录上运行 find ,并且只从该目录中提取文件。它像这样格式化所有文件:
2012-08-29+16:21:40.0000000000 ./.sqlite_history
2013-01-14+08:52:14.0000000000 ./.davmail.properties
2012-04-04+16:16:40.0000000000 ./.DS_Store
2010-04-21+15:49:00.0000000000 ./.joe_state
2008-09-05+17:15:28.0000000000 ./.hplip.conf
2012-01-31+13:12:28.0000000000 ./.oneclick
对列表进行排序,取最后一行,并删除第一个空格之前的所有内容。
你想要$()
(首选)或反引号(``)(旧样式),而不是单引号:
PRODUCT=$(ls -t /some/dir/file* | head -1 | xargs -n1 basename)
或者
PRODUCT=`ls -t /some/dir/file* | head -1 | xargs -n1 basename`
您需要两个引号以确保保留名称,即使它包含空格,并且如果您以后想要多个文件,并且 "$(..)" 在后台运行命令
我相信您还需要 ls 的“-1”选项,否则每行可能有多个名称(您只保留 1 行,但可能是多个文件)
PRODUCT="$(ls -1t /some/dir/file* | head -1 | xargs -n1 basename)"
请不要在“=”变量分配周围放置空格(正如我在此处的其他解决方案中看到的那样),因为它也不是很兼容。
我会做类似的事情:
您的版本已更正:
PRODUCT=$(ls -t /some/dir/file* | head -1 | xargs -n1 basename)
或更简单:
PRODUCT=$(cd /some/dir && ls -1t file* | head -1)