2017-10-17 86 views
0

我試圖檢查shell腳本中是否存在多個文件,但我不確定它是如何工作的。如何在shell中使用多個決策語句?

我已經試過

#!/bin/bash 
path=/home/test 
     cd $path 
     if [ -f "a.txt"] || [ -f "b.txt" ] || [ -f "c.txt" ] || [-f "d.txt"] 
     then 
       echo "one of the file exist" 
     else 
       echo "non of the file exist" 
     fi 

我越來越

line 4: [: missing ']' 

我看到人們使用雙括號,但只有當它是bash的不是POSIX

+1

放**; **放在if末尾,並在** [..] **之間留出空格** – Frank

+0

[-f「d.txt」];我改這個,但我仍然得到4號線:[:缺少「]」 – logger

+2

這也是錯誤的** [-f「A.TXT」] ** – Frank

回答

2

,如果你停止嘗試使用拼寫[這確實是比較明顯的。只要寫:

if test -f "a.txt" || test -f "b.txt" || test -f "c.txt" || test -f "d.txt"; then ... 

或者,(這是過時的用法,並且不應該被用來感謝@chepner指出這一點),你可以這樣做:

if test -f a.txt -o -f b.txt -o -f c.txt -o -f d.txt; then ... 

另外,如果你是願意相信你的shell的變幻莫測(也就是說,即使標準規定set -f將導致shell禁用路徑名擴展,我不會相信每個shell的行爲如預期),你可以這樣做:

set +f; if ! test [abcd].txt = '[abcd].txt' 2> /dev/null; then ... 
+0

如果我在文件參數中使用通配符作爲-f * .txt,它會好嗎?我想知道如果語法會是相同的引用外卡擔心我 – logger

+0

號。假設a.txt和c.txt都存在。在這種情況下,在正常情況下(例如,它取決於shell中的某些設置)'test -f * .txt'與編寫'test -f a.txt c.txt'相同,這會產生錯誤。如果不存在,'測試-f * .txt'將測試一個文件是否存在名爲'* .txt' –

+0

我,如果我去掉括號 – logger

1

您必須鍵入工作引號和右括號之間以及左括號和參數之間的空格。正確的語法是:

if [ -f "a.txt" ] || [ -f "b.txt" ] || [ -f "c.txt" ] || [ -f "d.txt" ] 

if [ -f "a.txt"] || [ -f "b.txt" ] || [ -f "c.txt" ] || [-f "d.txt"] 
1

的問題是,在[ -f "a.txt"]右方括號被視爲字符串,即[ -f "a.txt]"的一部分,所以你需要前加一個空格方括號關閉:[ -f "a.txt" ]

與開頭括號相同。該[-f "d.txt"]會被解析爲"[-f" "d.txt]",所以你必須開通後,截止括號這裏之前添加空間:[ -f "d.txt" ]