簡體   English   中英

ksh將命令結果存儲到變量

[英]ksh storing result of a command to a variable

我想將命令的結果存儲到我的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` 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)
  • 轉到目錄
  • 每行列出一個文件名並按時間/日期排序
  • 搶第一行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM