ksh将命令的结果存储到变量中

时间:2013-01-28 18:12:31

标签: linux command ksh

我想将命令的结果存储到我的shell脚本中的变量中。我似乎无法让它工作。我想在目录中找到最近日期的文件。

PRODUCT= 'ls -t /some/dir/file* | head -1 | xargs -n1 basename'

它不会工作

5 个答案:

答案 0 :(得分:5)

您有两个选项,$或后缀`

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)的不必要的括号。

答案 1 :(得分:3)

您遇到的问题是命令需要用反向标记而不是单引号括起来。这被称为“命令替换”。

Bash允许您使用$()进行命令替换,但并非所有shell都提供此功能。我不知道它是否可用于KSH;如果是,它可能并非在所有版本中都可用。

如果你的ksh版本中有$()语法,你肯定应该使用它;它更容易阅读(后面的刻度很容易与单引号混淆);背蜱也难以筑巢。

这只解决了命令的一个问题,但是:ls返回目录和文件,所以如果在指定目录中修改的最新内容是子目录,那就是你要做的见。

如果你只想查看文件,我建议使用以下的某些版本(我正在使用支持默认变量的Bash,你可能不得不使用$1的语法<) / p>

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

对列表进行排序,取最后一行,并在第一个空格之前切掉所有内容。

答案 2 :(得分:1)

你想要$()preferred)或反叛(``)(旧式),而不是单引号:

PRODUCT=$(ls -t /some/dir/file* | head -1 | xargs -n1 basename)

PRODUCT=`ls -t /some/dir/file* | head -1 | xargs -n1 basename`

答案 3 :(得分:1)

您需要两个引号以确​​保即使名称包含空格也保留名称,并且如果您以后需要多个文件,并且“$(..)”在后台运行命令

我相信你也需要ls的'-1'选项,否则你每行可以有几个名字(你只保留1行,但它可能是几个文件)

PRODUCT="$(ls -1t /some/dir/file* | head -1 | xargs -n1 basename)"

请不要在“=”变量赋值周围添加空格(正如我在其他解决方案中看到的那样),因为它也不是很兼容。

答案 4 :(得分:0)

我会做类似的事情:

您的版本已更正:

PRODUCT=$(ls -t /some/dir/file* | head -1 | xargs -n1 basename)

或更简单:

PRODUCT=$(cd /some/dir && ls -1t file* | head -1)
  • 更改目录
  • 每行列出一个文件名,然后按时间/日期排序
  • 抢第一行