ආදාන තර්කයක පැවැත්ම පරීක්ෂා කිරීමට මට අවශ්යය. මට පහත පිටපත ඇත
if [ "$1" -gt "-1" ]
then echo hi
fi
මම ගත්තා
[: : integer expression expected
ආදාන පරාමිතිය 1 තිබේදැයි බැලීමට පළමුව එය පරීක්ෂා කරන්නේ කෙසේද?
ආදාන තර්කයක පැවැත්ම පරීක්ෂා කිරීමට මට අවශ්යය. මට පහත පිටපත ඇත
if [ "$1" -gt "-1" ]
then echo hi
fi
මම ගත්තා
[: : integer expression expected
ආදාන පරාමිතිය 1 තිබේදැයි බැලීමට පළමුව එය පරීක්ෂා කරන්නේ කෙසේද?
Answers:
එය:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
මෙම $#
විචල්ය ඔබ ආදාන තර්ක සංඛ්යාව කියන්න තිර රචනය සම්මත විය කරනු ඇත.
නැතහොත් තර්කයක් හිස් නූලක් ද නැතිනම් ඔබට එය පරීක්ෂා කළ හැකිය:
if [ -z "$1" ]
then
echo "No argument supplied"
fi
මෙම -z
"$ 1" යන ව්යාප්තිය ශූන්ය string හෝ නොවේ නම් ස්විචය පරීක්ෂා කරනු ඇත. එය ශුන්ය නූලක් නම් ශරීරය ක්රියාත්මක වේ.
exit 1
ස්ක්රිප්ට් එක ක්රියාත්මක වීමට තර්කය අවශ්ය වූ විට if වාරණය තුළ ඔබේ දෝංකාරය අවසානයේ එකතු කිරීමට ඔබට අවශ්ය වනු ඇත . පැහැදිලිය, නමුත් සම්පූර්ණත්වය ගැන සඳහන් කිරීම වටී.
programname "" secondarg third
. මෙම $#
චෙක්පත පරිද්දෙන් තේරුම නිශ්චිතවම තර්ක සංඛ්යාව බලයි.
if [ ! -z "$1" ]; then ...
මේ ආකාරයෙන් නිරූපණය කිරීම වඩා හොඳය
if [[ $# -eq 0 ]] ; then
echo 'some message'
exit 1
fi
ඔබට සාමාන්යයෙන් තර්ක කිහිපයක් ඇත්නම් පිටවිය යුතුය.
exit 1
ඔබට සාමාන්යයෙන් අවශ්ය වන අතර [[ ]]
සාමාන්යයෙන් වඩා සාධාරණ (iirc) පරීක්ෂණය භාවිතා කරයි . එබැවින් කේතය අන්ධ ලෙස පිටපත් කිරීමේ පුද්ගලයින් සඳහා මෙය වඩා හොඳ පිළිතුරයි.
සමහර අවස්ථා වලදී පරිශීලකයා ස්ක්රිප්ටයට තර්කයක් ලබා දී ඇත්දැයි පරීක්ෂා කර බැලිය යුතුය. පහත පිටපතෙහි මෙන්:
scale=${2:-1}
emulator @$1 -scale $scale
මෙන්න පරිශීලකයා scale
2 වන පරාමිතියක් ලෙස සමත් වී නොමැති නම් , මම -scale 1
පෙරනිමියෙන් ඇන්ඩ්රොයිඩ් ඉමුලේටරය දියත් කරමි . ${varname:-word}
පුළුල් කිරීමේ ක්රියාකරුවෙකි. වෙනත් පුළුල් කිරීමේ ක්රියාකරුවන් ද ඇත:
${varname:=word}
වන සකසයි අතර ආර්ද්රතාවය varname
, ඒ වෙනුවට ආපසු word
වටිනාකම ෙකොපමණද;${varname:?message}
වන ප්රතිලාභ එක්කෝ varname
එය අර්ථ නම් තියෙන්නේ හා ශූන්ය නොවන හෝ මුද්රණය message
හා (පළමු උදාහරණය වැනි) තිර රචනය නැවතිය හැක;${varname:+word}
එය ආපසු එන්නේ අර්ථ දක්වා ඇති අතර එය ශුන්ය නොවේ word
නම් පමණි varname
; වෙනත් ආකාරයකින් ශුන්ය වේ.${varname?message}
. අමතර :
අක්ෂර වින්යාසයද, නැතහොත් එය හැසිරීම වෙනස් කරයිද?
: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
උත්සාහ කරන්න:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi
$#
හා 0
?
else
.
foo*
) සහ වචන බෙදීම වළක්වයි (එනම් වටිනාකමේ අවකාශය අන්තර්ගත නම් බෙදීම). මෙම අවස්ථා $#
දෙකෙහිම අදාළ නොවන බැවින් මෙම අවස්ථාවේදී උපුටා දැක්වීම අවශ්ය නොවේ. උපුටා 0
දැක්වීම ද අවශ්ය නොවේ, නමුත් සමහර අය සාරධර්ම උපුටා දැක්වීමට කැමැත්තක් දක්වන්නේ ඒවා සැබවින්ම නූල් වන අතර එමඟින් එය වඩාත් පැහැදිලිව පෙනේ.
පිටපතට තර්ක ඉදිරිපත් කර ඇත්දැයි සොයා ගැනීමට තවත් ක්රමයක්:
((!$#)) && 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.
exit
මගේ zsh ක්රියාවලිය මරා දමනවා වෙනුවට , මම එය භාවිතා return
නොකරන අතර එය විනාශ නොකරමි
((!$#))
ඉතිහාසය ආදේශන අවුලුවාලීමට?
පෙන්වා දීමට තවත් මූලික කරුණක් ඇති හෙයින් පමණක්, ඔබේ නූල ශුන්යදැයි පරීක්ෂා කළ හැකි බව මම එකතු කරමි:
if [ "$1" ]; then
echo yes
else
echo no
fi
ඒ හා සමානව ඔබ ආර්ග් ගණන් අපේක්ෂා කරන්නේ නම් ඔබේ අන්තිමයා පරීක්ෂා කරන්න:
if [ "$3" ]; then
echo has args correct or not
else
echo fixme
fi
ඕනෑම ආගන් හෝ var සමඟ එසේ කරන්න
තර්කය තිබේද යන්න පරීක්ෂා කිරීමට ඔබ කැමති නම්, තර්ක # ඔබේ ඉලක්ක තර්ක අංකයට වඩා වැඩි හෝ සමානද යන්න පරීක්ෂා කළ හැකිය.
පහත දැක්වෙන පිටපත මඟින් මෙය ක්රියාත්මක වන ආකාරය පෙන්නුම් කරයි
#!/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
කුඩා මතක්, බෑෂ් දී සංඛ්යාත්මක ටෙස්ට් ක්රියාකරුවන් නිඛිල (වැඩ පමණක් ලෙස -eq
, -lt
, -ge
, ආදිය)
මගේ $ vars ints බව සහතික කිරීමට මම කැමතියි
var=$(( var + 0 ))
මම ඒවා පරීක්ෂා කිරීමට පෙර, “[: පූර්ණ සංඛ්යා තර්ක අවශ්යයි” දෝෂයෙන් ආරක්ෂා වීමට.
var=$(printf "%.0f" "$var")
පාවෙන හැසිරවිය හැකි නමුත් නූලක් දුන් විට ශුන්ය නොවන පිටවීමෙන් පීඩා විඳිති. ඔබට අවුල් සහගත නම්, මම භාවිතා කරන මෙම ක්රමය පූර්ණ සංඛ්යාවක් බලාත්මක කිරීම සඳහා වඩාත්ම ශක්තිමත් බව පෙනේ : var=$(<<<"$var" awk '{printf "%.0f", $0}')
. Var සකසා නොමැති නම්, එය පෙරනිමියෙන් "0" වේ. Var යනු පාවෙන නම්, එය ආසන්නතම පූර්ණ සංඛ්යාවට වටකුරු වේ. Values ණ අගයන් ද භාවිතා කිරීමට සුදුසු ය.
එක් ලයිනර් බෑෂ් ශ්රිත වලංගුකරණය
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
}
[ -z "$1" ] && echo "No argument supplied"
මම කැමතියි එක් ලයිනර්, ඒවා මට පහසු නිසා; භාවිතයට සාපේක්ෂව පිටවීමේ අගය පරීක්ෂා කිරීම ද වේගවත් යif