Làm thế nào để tôi biết nếu một tệp thông thường không tồn tại trong Bash?


3263

Tôi đã sử dụng đoạn mã sau để xem có tồn tại tệp không:

#!/bin/bash

FILE=$1     
if [ -f $FILE ]; then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

Cú pháp chính xác để sử dụng là gì nếu tôi chỉ muốn kiểm tra nếu tệp không tồn tại?

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
fi

187

9
Là một người rất lười biếng, tôi thường sử dụng cấu trúc giải pháp ngớ ngẩn sau đây: if [ -f $FILE ]; then; else; echo "File $FILE does not exist."; fi;Có lẽ tốt là tôi đã tìm thấy câu hỏi này thay vào đó và học cách làm nó theo cách đúng đắn hơn. :)
Alderath

5
Để dễ hiểu, bạn nên nói "tệp thông thường", vì hầu hết các tài liệu UNIX / POSIX đều đề cập chung đến tất cả các loại mục nhập hệ thống tệp một "tệp" đơn giản, ví dụ: liên kết tượng trưng là một loại tệp, như là một ống có tên , tệp thông thường, thư mục, khối đặc biệt, ký tự đặc biệt, ổ cắm, v.v.
kevinarpe

11
@kevinarpe nếu bạn muốn kiểm tra xem có thứ gì tồn tại không, hãy sử dụng -e. -f sẽ không nhận thư mục, liên kết tượng trưng, ​​v.v.
Benubird

14
Để an toàn, luôn sử dụng dấu ngoặc kép để xử lý chính xác tên tệp có khoảng trắng, ví dụ: FILE=$1-> FILE="$1"if [ -f $FILE ];->if [ -f "$FILE" ];
kevinarpe

Câu trả lời:


4524

Lệnh kiểm tra ( [ở đây) có toán tử logic "không" là dấu chấm than (tương tự như nhiều ngôn ngữ khác). Thử cái này:

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi

208
Ngắn gọn hơn: [! -f /tmp/foo.txt] && echo "Không tìm thấy tệp!"
DavidWinterbottom

38
Tôi đã vật lộn một chút để tìm đúng cú pháp cho "nếu có bất kỳ 2 tệp nào không tồn tại". Cả hai công việc sau:if [ ! \( -f "f1" -a -f "f2" \) ] ; then echo MISSING; fi if [ ! -f "f1" ] || [ ! -f "f2" ] ; then echo MISSING; fi
mivk

153
@DavidWinterbottom Thậm chí còn mọng nước hơn:[ -f /tmp/foo.txt ] || echo "File not found!"
David W.

27
Tham số có thể là bất kỳ một trong những điều sau đây:-e: Returns true value, if file exists -f: Return true value, if file exists and regular file -r: Return true value, if file exists and is readable -w: Return true value, if file exists and is writable -x: Return true value, if file exists and is executable -d: Return true value, if exists and is a directory
SD.

5
Có một sự bất cân xứng trong việc sử dụng ! -fvới &&so với sử dụng -fvới ||. Điều này phải làm với mã thoát được trả về bởi kiểm tra không tồn tại. Nếu bạn cần dòng của mình luôn thoát sạch với mã thoát 0 (và đôi khi bạn không muốn ràng buộc này), hai cách tiếp cận không thể thay thế cho nhau. Ngoài ra, chỉ cần sử dụng một iftuyên bố và bạn không còn phải lo lắng về mã thoát của kiểm tra không tồn tại của bạn.
Acumenus

670

Kiểm tra tệp Bash

-b filename- Chặn tệp đặc biệt
-c filename- Tệp ký tự đặc biệt
-d directoryname- Kiểm tra thư mục Tồn tại
-e filename- Kiểm tra sự tồn tại của tệp, bất kể loại (nút, thư mục, ổ cắm, v.v.)
-f filename- Kiểm tra sự tồn tại của tệp thông thường không phải là thư mục
-G filename- Kiểm tra xem tệp có tồn tại và được sở hữu bởi ID nhóm hiệu quả
-G filename set-group-id- Đúng nếu tệp tồn tại và được đặt theo nhóm-id
-k filename- Bit dính
-L filename- Liên kết tượng trưng
-O filename- Đúng nếu tệp tồn tại và được sở hữu bởi id người dùng hiệu quả
-r filename- Kiểm tra xem tệp có thể đọc được không
-S filename- Kiểm tra xem tệp có phải là ổ cắm không
-s filename- Kiểm tra xem tệp có kích thước khác không
-u filename- Kiểm tra xem bit set-user-id có được đặt không
-w filename- Kiểm tra xem tệp có thể ghi được không
-x filename- Kiểm tra xem tệp có thực thi được không

Cách sử dụng:

#!/bin/bash
file=./file
if [ -e "$file" ]; then
    echo "File exists"
else 
    echo "File does not exist"
fi 

Một biểu thức kiểm tra có thể được phủ định bằng cách sử dụng !toán tử

#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
    echo "File does not exist"
else 
    echo "File exists"
fi 

1
@ 0x90 Nếu bạn muốn, bạn thoải mái chỉnh sửa bài viết của tôi và thêm nó vào danh sách. Tôi đoán bạn có nghĩa là: -n String- Kiểm tra xem độ dài của chuỗi không bằng không. Hoặc bạn có nghĩa là file1 -nt file2- Kiểm tra xem tập tin1 có mới hơn tập tin 2 không (bạn cũng có thể sử dụng -ot cho cũ hơn)
BlueCacti

1
Giới thiệu về -n: The unary operator -z tests for a null string, while -n or no operator at all returns True if a string is not empty.~ ibm.com/developerworks/l
Library / l

1
tại sao một số không thêm chức năng như hàm tồn tại () {if [-e "$ 1"]; sau đó echo "$ 1 tồn tại" khác echo "$ 1 không tồn tại" fi}
Mz A

291

Bạn có thể phủ định một biểu thức bằng "!":

#!/bin/bash
FILE=$1

if [ ! -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

Trang man có liên quan là man testhoặc, tương đương, man [- hoặc help testhoặc help [cho lệnh bash tích hợp.


4
Trong bash , [là một nội dung. Vì vậy, thông tin liên quan được lấy bằng help [... nhưng điều này cho thấy đó [là từ đồng nghĩa với testnội dung, do đó thông tin liên quan được lấy bằng help test. Xem thêm phần Biểu thức điều kiện Bash trong hướng dẫn .
gniourf_gniourf

@gniourf_gniourf: Có, nhưng lệnh tích hợp bash [hoạt động rất giống với [lệnh bên ngoài , do đó, man testhoặc man [sẽ cho bạn ý tưởng tốt về cách thức hoạt động của nó.
Keith Thompson

8
@KeithThndry ngoại trừ việc bash dựng sẵn [có nhiều công tắc hơn lệnh bên ngoài [được tìm thấy trên hệ thống của tôi ... Nói chung tôi tin rằng tốt hơn là đọc tài liệu cụ thể cho một công cụ nhất định và không phải là tài liệu cụ thể cho một công cụ khác có liên quan mơ hồ. Tuy nhiên, tôi có thể sai;)
gniourf_gniourf

134
[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

Ngoài ra, có thể tệp là một liên kết tượng trưng bị hỏng hoặc tệp không thông thường, ví dụ như ổ cắm, thiết bị hoặc fifo. Ví dụ: để thêm một kiểm tra cho các liên kết tượng trưng bị hỏng:

if [[ ! -f $FILE ]]; then
    if [[ -L $FILE ]]; then
        printf '%s is a broken symlink!\n' "$FILE"
    else
        printf '%s does not exist!\n' "$FILE"
    fi
fi

9
Tôi có thể hỏi tại sao hai "[" trong bài kiểm tra không? (ví dụ: [[! -a $ FILE]]). Tôi đã thử tất cả các tùy chọn được đề cập trên hộp solaris và chỉ có một tùy chọn hoạt động, rất biết ơn, nhưng tại sao?
Dimitrios Mistriotis

30
Dấu ngoặc kép là một phần mở rộng "hiện đại"; ví dụ như họ sẽ không làm tách từ (chẳng hạn như cho tên tập tin với không gian) và vẫn còn làm việc cho chuỗi rỗng: mywiki.wooledge.org/BashFAQ/031
bw1024

7
theo tldp.org/LDP/abs/html/fto.html -a giống hệt với -e. Nó đã bị "không dùng nữa" và việc sử dụng nó không được khuyến khích. Dù sao +1 cũng được đề cập để kiểm tra symlink bị hỏng quá
Luca Borrione

4
@dimitrismistriotis hai "[" là một tiện ích mở rộng không di động được triển khai (khác nhau) bởi zsh & bash; nói chung bạn nên tránh nó nếu có thể.
Người tốt

7
Tôi đã bình chọn BECAUSE này được sử dụng [[. Nó là một phần mở rộng được sử dụng rộng rãi. Nếu bạn biết bạn đang sử dụng bash thì không có lý do gì để không sử dụng nó. Nó ít bị lỗi hơn nhiều so với [.
Michael Potter

101

Điều đáng nói là nếu bạn cần thực thi một lệnh duy nhất, bạn có thể viết tắt

if [ ! -f "$file" ]; then
    echo "$file"
fi

đến

test -f "$file" || echo "$file"

hoặc là

[ -f "$file" ] || echo "$file"

Cảm ơn! Cần một giải pháp thay thế không sử dụng [[]]
Jonathan

69

Tôi thích làm một lớp lót sau, ở định dạng tương thích vỏ POSIX :

$ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND"

$ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"

Đối với một vài lệnh, như tôi sẽ làm trong một kịch bản:

$  [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}

Khi tôi bắt đầu làm điều này, tôi hiếm khi sử dụng cú pháp gõ đầy đủ nữa !!


1
Trước hết, các tham chiếu biến không được trích dẫn là dễ bị lỗi. Điều đó nói rằng, nó nói ở đâu trong bất kỳ trang bash nào rằng [hoặc tích testhợp sẵn sẽ kiểm tra sự tồn tại tệp của đối số theo mặc định (trái ngược với -e)? Điều đó sẽ không mơ hồ? AFAIK (và AIUI phần "GIẢI THÍCH ĐIỀU KIỆN") điều duy nhất được thử nghiệm với cách tiếp cận của bạn là đối số không trống (hoặc không xác định), trong trường hợp này là một tautology (hãy $DIR = ''$FILE = '', sau đó đối số vẫn là '//').
PointedEars

1
Chứng minh : ls /foo, kết quả ls: cannot access /foo: No such file or directory. [ /foo ] && echo 42, kết quả 42. GNU bash, phiên bản 4.2.37 (1) -release (i486-pc-linux-gnu).
PointedEars

@PointedEars: Tôi không thể chỉ định -ftùy chọn, tại thời điểm tôi viết câu trả lời này. Rõ ràng là bạn luôn có thể sử dụng -e, nếu bạn không chắc chắn đó sẽ là một tệp thông thường. Ngoài ra, trong tất cả các tập lệnh của tôi, tôi trích dẫn các cấu trúc này, tôi phải gửi nó mà không cần chứng minh đầy đủ.
JM Becker

ACK. Nhưng bạn có thể biết rằng một lớp lót không thể giải quyết vấn đề if-other: [ $condition ] && if_true || if_falsedễ bị lỗi. Trong mọi trường hợp, tôi thấy [ ! -f "$file" ] && if_not_existsdễ đọc và dễ hiểu hơn [ -f "$file" ] || if_not_exists.
PointedEars

55

Để kiểm tra sự tồn tại của tệp, tham số có thể là một trong các cách sau:

-e: Returns true if file exists (regular file, directory, or symlink)
-f: Returns true if file exists and is a regular file
-d: Returns true if file exists and is a directory
-h: Returns true if file exists and is a symlink

Tất cả các bài kiểm tra dưới đây áp dụng cho các tệp, thư mục và liên kết tượng trưng thông thường:

-r: Returns true if file exists and is readable
-w: Returns true if file exists and is writable
-x: Returns true if file exists and is executable
-s: Returns true if file exists and has a size > 0

Kịch bản ví dụ:

#!/bin/bash
FILE=$1

if [ -f "$FILE" ]; then
   echo "File $FILE exists"
else
   echo "File $FILE does not exist"
fi

39

Bạn có thể làm được việc này:

[[ ! -f "$FILE" ]] && echo "File doesn't exist"

hoặc là

if [[ ! -f "$FILE" ]]; then
    echo "File doesn't exist"
fi

Nếu bạn muốn kiểm tra cả tập tin và thư mục, thì hãy sử dụng -etùy chọn thay vì -f. -etrả về true cho các tệp thông thường, thư mục, ổ cắm, tệp đặc biệt của nhân vật, chặn các tệp đặc biệt, v.v.


1
Đó không phải là bash cụ thể. Cú pháp xuất phát từ trình bao Korn và cũng có sẵn trong zsh và bash. Nó có lợi thế hạn chế so với các [tiện ích tiêu chuẩn ở đây mặc dù.
Stephane Chazelas

các tệp thông thường (như được kiểm tra bởi -f) và các thư mục chỉ là hai trong số nhiều loại tệp khác nhau . Ngoài ra còn có ổ cắm, liên kết tượng trưng, ​​thiết bị, fifos, cửa ... [ -esẽ kiểm tra sự tồn tại của tệp (thuộc bất kỳ loại nào bao gồm thông thường, fifo, thư mục ...) sau khi phân giải symlink .
Stephane Chazelas

@StephaneChazelas: Tôi không thấy bất kỳ thẻ ksh hoặc zsh nào ở bất cứ đâu. Chúng ta đang nói về bash hoặc một cái gì đó được tiêu chuẩn hóa trên hầu hết các hệ thống unix. Vì vậy, trong bối cảnh, đó là bash cụ thể. OP không cần biết mọi thứ vỏ ngoài đó: D
Jahid

Đó là một nhận xét về phần "Bash cụ thể" trong câu trả lời của bạn.
Stephane Chazelas

@StephaneChazelas: Có, và trong bối cảnh (bash và sh tiêu chuẩn), đó là bash cụ thể. Tôi không thấy điểm trong bình luận thứ hai của bạn, nó hoàn toàn nằm ngoài ngữ cảnh. OP không cần -e, anh ấy cần -f.
Jahid

35

Bạn nên cẩn thận về việc chạy testcho một biến không được trích dẫn, bởi vì nó có thể tạo ra kết quả không mong muốn:

$ [ -f ]
$ echo $?
0
$ [ -f "" ]
$ echo $?
1

Khuyến nghị thường là có biến được kiểm tra được bao quanh bởi dấu ngoặc kép:

#!/bin/sh
FILE=$1

if [ ! -f "$FILE" ]
then
   echo "File $FILE does not exist."
fi

8
Khuyến cáo là có mọi biến được bao quanh bởi dấu ngoặc kép, trừ khi bạn biết chính xác rằng bạn có một trong những trường hợp hiếm gặp khi không cần thiết hoặc một trong những trường hợp hiếm hơn thậm chí còn gây hại. (Và không, đây không phải là một trong số họ.)
Uwe

Bạn có quan tâm để giải thích tại sao đây không phải là trường hợp sử dụng dấu ngoặc kép? Nếu không, tôi không thấy sự hữu ích trong bình luận.
artdanil

4
Ý tôi là: Đây không phải là một trong những trường hợp hiếm hoi mà nó không cần thiết hoặc có hại. Một lập trình viên shell nên được sử dụng để bao quanh (gần như) mọi biến trong dấu ngoặc kép; quy tắc này không giới hạn [ ... ].
Uwe


24

Có ba cách riêng biệt để làm điều này:

  1. Phủ định trạng thái thoát bằng bash (không có câu trả lời nào khác nói điều này):

    if ! [ -e "$file" ]; then
        echo "file does not exist"
    fi

    Hoặc là:

    ! [ -e "$file" ] && echo "file does not exist"
  2. Phủ định kiểm tra bên trong lệnh kiểm tra [(đó là cách mà hầu hết các câu trả lời trước đây đã trình bày):

    if [ ! -e "$file" ]; then
        echo "file does not exist"
    fi

    Hoặc là:

    [ ! -e "$file" ] && echo "file does not exist"
  3. Hành động đối với kết quả xét nghiệm là âm tính ( ||thay vì &&):

    Chỉ có:

    [ -e "$file" ] || echo "file does not exist"

    Điều này có vẻ ngớ ngẩn (IMO), không sử dụng nó trừ khi mã của bạn phải được chuyển sang vỏ Bourne (như /bin/shSolaris 10 trở về trước) mà thiếu toán tử phủ định đường ống ( !):

    if [ -e "$file" ]; then
        :
    else
        echo "file does not exist"
    fi

Bất kỳ sự khác biệt tính di động giữa ! [[ !?
Ngọn lửa băng giá

3
Các ! [ là POSIX cho đường ống vỏ 2.9.2 (bất kỳ lệnh) Otherwise, the exit status shall be the logical NOT of the exit status of the last command[ ! là POSIX cho thử nghiệm ! expression True if expression is false. False if expression is true. Vì vậy, cả hai đều là POSIX, và trong kinh nghiệm của tôi, cả hai đều được hỗ trợ rộng rãi.

1
@F FrozenFlame, shell Bourne không có !từ khóa được giới thiệu bởi shell Korn. Ngoại trừ có thể cho Solaris 10 trở lên, bạn không thể bắt gặp một chiếc vỏ Bourne ngày nay.
Stephane Chazelas

22

Trong

[ -f "$file" ]

các [lệnh làm một stat()(không lstat()) gọi hệ thống trên con đường lưu trữ trong $filevà trả về đúng nếu đó là cuộc gọi hệ thống thành công và loại nội dung tập tin được trả về bởi stat()là " bình thường ".

Vì vậy, nếu [ -f "$file" ]trả về true, bạn có thể cho biết tệp tồn tại và là tệp thông thường hoặc liên kết tượng trưng cuối cùng sẽ phân giải thành tệp thông thường (hoặc ít nhất là tại thời điểm đó stat()).

Tuy nhiên, nếu nó trả về false (hoặc nếu [ ! -f "$file" ]hoặc ! [ -f "$file" ]trả về true), có nhiều khả năng khác nhau:

  • tập tin không tồn tại
  • tệp tồn tại nhưng không phải là tệp thông thường (có thể là thiết bị, fifo, thư mục, ổ cắm ...)
  • tập tin tồn tại nhưng bạn không có quyền tìm kiếm vào thư mục mẹ
  • tệp tồn tại nhưng đường dẫn để truy cập nó quá dài
  • tệp là một liên kết tượng trưng đến một tệp thông thường, nhưng bạn không có quyền tìm kiếm đối với một số thư mục liên quan đến độ phân giải của liên kết tượng trưng.
  • ... Bất kỳ lý do nào khác khiến stat()cuộc gọi hệ thống có thể thất bại.

Nói tóm lại, nó nên là:

if [ -f "$file" ]; then
  printf '"%s" is a path to a regular file or symlink to regular file\n' "$file"
elif [ -e "$file" ]; then
  printf '"%s" exists but is not a regular file\n' "$file"
elif [ -L "$file" ]; then
  printf '"%s" exists, is a symlink but I cannot tell if it eventually resolves to an actual file, regular or not\n' "$file"
else
  printf 'I cannot tell if "%s" exists, let alone whether it is a regular file or not\n' "$file"
fi

Để biết chắc chắn rằng tệp không tồn tại, chúng tôi cần stat()gọi lại hệ thống với mã lỗi ENOENT( ENOTDIRcho chúng tôi biết một trong các thành phần đường dẫn không phải là thư mục là một trường hợp khác mà chúng tôi có thể nói với tệp không tồn tại theo con đường đó). Thật không may, [lệnh không cho chúng tôi biết điều đó. Nó sẽ trả về false cho dù mã lỗi là ENOENT, EACCESS (quyền bị từ chối), ENAMETOOLONG hoặc bất cứ điều gì khác.

Các [ -e "$file" ]thử nghiệm cũng có thể được thực hiện với ls -Ld -- "$file" > /dev/null. Trong trường hợp đó, lssẽ cho bạn biết lý do stat()thất bại, mặc dù thông tin không thể dễ dàng được sử dụng theo chương trình:

$ file=/var/spool/cron/crontabs/root
$ if [ ! -e "$file" ]; then echo does not exist; fi
does not exist
$ if ! ls -Ld -- "$file" > /dev/null; then echo stat failed; fi
ls: cannot access '/var/spool/cron/crontabs/root': Permission denied
stat failed

Ít nhất lscho tôi biết không phải vì tập tin không tồn tại mà nó bị lỗi. Đó là bởi vì nó không thể biết liệu tập tin có tồn tại hay không. Các [lệnh chỉ phớt lờ vấn đề.

Với zshshell, bạn có thể truy vấn mã lỗi với $ERRNObiến đặc biệt sau [lệnh fail và giải mã số đó bằng $errnosmảng đặc biệt trong zsh/systemmô-đun:

zmodload zsh/system
ERRNO=0
if [ ! -f "$file" ]; then
  err=$ERRNO
  case $errnos[err] in
    ("") echo exists, not a regular file;;
    (ENOENT|ENOTDIR)
       if [ -L "$file" ]; then
         echo broken link
       else
         echo does not exist
       fi;;
    (*) syserror -p "can't tell: " "$err"
  esac
fi

(hãy cẩn thận với sự $errnoshỗ trợ đã bị hỏng với một số phiên bản zshkhi được xây dựng với các phiên bản gần đâygcc ).


11

Để đảo ngược bài kiểm tra, sử dụng "!". Điều đó tương đương với toán tử logic "không" trong các ngôn ngữ khác. Thử cái này:

if [ ! -f /tmp/foo.txt ];
then
    echo "File not found!"
fi

Hoặc được viết theo một cách hơi khác:

if [ ! -f /tmp/foo.txt ]
    then echo "File not found!"
fi

Hoặc bạn có thể sử dụng:

if ! [ -f /tmp/foo.txt ]
    then echo "File not found!"
fi

Hoặc, trình bày tất cả cùng nhau:

if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi

Cái nào có thể được viết (sử dụng toán tử then "và": &&) là:

[ ! -f /tmp/foo.txt ] && echo "File not found!"

Mà trông ngắn hơn như thế này:

[ -f /tmp/foo.txt ] || echo "File not found!"


10

Mã này cũng hoạt động.

#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
 echo "File '$FILE' Exists"
else
 echo "The File '$FILE' Does Not Exist"
fi

7

Cách đơn giản nhất

FILE=$1
[ ! -e "${FILE}" ] && echo "does not exist" || echo "exists"

6

Kịch bản shell này cũng hoạt động để tìm tệp trong thư mục:

echo "enter file"

read -r a

if [ -s /home/trainee02/"$a" ]
then
    echo "yes. file is there."
else
    echo "sorry. file is not there."
fi

3
Không rõ ràng rằng điều này thêm bất cứ điều gì mà các câu trả lời khác chưa được đưa ra. Nó khó mã hóa một tên đường dẫn. Vì câu hỏi được gắn thẻ bash , nó có thể sử dụng read -p "Enter file name: " -r ađể nhắc cũng như đọc. Nó không sử dụng dấu ngoặc kép quanh biến; đó là tốt, nhưng nên được giải thích. Nó có thể tốt hơn nếu nó lặp lại tên tập tin. Và điều này kiểm tra xem tệp có tồn tại và không trống (đó là ý nghĩa của -s) trong khi câu hỏi hỏi về bất kỳ tệp nào, trống hay không (cho -fphù hợp hơn).
Jonathan Leffler

4

đôi khi nó có thể hữu ích để sử dụng && và || khai thác.

Giống như trong (nếu bạn có lệnh "test"):

test -b $FILE && echo File not there!

hoặc là

test -b $FILE || echo File there!

2

Nếu bạn muốn sử dụng testthay vì [], thì bạn có thể sử dụng !để có được phủ định:

if ! test "$FILE"; then
  echo "does not exist"
fi

0

Bạn cũng có thể nhóm nhiều lệnh trong một lớp lót

[ -f "filename" ] || ( echo test1 && echo test2 && echo test3 )

hoặc là

[ -f "filename" ] || { echo test1 && echo test2 && echo test3 ;}

Nếu tên tệp không thoát, đầu ra sẽ là

test1
test2
test3

Lưu ý: (...) chạy trong một lớp con, {...;} chạy trong cùng một vỏ. Ký hiệu dấu ngoặc nhọn chỉ hoạt động trong bash.


1
Không, ký hiệu dấu ngoặc nhọn không chỉ bash; nó hoạt động trong mọi shell tuân thủ POSIX.
Charles Duffy

0
envfile=.env

if [ ! -f "$envfile" ]
then
    echo "$envfile does not exist"
    exit 1
fi

Vui lòng cung cấp một lời giải thích cùng với mã.
Zohar

Mặc dù mã này có thể giải quyết vấn đề của OP, tốt nhất là bao gồm một lời giải thích về cách mã của bạn giải quyết vấn đề của OP. Theo cách này, khách truy cập trong tương lai có thể học hỏi từ bài đăng của bạn và áp dụng nó vào mã của riêng họ. SO không phải là một dịch vụ mã hóa, mà là một nguồn tài nguyên cho kiến ​​thức. Ngoài ra, chất lượng cao, câu trả lời đầy đủ có nhiều khả năng được nâng cao. Các tính năng này, cùng với yêu cầu tất cả các bài đăng đều khép kín, là một số điểm mạnh của SO như một nền tảng, phân biệt nó với các diễn đàn. Bạn có thể chỉnh sửa để thêm thông tin bổ sung & / hoặc để bổ sung giải thích của bạn với tài liệu nguồn.
ysf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.