Bash shell ස්ක්‍රිප්ටයක ආදාන තර්කයේ පැවැත්ම පරීක්ෂා කරන්න


1382

ආදාන තර්කයක පැවැත්ම පරීක්ෂා කිරීමට මට අවශ්‍යය. මට පහත පිටපත ඇත

if [ "$1" -gt "-1" ]
  then echo hi
fi

මම ගත්තා

[: : integer expression expected

ආදාන පරාමිතිය 1 තිබේදැයි බැලීමට පළමුව එය පරීක්ෂා කරන්නේ කෙසේද?

Answers:


2381

එය:

if [ $# -eq 0 ]
  then
    echo "No arguments supplied"
fi

මෙම $#විචල්ය ඔබ ආදාන තර්ක සංඛ්යාව කියන්න තිර රචනය සම්මත විය කරනු ඇත.

නැතහොත් තර්කයක් හිස් නූලක් ද නැතිනම් ඔබට එය පරීක්ෂා කළ හැකිය:

if [ -z "$1" ]
  then
    echo "No argument supplied"
fi

මෙම -z"$ 1" යන ව්යාප්තිය ශූන්ය string හෝ නොවේ නම් ස්විචය පරීක්ෂා කරනු ඇත. එය ශුන්‍ය නූලක් නම් ශරීරය ක්‍රියාත්මක වේ.


63
මම එය මේ ආකාරයෙන් කිරීමට කැමතියි, දැඩි වාක්‍ය ඛණ්ඩයෙන් සහ තවමත් POSIX පිළිගත හැකිය. [ -z "$1" ] && echo "No argument supplied" මම කැමතියි එක් ලයිනර්, ඒවා මට පහසු නිසා; භාවිතයට සාපේක්ෂව පිටවීමේ අගය පරීක්ෂා කිරීම ද වේගවත් යif
ජේඑම් බෙකර්

173
exit 1ස්ක්‍රිප්ට් එක ක්‍රියාත්මක වීමට තර්කය අවශ්‍ය වූ විට if වාරණය තුළ ඔබේ දෝංකාරය අවසානයේ එකතු කිරීමට ඔබට අවශ්‍ය වනු ඇත . පැහැදිලිය, නමුත් සම්පූර්ණත්වය ගැන සඳහන් කිරීම වටී.
msanford

17
පළමු තර්කය ආරම්භ කිරීමට නමුත් හිස් වීමට එය කලාතුරකින් ප්‍රයෝජනවත් වුවද හැකි ය; programname "" secondarg third. මෙම $#චෙක්පත පරිද්දෙන් තේරුම නිශ්චිතවම තර්ක සංඛ්යාව බලයි.
ත්‍රිත්ව

39
නොබියෙකුට, විශේෂයෙන් ස්ක්‍රිප්ටින් නොවන පසුබිමකින් පැමිණි අයෙකුට, මේ දේවල් පිළිබඳ සුවිශේෂතා කිහිපයක් සඳහන් කිරීම ද වැදගත් ය. විවෘත කිරීමෙන් හා අවසන් වරහනෙන් පසුව අපට ඉඩක් අවශ්‍ය බව ඔබට සඳහන් කළ හැකිය. එසේ නොමැතිනම් දේවල් ක්රියා නොකරයි. මම ස්ක්‍රිප්ටින් නොබියෙක් (මම සී පසුබිමෙන් ආවෙමි) එය දුෂ්කර ක්‍රමයකි. සමස්ත දේම "මෙන්" පිටපත් කිරීමට මා තීරණය කළ විට පමණක් මට දේවල් ක්‍රියාත්මක විය. ආරම්භක වරහනෙන් පසුව සහ අවසන් වීමට පෙර මට ඉඩක් තැබිය යුතු බව එවිට මට වැටහුණි.
හයි ඕන්මීට්

75
සහ විකල්ප ආග් සඳහාif [ ! -z "$1" ]; then ...
gcb

353

මේ ආකාරයෙන් නිරූපණය කිරීම වඩා හොඳය

if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 1
fi

ඔබට සාමාන්‍යයෙන් තර්ක කිහිපයක් ඇත්නම් පිටවිය යුතුය.


72
එය එසේ නොවේ: මෙය exit 1ඔබට සාමාන්‍යයෙන් අවශ්‍ය වන අතර [[ ]]සාමාන්‍යයෙන් වඩා සාධාරණ (iirc) පරීක්ෂණය භාවිතා කරයි . එබැවින් කේතය අන්ධ ලෙස පිටපත් කිරීමේ පුද්ගලයින් සඳහා මෙය වඩා හොඳ පිළිතුරයි.
dshepherd

43
[] සහ [[] අතර වෙනස ගැන වැඩි විස්තර දැනගැනීම සඳහා stackoverflow.com/questions/3427872/…
සෙබස්තියන් ග්‍රිග්නොලි

105

සමහර අවස්ථා වලදී පරිශීලකයා ස්ක්‍රිප්ටයට තර්කයක් ලබා දී ඇත්දැයි පරීක්ෂා කර බැලිය යුතුය. පහත පිටපතෙහි මෙන්:

scale=${2:-1}
emulator @$1 -scale $scale

මෙන්න පරිශීලකයා scale2 වන පරාමිතියක් ලෙස සමත් වී නොමැති නම් , මම -scale 1පෙරනිමියෙන් ඇන්ඩ්‍රොයිඩ් ඉමුලේටරය දියත් කරමි . ${varname:-word}පුළුල් කිරීමේ ක්‍රියාකරුවෙකි. වෙනත් පුළුල් කිරීමේ ක්‍රියාකරුවන් ද ඇත:

  • ${varname:=word}වන සකසයි අතර ආර්ද්රතාවය varname, ඒ වෙනුවට ආපසු wordවටිනාකම ෙකොපමණද;
  • ${varname:?message}වන ප්රතිලාභ එක්කෝ varnameඑය අර්ථ නම් තියෙන්නේ හා ශූන්ය නොවන හෝ මුද්රණය messageහා (පළමු උදාහරණය වැනි) තිර රචනය නැවතිය හැක;
  • ${varname:+word}එය ආපසු එන්නේ අර්ථ දක්වා ඇති අතර එය ශුන්‍ය නොවේ wordනම් පමණි varname; වෙනත් ආකාරයකින් ශුන්‍ය වේ.

1
ඉහත උදාහරණය භාවිතා කරන බව පෙනේ ${varname?message}. අමතර :අක්ෂර වින්‍යාසයද, නැතහොත් එය හැසිරීම වෙනස් කරයිද?
Eki

6
Eki, ":" යනු මෙම උදාහරණයේ ඇති / bin / true සඳහා වූ බිල්ඩින් විධානයකි. එය සපයන තර්ක විතර්ක නොසලකා හරින කිසිවක් නොකරන විධානයක් නියෝජනය කරයි. පරිවර්තකයා "$ varname" හි අන්තර්ගතය ක්‍රියාත්මක කිරීමට උත්සාහ කිරීමෙන් වළක්වා ගැනීම සඳහා මෙම පරීක්ෂණයෙන් එය අත්‍යවශ්‍ය වේ (ඔබට එය අනිවාර්යයෙන්ම සිදුවීමට අවශ්‍ය නැත). සඳහන් කිරීම වටී; ඔබට අවශ්‍ය පරිදි මෙම ක්‍රමය සමඟ බොහෝ විචල්‍යයන් පරීක්ෂා කළ හැකිය. සහ සියල්ලම විශේෂිත දෝෂ පණිවිඩ සමඟ. එනම්: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
user.friendly

49

උත්සාහ කරන්න:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi

5
ඇයි ඔබ වෙනුවෙන් ද්විත්ව මිල කැඳවීම් අවශ්ය වන්නේ ඇයි $#හා 0?
user13107

1
$ # සහ 0 වැනි ද්විත්ව උපුටා දැක්වීම් නොමැතිව අප භාවිතා කරන්නේ නම් ගැටළුවක් නැත
රංජිත්කුමාර් ටී

ජනේල මත, mingw මෙය යා හැකි එකම මාර්ගයයි.
ලාජෝස් මෙසාරොස්

2
මෙම පිළිතුර මා විසින් සාදන ලද පිටපතක් සඳහා හොඳ ආරම්භයක් සපයයි. පෙන්වීමට ස්තූතියි else.
ක්‍රිස් කේ

2
@ පරිශීලක 13107 ද්විත්ව උපුටා දැක්වීමේ විචල්‍යයන් ග්ලෝබ් කිරීම (එනම් ගොනු නාම පුළුල් කිරීම වැනි foo*) සහ වචන බෙදීම වළක්වයි (එනම් වටිනාකමේ අවකාශය අන්තර්ගත නම් බෙදීම). මෙම අවස්ථා $#දෙකෙහිම අදාළ නොවන බැවින් මෙම අවස්ථාවේදී උපුටා දැක්වීම අවශ්‍ය නොවේ. උපුටා 0දැක්වීම ද අවශ්‍ය නොවේ, නමුත් සමහර අය සාරධර්ම උපුටා දැක්වීමට කැමැත්තක් දක්වන්නේ ඒවා සැබවින්ම නූල් වන අතර එමඟින් එය වඩාත් පැහැදිලිව පෙනේ.
ඩෙනිස්

39

පිටපතට තර්ක ඉදිරිපත් කර ඇත්දැයි සොයා ගැනීමට තවත් ක්‍රමයක්:

((!$#)) && echo No arguments supplied!

ෂෙල් අංක ගණිතයේ(( expr )) නියමයන්ට අනුව ප්‍රකාශනය ඇගයීමට හේතු වන සටහන .

කිසිදු තර්කයක් නොමැති විට පිටවීම සඳහා යමෙකුට මෙසේ පැවසිය හැකිය:

((!$#)) && echo No arguments supplied! && exit 1

ඉහත කීමට තවත් (ප්‍රතිසම) ක්‍රමයක් වනුයේ:

let $# || echo No arguments supplied

let $# || { echo No arguments supplied; exit 1; }  # Exit if no arguments!

help let පවසයි:

let: let arg [arg ...]

  Evaluate arithmetic expressions.

  ...

  Exit Status:
  If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.

2
-1 තර්කයක් පැවතීම වලංගු කරන්නේ නම් මෙය නරකම ක්‍රමය විය හැකිය .. තවද එය ඉතිහාසය ආදේශ කිරීම අවුලුවන අතර නරක දේ කළ හැකිය.
user.friendly

2
exitමගේ zsh ක්‍රියාවලිය මරා දමනවා වෙනුවට , මම එය භාවිතා returnනොකරන අතර එය විනාශ නොකරමි
ටිමෝ

ඇයි ඇත ((!$#))ඉතිහාසය ආදේශන අවුලුවාලීමට?
Zhro

25

සරල ස්ක්‍රිප්ට් සඳහා මම බොහෝ විට මෙම ස්නිපටය භාවිතා කරමි:

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi

1
ඉතින්, මෙය භාවිතා කිරීමට ඔබට අවශ්‍ය වන්නේ එක් තර්කයක් පමණක්ද?
ඩැනියෙල්

23

පෙන්වා දීමට තවත් මූලික කරුණක් ඇති හෙයින් පමණක්, ඔබේ නූල ශුන්‍යදැයි පරීක්ෂා කළ හැකි බව මම එකතු කරමි:

if [ "$1" ]; then
  echo yes
else
  echo no
fi

ඒ හා සමානව ඔබ ආර්ග් ගණන් අපේක්ෂා කරන්නේ නම් ඔබේ අන්තිමයා පරීක්ෂා කරන්න:

if [ "$3" ]; then
  echo has args correct or not
else
  echo fixme
fi

ඕනෑම ආගන් හෝ var සමඟ එසේ කරන්න


4

තර්කය තිබේද යන්න පරීක්ෂා කිරීමට ඔබ කැමති නම්, තර්ක # ඔබේ ඉලක්ක තර්ක අංකයට වඩා වැඩි හෝ සමානද යන්න පරීක්ෂා කළ හැකිය.

පහත දැක්වෙන පිටපත මඟින් මෙය ක්‍රියාත්මක වන ආකාරය පෙන්නුම් කරයි

test.sh

#!/usr/bin/env bash

if [ $# -ge 3 ]
then
  echo script has at least 3 arguments
fi

පහත ප්‍රතිදානය නිපදවයි

$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments

3

කුඩා මතක්, බෑෂ් දී සංඛ්යාත්මක ටෙස්ට් ක්රියාකරුවන් නිඛිල (වැඩ පමණක් ලෙස -eq, -lt, -ge, ආදිය)

මගේ $ vars ints බව සහතික කිරීමට මම කැමතියි

var=$(( var + 0 ))

මම ඒවා පරීක්ෂා කිරීමට පෙර, “[: පූර්ණ සංඛ්‍යා තර්ක අවශ්‍යයි” දෝෂයෙන් ආරක්ෂා වීමට.


1
පිළිවෙලට උපක්‍රමයක්, නමුත් කරුණාකර සටහන් කරන්න: අංක ගණිතයේ පාවෙන හැසිරවීමට බාෂ්ගේ නොහැකියාව නිසා, මෙම ක්‍රමය සින්ටැක්ස් දෝෂයක් ඇති කළ හැකි අතර ශුන්‍ය නොවන ලෙස ආපසු පැමිණිය හැකි අතර එය දෝෂ සක්‍රිය කිරීමට බාධාවක් වනු ඇත. var=$(printf "%.0f" "$var")පාවෙන හැසිරවිය හැකි නමුත් නූලක් දුන් විට ශුන්‍ය නොවන පිටවීමෙන් පීඩා විඳිති. ඔබට අවුල් සහගත නම්, මම භාවිතා කරන මෙම ක්‍රමය පූර්ණ සංඛ්‍යාවක් බලාත්මක කිරීම සඳහා වඩාත්ම ශක්තිමත් බව පෙනේ : var=$(<<<"$var" awk '{printf "%.0f", $0}'). Var සකසා නොමැති නම්, එය පෙරනිමියෙන් "0" වේ. Var යනු පාවෙන නම්, එය ආසන්නතම පූර්ණ සංඛ්‍යාවට වටකුරු වේ. Values ​​ණ අගයන් ද භාවිතා කිරීමට සුදුසු ය.
user.friendly

1

එක් ලයිනර් බෑෂ් ශ්‍රිත වලංගුකරණය

myFunction() {

    : ${1?"forgot to supply an argument"}
    if [ "$1" -gt "-1" ]; then
        echo hi
    fi

}

ශ්‍රිතයේ නම සහ භාවිතය එක් කරන්න

myFunction() {

    : ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage:  ${FUNCNAME[0]} some_integer"}
    if [ "$1" -gt "-1" ]; then
        echo hi
    fi

}

පූර්ණ සංඛ්‍යාවක් දැයි පරීක්ෂා කිරීම සඳහා වලංගුකරණය එක් කරන්න

අතිරේක වලංගුතාවයක් එක් කිරීමට, උදාහරණයක් ලෙස සම්මත කරන ලද තර්කය පූර්ණ සංඛ්‍යාවක් දැයි බැලීමට, වලංගු කිරීමේ ශ්‍රිතයක් ඇමතීම සඳහා එක් ලයිනර් වලංගු කිරීම වෙනස් කරන්න:

: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage:  ${FUNCNAME[0]} some_integer"} && validateIntegers $1 || die "Must supply an integer!"

ඉන්පසු, තර්කය වලංගු කරන වලංගු කිරීමේ ශ්‍රිතයක් සාදන්න, සාර්ථකත්වයට 0 ක්, අසාර්ථකත්වයට 1 ක් සහ අසාර්ථකත්වය මත ස්ක්‍රිප්ට් අහෝසි කරන ඩයි ශ්‍රිතයක් සාදන්න

validateIntegers() {

    if ! [[ "$1" =~ ^[0-9]+$ ]]; then
        return 1 # failure
    fi
    return 0 #success

}

die() { echo "$*" 1>&2 ; exit 1; }

ඊටත් වඩා සරලයි - භාවිතා කරන්න set -u

set -u යොමු කරන ලද සෑම විචල්‍යයක්ම එය භාවිතා කරන විට සකසා ඇති බවට වග බලා ගනී, එබැවින් එය සකසා අමතක කරන්න

myFunction() {
    set -u
    if [ "$1" -gt "-1" ]; then
        echo hi
    fi

}
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.