【问题标题】:ksh storing result of a command to a variableksh 将命令的结果存储到变量中
【发布时间】:2013-01-12 04:00:27
【问题描述】:

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

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

它不会工作

【问题讨论】:

标签: linux command ksh


【解决方案1】:

您有两个选择,$ 或 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) 删除不必要的括号。

【讨论】:

  • 等号周围不能有空格:您的代码正在尝试使用 2 个参数运行命令 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

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

【讨论】:

  • ksh 支持$()。我认为现在 POSIX 需要它。这当然是首选形式,尤其是当您需要嵌套它们时。
  • 你可以使用cut -d" " -f 2-代替sed
  • 非常感谢。我还是 ksh 的新手。我工作的公司使用 ksh 在他们的服务器上进行一些自动化操作。我明天会试试这个,如果我成功了会告诉你。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    您需要两个引号以确​​保保留名称,即使它包含空格,并且如果您以后想要超过 1 个文件,以及 "$(..)" 在后台运行命令

    我相信您还需要 ls 的“-1”选项,否则每行可能有多个名称(您只保留 1 行,但可能是多个文件)

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

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

    【讨论】:

      【解决方案5】:

      我会这样做:

      您的版本已更正:

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

      或者更简单:

      PRODUCT=$(cd /some/dir && ls -1t file* | head -1)
      
      • 切换到目录
      • 每行列出一个文件名并按时间/日期排序
      • 抓住第一行

      【讨论】:

        猜你喜欢
        • 2016-02-05
        • 1970-01-01
        • 2020-08-14
        • 2018-06-27
        • 2022-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        相关资源
        最近更新 更多