නිත්‍ය ගොනුවක් Bash හි නොමැති නම් මා කියන්නේ කෙසේද?


3272

ගොනුවක් තිබේදැයි බැලීමට මම පහත ස්ක්‍රිප්ට් භාවිතා කර ඇත:

#!/bin/bash

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

මම පමණක් ගොනු කරන්නේ නම්, පරීක්ෂා කිරීමට අවශ්ය නම්, භාවිතා කිරීම නිවැරදි කාරක රීති මොකක්ද නොවේ පවතී?

#!/bin/bash

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


9
මම ඉතා කම්මැලි පුද්ගලයා බැවින්, මම සාමාන්‍යයෙන් පහත සඳහන් මෝඩ වැඩ කිරීමේ ඉදිකිරීම් භාවිතා කරමි: if [ -f $FILE ]; then; else; echo "File $FILE does not exist."; fi;ඒ වෙනුවට මම මෙම ප්‍රශ්නය සොයාගෙන එය වඩාත් නිසි ආකාරයෙන් කිරීමට ඉගෙන ගත්තා. :)
ඇල්ඩරත්

5
බොහෝ යුනික්ස් / පොසික්ස් ලියකියවිලි සෑම වර්ගයකම ගොනු පද්ධති ඇතුළත් කිරීම් වලට සරලව “ලිපිගොනු” ඇතුළත් කරන බැවින්, “සාමාන්‍ය ගොනුවක්” යැයි ඔබ පැවසිය යුතුය. උදා: සංකේතාත්මක සබැඳියක් යනු ගොනුවක වර්ගයකි , සාමාන්‍ය ගොනුව, නාමාවලිය, වාරණ විශේෂ, අක්ෂර විශේෂ, සොකට් යනාදිය
kevinarpe

11
inkevinarpe ඔබට යමක් තිබේදැයි පරීක්ෂා කිරීමට අවශ්‍ය නම් භාවිතා කරන්න -e. -f ඩිරෙක්ටරි,
සිම්ලින්ක්

14
ආරක්ෂිත වීමට, FILE=$1FILE="$1"if [ -f $FILE ];if [ -f "$FILE" ];
සුදු අවකාශය

Answers:


4534

මෙම පරීක්ෂණය විධාන ( [මෙහි) එම විශ්මයාර්ථ ස්ථානය (වෙනත් බොහෝ භාෂා සමාන) වන තාර්කික ක්රියාකරු "නැත" වේ. මේක උත්සාහ කරන්න:

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

208
වඩාත් සංක්ෂිප්තව: [! -f /tmp/foo.txt] && echo "ගොනුව හමු නොවීය!"
ඩේවිඩ් වින්ටර්බෝටම්

38
"ලිපිගොනු 2 න් කිසිවක් නොපවතී නම්" සඳහා නිවැරදි වාක්‍ය ඛණ්ඩය සොයා ගැනීමට මම ටිකක් වෙහෙසුණා. පහත සඳහන් කාර්යයන් දෙකම:if [ ! \( -f "f1" -a -f "f2" \) ] ; then echo MISSING; fi if [ ! -f "f1" ] || [ ! -f "f2" ] ; then echo MISSING; fi
mivk

153
Av ඩේවිඩ් වින්ටර්බෝටම් ඊටත් වඩා රසවත්:[ -f /tmp/foo.txt ] || echo "File not found!"
ඩේවිඩ් ඩබ්ලිව්.

27
පරාමිතිය පහත සඳහන් ඕනෑම එකක් විය හැකිය:-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
එස්ඩී.

5
භාවිතා දී පවත්නා අසමමිතිය හේතුකොටගෙන ඇත ! -fසමග &&භාවිතා එදිරිව -fසමග ||. මෙය / නොපවතින චෙක්පත මගින් ආපසු ලබා දෙන පිටවීමේ කේතය සමඟ සම්බන්ධ වේ. පිටවීමේ කේතය 0 සමඟ සෑම විටම පිරිසිදුව පිටවීමට ඔබට ඔබේ රේඛාව අවශ්‍ය නම් (සමහර විට ඔබට මෙම අවහිරය අවශ්‍ය නොවේ), ප්‍රවේශයන් දෙක එකිනෙකට හුවමාරු නොවේ. විකල්පයක් ලෙස, ifප්‍රකාශයක් භාවිතා කරන්න, ඔබේ / නොපවතින චෙක්පතෙහි පිටවීමේ කේතය ගැන තවදුරටත් කරදර විය යුතු නැත.
Acumenus

671

Bash ගොනු පරීක්ෂාව

-b filename- විශේෂ ගොනුව අවහිර කරන්න
-c filename- විශේෂ අක්ෂර ගොනුව
-d directoryname- ඩිරෙක්ටරිය සඳහා පරීක්ෂා කරන්න පැවැත්ම
-e filename- වර්ගය (නෝඩ්, ඩිරෙක්ටරි, සොකට්, ආදිය) නොසලකා
-f filenameගොනු පැවැත්ම
-G filenameපරීක්ෂා කරන්න - ඩිරෙක්ටරියක් නොව සාමාන්‍ය ගොනු පැවැත්මක් තිබේදැයි පරීක්ෂා කරන්න - ගොනුවක් තිබේද සහ අයිතිද යන්න පරීක්ෂා කරන්න. group ලදායි කණ්ඩායම් හැඳුනුම්පත
-G filename set-group-id- ගොනුවක් තිබේ නම් සහ කණ්ඩායම්-හැඳුනුම්පත නම් සත්‍යය
-k filename- ඇලෙන සුළු බිට්
-L filename- සංකේතාත්මක සබැඳිය
-O filename- ගොනුව තිබේ නම් සහ user ලදායී පරිශීලක හැඳුනුම්පතට අයිති නම් සත්‍යය
-r filename- ගොනුව කියවිය හැකි
-S filenameදැයි පරීක්ෂා කරන්න - ගොනුව සොකට්
-s filenameදැයි පරීක්ෂා කරන්න - ගොනුව nonzero ප්‍රමාණයයි
-u filename- ගොනුව set-user-id bit සකසා
-w filenameඇත්දැයි පරීක්ෂා කරන්න - ගොනුව ලිවිය
-x filenameහැකිදැයි පරීක්ෂා කරන්න - ගොනුව ක්‍රියාත්මක කළ හැකිදැයි පරීක්ෂා කරන්න

භාවිතා කරන්නේ කෙසේද:

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

පරීක්ෂණය ප්රකාශනය භාවිතා මගින් නිෂේධනය කළ හැකි !ක්රියාකරු

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

1
X 0x90 ඔබට අවශ්‍ය නම්, ඔබට මගේ ලිපිය සංස්කරණය කර ලැයිස්තුවට එක් කිරීමට නිදහස තිබේ. මම හිතන්නේ ඔබ අදහස් කළේ: -n String- නූල් වල දිග ශුන්‍ය නොවේදැයි පරීක්ෂා කරන්න. නැතහොත් ඔබ අදහස් කරන්නේ file1 -nt file2- file1 අළුත්ද යන්න පරීක්ෂා කර 2 වන ගොනුව (ඔබට පැරණි
-ot

1
-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/library/l-bash-test/index.html
බ්ලූ කැක්ටි

1
සමහරු ශ්‍රිතයක් වැනි ශ්‍රිතයක් එකතු නොකළේ ඇයි () {⏎ [-e "$ 1"]; එවිට echo "$ 1 පවතී" නැතහොත් echo "$ 1 නොපවතී" fi}
Mz A

291

ඔබට "!" සමඟ ප්‍රකාශනයක් ප්‍රතික්ෂේප කළ හැකිය:

#!/bin/bash
FILE=$1

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

අදාළ මිනිසා පිටුව man test, equivalently හෝ, man [- හෝ help testහෝ help [මෙම බිල්ට් bash විධානය සඳහා වන.


4
දී පැවැත්වෙනු , [එය builtin වේ. එබැවින් අදාළ තොරතුරු ලබා ගන්නේ ඒ වෙනුවට ය help [... නමුත් මෙය පෙන්වන්නේ [එය බිල්ඩින් සඳහා සමාන පදයක් testවන බැවින් අදාළ තොරතුරු ලබා ගන්නේ ඒ වෙනුවට ය help test. අත්පොතේ ඇති Bash Conditional Expression කොටසද බලන්න .
gniourf_gniourf

@gniourf_gniourf: ඔව්, නමුත් bash බිල්ට් [විධානය හැසිරෙනු ඉතා සමාන ඇති බාහිර [විධානය, ඒ නිසා එක්කෝ man testහෝ man [ඔබ එය ක්රියා කරන ආකාරය පිළිබඳ හොඳ අදහසක් ලබා දෙනු ඇත.
කීත් තොම්සන්

8
System කීත් තොම්සන් හැරුණු විට මගේ පද්ධතියේ ඇති බාහිර විධානයට වඩා ස්විචයන් බැෂ් බිල්ඩින් [සතුව ඇත [... පොදුවේ ගත් කල, මම විශ්වාස කරන්නේ දී ඇති මෙවලමකට විශේෂිත වූ ලියකියවිලි කියවීම වඩා හොඳ මිස වෙනත් නොපැහැදිලි සම්බන්ධිත ලේඛනයකට නොවේ. මම වැරදියි, නමුත්;)
gniourf_gniourf

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

එසේම, ගොනුව කැඩුණු සංකේතාත්මක සබැඳියක් හෝ නිත්‍ය නොවන ගොනුවක් විය හැකිය, උදා: සොකට්, උපාංගයක් හෝ ෆිෆෝ වැනි. උදාහරණයක් ලෙස, බිඳුණු සිම්ලින්ක් සඳහා චෙක්පතක් එක් කිරීමට:

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
පරීක්ෂණයෙහි සිටින දෙදෙනා [["ඇයිදැයි මට විමසිය හැකිද? (උදා: [[! -a $ FILE]]). මම සූර්ය කෝෂ පෙට්ටියක සඳහන් කර ඇති සියලුම විකල්පයන් අත්හදා බැලුවෙමි.
ඩිමිට්‍රියෝස් මිස්ට්‍රියෝටිස්

30
ද්විත්ව වරහන් යනු "නවීන" දිගුවකි; උදා: ඔවුන් වචන බෙදීමක් සිදු නොකරනු ඇත (අවකාශයන් සහිත ගොනු නාම වැනි) සහ තවමත් හිස් නූල් සඳහා වැඩ කරයි: mywiki.wooledge.org/BashFAQ/031
bw1024

7
tldp.org/LDP/abs/html/fto.html ට අනුව -a -e ට සමාන වේ. එය "අතහැර දමා" ඇති අතර එහි භාවිතය අධෛර්යමත් වේ. කෙසේ හෝ කැඩුණු සිම්ලින්ක් පරීක්ෂා කිරීමට සඳහන් කිරීම සඳහා +1
ලූකා බෝරියන්

4
imdimitrismistriotis two "[" යනු අතේ ගෙන යා නොහැකි දිගුවකි (වෙනස් ලෙස) zsh & bash; සාමාන්‍යයෙන් ඔබ හැකි නම් එය වළක්වා ගත යුතුය.
හොඳ පුද්ගලයා

7
මම මෙම ඡන්දය පාවිච්චි කළේ එය භාවිතා කළ නිසා [[. එය බහුලව භාවිතා වන දිගුවකි. ඔබ bash භාවිතා කරන බව ඔබ දන්නේ නම් එය භාවිතා නොකිරීමට හේතුවක් නැත. එය [ට වඩා අඩු දෝෂ සහිත වේ.
මයිකල් පොටර්

101

ඔබට තනි විධානයක් ක්‍රියාත්මක කිරීමට අවශ්‍ය නම් එය කෙටියෙන් දැක්විය හැකි බව සඳහන් කිරීම වටී

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

වෙත

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

හෝ

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

ස්තූතියි! භාවිතා නොකරන විකල්පයක් අවශ්‍යයි [[]]
ජොනතන්

69

POSIX shell අනුකූල හැඩතලයෙන් පහත දැක්වෙන එක්-ලයිනර් කිරීමට මම කැමැත්තෙමි :

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

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

විධාන කිහිපයක් සඳහා, මම පිටපතක කරන ආකාරයට:

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

මම මෙය කිරීමට පටන් ගත් පසු, මම සම්පුර්ණයෙන්ම ටයිප් කළ සින්ටැක්ස් භාවිතා කරන්නේ කලාතුරකිනි !!


1
පළමුවෙන්ම, නම් නොකල විචල්‍ය යොමු කිරීම් දෝෂ සහිත වේ. ඒ එය එහිදී සඳහන් කරන්නේ, සඳහන් ඕනෑම බව bash manpage [හෝ testඉදි වීම සඳහා පරීක්ෂාවට ලක් ගොනුව පැවැත්ම (විරුද්ධ ලෙස පෙරනිමි තර්කය මගින් -e)? එය අපැහැදිලි නොවේද? AFAIK (සහ AIUI කොටස "කොන්දේසි ප්රකාශන") ඔබේ ප්රවේශය සමඟ පරික්ෂා කර ඇති බව එකම දේ තර්කය හිස් බව නොවේ (හෝ නිර්වචනය නොකළ) වේ, tautology, මේ අවස්ථාවේ දී, වන (ඉඩ $DIR = ''හා $FILE = '', එසේ නම් එම තර්කය තවමත් '//').
PointedEars

1
සාධනය: ls /foo, ප්රතිඵලයක් ls: cannot access /foo: No such file or directory. [ /foo ] && echo 42, ප්‍රති .ලය 42. GNU bash, 4.2.37 (1) අනුවාදය - මුදා හැරීම (i486-pc-linux-gnu).
PointedEars

Ointed පොයින්ට්ස්: -fවිකල්පය සඳහන් කිරීමට මා අසමත් විය , මේ මොහොතේ මම මෙම පිළිතුර ලිවීය. නිසැකවම ඔබට සැමවිටම භාවිතා කළ හැකිය -e, ඔබට විශ්වාස නැත්නම් එය සාමාන්‍ය ගොනුවක් වනු ඇත. මීට අමතරව, මගේ සියලු ස්ක්‍රිප්ට් වල මම මෙම ඉදිකිරීම් උපුටා දක්වමි, ප්‍රමාණවත් සාක්ෂි නොමැතිව මම මෙය ඉදිරිපත් කර තිබිය යුතුය.
ජේඑම් බෙකර්

ACK. එක් ලයිනර් යන්ත්‍රයකට if-else ගැටළුව විසඳිය නොහැකි බව ඔබ බොහෝ විට දනී: [ $condition ] && if_true || if_falseදෝෂ සහිත වේ. ඕනෑම අවස්ථාවක, මට [ ! -f "$file" ] && if_not_existsකියවීමට හා තේරුම් ගැනීමට වඩා පහසුය [ -f "$file" ] || if_not_exists.
PointedEars

56

ගොනු පැවැත්ම පරීක්ෂා කිරීම සඳහා, පරාමිතිය පහත සඳහන් ඕනෑම එකක් විය හැකිය:

-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

පහත දැක්වෙන සියලුම පරීක්ෂණ සාමාන්‍ය ලිපිගොනු, නාමාවලි සහ සිම්ලින්ක් සඳහා අදාළ වේ:

-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

උදාහරණ පිටපත:

#!/bin/bash
FILE=$1

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

39

ඔබට මේක කරන්න පුළුවන්:

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

හෝ

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

ඔබට ගොනුව සහ ෆෝල්ඩරය යන දෙකම පරීක්ෂා කිරීමට අවශ්‍ය නම්, ඒ -eවෙනුවට විකල්පය භාවිතා කරන්න -f. -eසාමාන්‍ය ලිපිගොනු, නාමාවලි, සොකට්, අක්ෂර විශේෂ ගොනු, විශේෂ ගොනු අවහිර කිරීම යනාදිය සඳහා සත්‍ය වේ.


1
එය විශේෂිත නොවේ. සින්ටැක්ස් කෝර්න් කවචයෙන් එන අතර එය zsh සහ bash වලින් ද ලබා ගත හැකිය. මෙහි සම්මත [උපයෝගීතාවයට වඩා එය සීමිත වාසියක් ඇත .
ස්ටෙෆාන් චසෙලාස්

සාමාන්‍ය ලිපිගොනු (පරීක්ෂා කර ඇති පරිදි -f) සහ නාමාවලි යනු විවිධ වර්ගයේ ගොනු වලින් දෙකක් පමණි . සොකට්, සිම්ලින්ක්, උපාංග, ෆිෆෝස්, දොරවල් ද ඇත ... සිම්ලින්ක් විසර්ජනයෙන් පසුව[ -e ගොනු පැවැත්ම (සාමාන්‍ය, ෆිෆෝ, ඩිරෙක්ටරි ඇතුළු ඕනෑම වර්ගයක) පරීක්ෂා කරනු ඇත.
ස්ටෙෆාන් චසෙලාස්

Te ස්ටෙෆාන් චැසෙලාස්: මට කිසිම තැනක ksh හෝ zsh ටැගයක් නොපෙනේ. අපි කතා කරන්නේ බොහෝ යුනික්ස් පද්ධතිවල ප්‍රමිතිගත කර ඇති bash හෝ යමක් ගැන ය. ඉතින්, සන්දර්භය තුළ, එය විශේෂිත වේ. පිටත ඇති සෑම ෂෙල් වෙඩි ගැන OP දැන ගැනීමට අවශ්‍ය නැත: D
ජාහිඩ්

එය ඔබගේ පිළිතුරේ "විශේෂිත" කොටස පිළිබඳ අදහස් දැක්වීමකි .
ස්ටෙෆාන් චසෙලාස්

Te ස්ටෙෆාන් චැසෙලාස්: ඔව්, සහ සන්දර්භය තුළ (bash සහ සම්මත sh), එය විශේෂිත වේ. ඔබගේ දෙවන අදහස් දැක්වීමේ කාරණය මට නොපෙනේ, එය මුළුමනින්ම සන්දර්භයෙන් බැහැර ය. OP ට අවශ්‍ය නැත -e, ඔහුට අවශ්‍යයි -f.
ජාහිඩ්

35

testඅනපේක්ෂිත ප්‍රති results ල ලබා දිය හැකි බැවින්, නොකල විචල්‍යයක් සඳහා ධාවනය කිරීම ගැන ඔබ සැලකිලිමත් විය යුතුය :

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

නිර්දේශිත වන්නේ සාමාන්‍යයෙන් පරීක්ෂා කරන ලද විචල්‍යය ද්විත්ව උද්ධෘත ලකුණු වලින් වට කර තිබීමයි:

#!/bin/sh
FILE=$1

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

8
නිර්දේශය නම්, සෑම විචල්‍යයක්ම ද්විත්ව උද්ධෘත ලකුණු වලින් වට කර තිබීමයි, ඔබ අනවශ්‍ය අවස්ථාවන්හි හෝ දුර්ලභ අවස්ථාවන්ගෙන් එකක් හෝ ඇති බව ඔබ හරියටම දන්නේ නැත්නම්. (නැත, මෙය ඔවුන්ගෙන් එකක් නොවේ.)
we වේ

ද්විත්ව උද්ධෘත ලකුණ භාවිතා කිරීම එසේ නොවන්නේ මන්දැයි විස්තර කිරීමට ඔබ කැමතිද? එසේ නොමැතිනම් අදහස් දැක්වීමේ ප්‍රයෝජනය මා දකින්නේ නැත.
artdanil

4
මම අදහස් කළේ: මෙය අනවශ්‍ය හෝ හානිකර වන දුර්ලභ අවස්ථාවන්ගෙන් එකක් නොවේ. සෑම විචල්‍යයක්ම ද්විත්ව මිල ගණන් යටතේ කොටු කිරීමට ෂෙල් ක්‍රමලේඛකයෙකු භාවිතා කළ යුතුය; මෙම නියමය සීමා නොවේ [ ... ].
we වේ


24

මෙය කිරීමට පැහැදිලි ක්‍රම තුනක් තිබේ:

  1. පිටවීමේ තත්වය බැෂ් සමඟ නිෂේධනය කරන්න (වෙනත් පිළිතුරක් මෙය පවසා නැත):

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

    හෝ:

    ! [ -e "$file" ] && echo "file does not exist"
  2. පරීක්ෂණ විධානය තුළ පරීක්ෂණය නිෂේධනය කරන්න [(මීට පෙර බොහෝ පිළිතුරු ඉදිරිපත් කර ඇත්තේ එයයි):

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

    හෝ:

    [ ! -e "$file" ] && echo "file does not exist"
  3. පරීක්ෂණය negative ණාත්මක වීම ||වෙනුවට ක්‍රියා කරන්න &&: ( වෙනුවට ):

    පමනි:

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

    මෙය මෝඩ පෙනුමකි (IMO), ඔබේ කේතය /bin/shනල මාර්ග නිෂේධන ක්‍රියාකරු ( !) හි නොමැති බෝර්න් කවචයට ( සොලාරිස් 10 හෝ ඊට පෙර මෙන්) අතේ ගෙන යා හැකි නම් මිස එය භාවිතා නොකරන්න :

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

! [සහ අතර අතේ ගෙන යා හැකි වෙනසක් [ !තිබේද?
ශීත කළ ගිනිදැල්

3
එම ! [ ෂෙල් නළ මාර්ග 2.9.2 (විධාන) සඳහා POSIX වේ Otherwise, the exit status shall be the logical NOT of the exit status of the last command හා [ ! පරීක්ෂණය සඳහා POSIX වේ ! expression True if expression is false. False if expression is true. ඒ නිසා, දෙකම POSIX, සහ මගේ අත්දැකීම් වේ, දෙකම පුළුල් සහාය දක්වයි.

1
Ro ෆ්‍රොසෙන්ෆ්ලේම්, බෝර්න් කවචයට !කෝර්න් කවචය විසින් හඳුන්වා දුන් මූල පදය නොතිබුණි . සොලාරිස් 10 සහ ඊට වැඩි අය හැරුණු විට, මේ දිනවල ඔබට බෝර්න් කවචයක් හමු නොවනු ඇත.
ස්ටෙෆාන් චසෙලාස්

23

තුළ

[ -f "$file" ]

මෙම [විධානය කරන්නේ stat()(නෑ lstat()තුල ගබඩා කර ඇති මාර්ගය මත) පද්ධතිය ඇමතුමක් $fileසහ ප්රතිලාභ සැබෑ බව පද්ධතිය ඇමතුමක් සාර්ථක විසින් ආපසු ලෙස ගොනු වර්ගය නම් stat()"යනු සාමාන්ය ".

එබැවින් [ -f "$file" ]සත්‍යය නැවත ලැබුනහොත් , ගොනුව පවතින බව ඔබට පැවසිය හැකි අතර එය සාමාන්‍ය ගොනුවක් හෝ සිම්ලින්ක් එකක් වන අතර එය සාමාන්‍ය ගොනුවකට නිරාකරණය වේ (හෝ අවම වශයෙන් එය ඒ අවස්ථාවේ වියstat() ).

කෙසේ වෙතත් එය නැවත නම් බොරු (හෝ නම් [ ! -f "$file" ]හෝ ! [ -f "$file" ]සැබෑ නැවත), විවිධ හැකියාවන් වේ:

  • ගොනුව නොපවතී
  • ගොනුව පවතින නමුත් එය සාමාන්‍ය දෙයක් නොවේ ගොනුවක් නොවේ (උපාංගයක්, ෆිෆෝ, ඩිරෙක්ටරි, සොකට් විය හැකිය ...)
  • ගොනුව පවතින නමුත් ඔබට මව් නාමාවලියට සෙවුම් අවසරයක් නොමැත
  • ගොනුව පවතින නමුත් එයට ප්‍රවේශ වීමේ මාර්ගය දිගුය
  • ගොනුව සාමාන්‍ය ගොනුවකට සමමුහුර්ත කිරීමකි, නමුත් සිම්ලින්ක් විභේදනයට සම්බන්ධ සමහර නාමාවලි සඳහා ඔබට සෙවුම් අවසරයක් නොමැත.
  • ... stat()පද්ධති ඇමතුම අසමත් වීමට වෙනත් හේතුවක් .

කෙටියෙන් කිවහොත්, එය විය යුත්තේ:

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

ගොනුව නොපවතින බව දැන ගැනීමට, අපට එය අවශ්‍ය වේ stat() දෝෂ සහිත කේතයක් සමඟ නැවත පැමිණීමට පද්ධති ඇමතුම වේ ENOENT( ENOTDIRඅපට කියනුයේ එක් මාර්ග සංරචකයක් ඩිරෙක්ටරියක් නොවන බව අපට පැවසිය හැකි තවත් අවස්ථාවකි. එම මාර්ගයේ පවතී). අවාසනාවට[ විධානය අපට එය දැනුම් දෙන්නේ නැත. දෝෂ කේතය ENOENT, EACCESS (අවසරය ප්‍රතික්ෂේප කරන ලදි), ENAMETOOLONG හෝ වෙනත් දෙයක්ද යන්න එය සාවද්‍ය වේ.

මෙම [ -e "$file" ]පරීක්ෂණය සමග සිදු කල හැකls -Ld -- "$file" > /dev/null . එවැනි අවස්ථාවකදී, තොරතුරු ක්‍රමලේඛිකව පහසුවෙන් භාවිතා කළ නොහැකි වුවද, අසමත් lsවීමට හේතුව ඔබට කියනු ඇත stat():

$ 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

අවම වශයෙන් lsමට කියනවා එය අසමත් වන බව ගොනුව නොපවතින නිසා නොවේ. එයට හේතුව ගොනුව තිබේද නැද්ද යන්න එයට කිව නොහැකි බැවිනි. මෙම [විධානය පමණක් ප්රශ්නයක් නොතකා හැරියා ය.

zshකවචය සමඟ , ඔබට $ERRNOඅසමත් වූ විධානයෙන් පසු විශේෂ විචල්‍යය සමඟ දෝෂ කේතය [විමසිය හැකි අතර, එම අංකය $errnosවිශේෂ අරාව භාවිතා කර විකේතනය කරන්න .zsh/system මොඩියුලයේ :

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

( මෑත සංස්කරණ සමඟ ගොඩනඟන විට $errnosසමහර අනුවාද සමඟ සහාය බිඳී ඇති බවටzshgcc පරිස්සම් වන්න ).


11

පරීක්ෂණයක් ආපසු හැරවීමට, "!" භාවිතා කරන්න. එය වෙනත් භාෂාවල "නොවන" තාර්කික ක්‍රියාකරුට සමාන වේ. මේක උත්සාහ කරන්න:

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

හෝ තරමක් වෙනස් ආකාරයකින් ලියා ඇත:

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

නැතහොත් ඔබට භාවිතා කළ හැකිය:

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

නැතහොත්, සියල්ලම එකට ඉදිරිපත් කිරීම:

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

ඒවා ලිවිය හැකිය (එවකට භාවිතා කරමින් "සහ" ක්‍රියාකරු: &&):

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

මේ වගේ කෙටි පෙනුමක්:

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


10

මෙම කේතය ද ක්‍රියාත්මක වේ.

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

7

සරලම ක්‍රමය

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

6

නාමාවලියක ගොනුවක් සොයා ගැනීම සඳහා මෙම ෂෙල් ස්ක්‍රිප්ට් ක්‍රියා කරයි:

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
වෙනත් පිළිතුරු දැනටමත් ලබා දී නොමැති කිසිවක් මෙය එකතු කරන බව පැහැදිලි නැත. එය මාර්ග නාමයක් තදින් කේත කරයි. ප්‍රශ්නය ටැග් බැෂ් ලෙස ටැග් කර ඇති බැවින්, එය විමසීමට read -p "Enter file name: " -r aමෙන්ම කියවීමටද භාවිතා කළ හැකිය . එය විචල්‍යය වටා උපුටා දැක්වීම් භාවිතා කරයි; එය හොඳයි, නමුත් පැහැදිලි කළ යුතුයි. එය ගොනුවේ නම දෝංකාර දුන්නේ නම් වඩා හොඳ විය හැකිය. මෙමඟින් ගොනුව පවතින බවත් එය හිස් නොවන බවත් (එහි තේරුම -s) පරික්ෂා කරන අතර ප්‍රශ්නය ඕනෑම ගොනුවක් ගැන අසයි, හිස් හෝ නැත (ඒ සඳහා -fවඩාත් සුදුසු).
ජොනතන් ලෙෆ්ලර්

4

සමහර විට && සහ || භාවිතා කිරීම පහසු විය හැකිය ක්‍රියාකරුවන්.

මෙන් (ඔබට "test" විධානය තිබේ නම්):

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

හෝ

test -b $FILE || echo File there!

2

ඔබට testඒ වෙනුවට []භාවිතා !කිරීමට අවශ්‍ය නම්, ප්‍රතික්ෂේප කිරීම ලබා ගැනීමට ඔබට භාවිතා කළ හැකිය:

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

0

එක් ලයිනර් එකක ඔබට බහු විධාන කාණ්ඩගත කළ හැකිය

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

හෝ

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

ගොනු නාමය පිටවන්නේ නැත්නම්, ප්‍රතිදානය වනු ඇත

test1
test2
test3

සටහන: (...) උප කුලකයකින් ධාවනය වේ, {...; the එකම කවචයේ ධාවනය වේ. කැරලි වරහන් අංකනය ක්‍රියාත්මක වන්නේ බාෂ් වලින් පමණි.


1
නැහැ, සඟල වරහන අංකනය නොවන bash පමණක්; එය ඕනෑම POSIX- අනුකූල කවචයක ක්‍රියා කරයි.
චාල්ස් ඩෆි

0
envfile=.env

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

කරුණාකර කේතය සමඟ පැහැදිලි කිරීමක් සපයන්න.
zohar

මෙම කේතය මඟින් OP හි ගැටළුව විසඳිය හැකි අතර, ඔබේ කේතය OP හි ගැටලුව විසඳන්නේ කෙසේද යන්න පිළිබඳ පැහැදිලි කිරීමක් ඇතුළත් කිරීම වඩාත් සුදුසුය. මේ ආකාරයෙන්, අනාගත අමුත්තන්ට ඔබගේ ලිපියෙන් ඉගෙන ගත හැකි අතර එය ඔවුන්ගේම කේතයට යොදන්න. SO යනු කේතීකරණ සේවාවක් නොව දැනුම සඳහා සම්පතකි. එසේම, උසස් තත්ත්වයේ, සම්පූර්ණ පිළිතුරු ඉහළ නැංවීමට වැඩි ඉඩක් ඇත. මෙම විශේෂාංග, සියලුම තනතුරු ස්වයං අන්තර්ගතය යන අවශ්‍යතාව සමඟ, වේදිකාවක් ලෙස SO හි සමහර ශක්තීන් වන අතර එය සංසද වලින් වෙනස් වේ. අමතර තොරතුරු එකතු කිරීමට සහ / හෝ ඔබේ පැහැදිලි කිරීම් මූලාශ්‍ර ලේඛන සමඟ අතිරේකව සංස්කරණය කිරීමට ඔබට සංස්කරණය කළ හැකිය.
ysf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.