亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Bash檢查是否顯示文件不存在?

Bash檢查是否顯示文件不存在?

手掌心 2020-02-02 15:04:06
在bash中運行以下命令:   stuff=`rpm -ql <some package> | grep dasdasdfd`(軟件包中不存在的文件,退出代碼= 1,stdout為空)  if [ -f $stuff ]; then echo "whaaat"; fi上面的命令檢查文件是否存在...但是:file $stuff只需打印文件的使用信息...,然后stat $stuff缺少操作數...有人可以解釋為什么嗎?這是一個錯誤嗎?難道我做錯了什么?我只想確保包中的文件存在于fs上
查看完整描述

3 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

您可能需要$stuff用引號引起來


if [ -f "$stuff" ]; then

通常,您幾乎總是希望在使用路徑名的地方都加上引號。


我發現將殼腳本中的變量或變量視為“宏”會更有用,這些變量在首次使用時會擴展為它們的值。這與幾乎所有其他編程語言中的變量都不同。


因此,如果$stuff包含hello world(請注意空格),則將與您鍵入的內容相同:


[ -f hello world ]

這顯然是一個錯誤。


在這種情況下,您提到要處理的文件不存在,因此$stuff實際上是空的,就像鍵入:


[ -f ]

這實際上是有效的,但始終會成功。test從POSIX規范中可以看出,這有點晦澀難懂,test如果只有一個參數(在這種情況下,參數為-f),則總是成功:


1個參數:

如果$ 1不為null,則退出true(0);否則為0。否則,退出false。


這可能是為了便于編寫:


[ $variable_that_may_or_may_not_be_defined ]

如果添加引號,則傳遞兩個參數,然后發生更多理智的事情:


if [ -f "" ]; then


查看完整回答
反對 回復 2020-02-02
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

$stuff正如Carpetsmoker所說,一種選擇是加引號。


但是由于這被標記為bash,并且由于在文件名中包含空格是很痛苦的,所以您可以這樣做:


if [[ -f $stuff ]]

相對于[,它的別名是test,該[[結構“知道”如何$stuff正確處理內容。


查看完整回答
反對 回復 2020-02-02
  • 3 回答
  • 0 關注
  • 575 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號