මට ලිවිය හැකිය
VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
මට අවසාන ප්රති result ලය සියල්ලම එක හා සමානයි. මා එකක් හෝ වෙනත් ලිවිය යුත්තේ ඇයි? මේවායින් කිසිවක් අතේ ගෙන යා නොහැකි / පොසික්ස් නොවේද?
මට ලිවිය හැකිය
VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
මට අවසාන ප්රති result ලය සියල්ලම එක හා සමානයි. මා එකක් හෝ වෙනත් ලිවිය යුත්තේ ඇයි? මේවායින් කිසිවක් අතේ ගෙන යා නොහැකි / පොසික්ස් නොවේද?
Answers:
VAR=$VAR1
හි සරල කළ අනුවාදයකි VAR=${VAR1}
. පළමුවැන්නාට කළ නොහැකි දේ දෙවනියට කළ හැකිය, නිදසුනක් ලෙස අරාව දර්ශකයක් (අතේ ගෙන යා නොහැකි) යොමු කිරීම හෝ උපස්ථරයක් ඉවත් කිරීම (POSIX-portable). POSIX පිරිවිතරයේ ආරම්භකයින් සහ පරාමිති පුළුල් කිරීම සඳහා වන Bash Guide හි තවත් විචල්යයන් කොටස බලන්න .
දී මෙන් විචල්ය පමණ මිල කැඳවීම් භාවිතා rm -- "$VAR1"
හෝ rm -- "${VAR}"
හොඳ අදහසක් වේ. මෙය විචල්යයේ අන්තර්ගතය පරමාණුක ඒකකයක් බවට පත් කරයි. විචල්ය අගයේ හිස් (හොඳයි, $IFS
විශේෂ විචල්යයේ අක්ෂර , පෙරනිමියෙන් හිස්) හෝ ඔබ එය උපුටා දක්වන්නේ නැත්නම්, සෑම වචනයක්ම ගොනු නාම උත්පාදනය (ග්ලෝබින්) සඳහා සලකා බලනු ලැබේ. කරනවා.
$ find .
.
./*r*
./-rf
./another
./filename
./spaced filename
./another spaced filename
./another spaced filename/x
$ var='spaced filename'
# usually, 'spaced filename' would come from the output of some command and you weren't expecting it
$ rm $var
rm: cannot remove 'spaced': No such file or directory
# oops! I just ran 'rm spaced filename'
$ var='*r*'
$ rm $var
# expands to: 'rm' '-rf' '*r*' 'another spaced filename'
$ find .
.
./another
./spaced filename
./another spaced filename
$ var='another spaced filename'
$ rm -- "$var"
$ find .
.
./another
./spaced filename
අතේ ගෙන යා හැකි ආකාරය මත: POSIX.1-2008 2.6.2 වගන්තියට අනුව , කැරලි වරහන් අත්යවශ්ය නොවේ.
var1=$var
ප්රසාරණය දෝෂයක් ලබා දෙන කවචයක් පිළිබඳ සැබෑ උදාහරණයක් ඔබට තිබේද ?
export VAR=$VAR1
. වරහන් සම්බන්ධයෙන් ගත් කල, ඒවා අත්යවශ්ය නොවේ (ඔබ සඳහන් කළ කොටසේ සිව්වන ඡේදය පරීක්ෂා කරන්න; සියලුම පෙර-පොසික්ස් සහ පොසික්ස් කවච වල තත්වය මෙයයි).
${VAR}
හා $VAR
හරියටම සමාන වේ. සරල විචල්ය ප්රසාරණයක් සඳහා, භාවිතා කිරීමට ඇති එකම හේතුව ${VAR}
විග්රහ කිරීම වෙනත් ආකාරයකින් විචල්ය නාමයට අක්ෂර විශාල ප්රමාණයක් උදුරා ගන්නා විටය ${VAR1}_$VAR2
(වරහන් නොමැතිව සමාන වේ ${VAR1_}$VAR2
). බොහෝ අලංකාර කරන ලද පුළුල් කිරීම් (${VAR:=default}
,, ${VAR#prefix}
…) වරහන් අවශ්ය වේ.
විචල්ය පැවරුමක දී, ක්ෂේත්ර බෙදීම (එනම් වටිනාකමින් යුත් අවකාශයේ බෙදීම) සහ මාර්ග නාම විස්තාරණය (එනම් ග්ලෝබින් කිරීම) නිවා දමනු ලැබේ, එබැවින් VAR=$VAR1
එය හරියටම VAR="$VAR1"
සියලු පොසික්ස් ෂෙල් වෙඩි හා මා අසා ඇති සියලුම පෙර-පොසික්ස් ෂී වලට සමාන වේ. . (POSIX ref: සරල විධාන ). එකම හේතුව නිසා, VAR=*
විශ්වසනීයව VAR
වචනාර්ථයට ගැලපේ *
; ඇත්තෙන්ම VAR=a b
කට්ටල VAR
කිරීමට a
පටන් b
ප්රථම ස්ථානය වෙනම වචනයක්. පොදුවේ ගත් කල, ෂෙල් සින්ටැක්ස් එක වචනයක් අපේක්ෂා කරන තැන ද්විත්ව උපුටා දැක්වීම් අනවශ්යය, උදාහරණයක් ලෙසcase … in
(නමුත් රටාව තුළ නොවේ), නමුත් එහි දී පවා ඔබ ප්රවේශම් විය යුතුය: උදාහරණයක් ලෙස පොසික්ස් එය නියම කරයියළි-යොමුවීම් ඉලක්ක (වඩාත් ගැඹුරු විශ්ලේෂණයක් සඳහා.>$filename
) ස්ක්රිප්ට් වල උපුටා දැක්වීම අවශ්ය නොවේ, නමුත් බෑෂ් ඇතුළු ෂෙල් වෙඩි කිහිපයකට ස්ක්රිප්ට් වල පවා ද්විත්ව උපුටා දැක්වීම් අවශ්ය වේ. බලන්න අවශ්ය ද්විත්ව උපුටා දක්වමින් විට?
වෙනත් අවස්ථාවන්හිදී ඔබට ද්විත්ව මිල ගණන් අවශ්ය වේ, විශේෂයෙන් export VAR="${VAR1}"
(සමානව ලිවිය හැකි export "VAR=${VAR1}"
) බොහෝ ෂෙල් වෙඩි වල (POSIX මෙම නඩුව විවෘතව තබයි). සරල පැවරුම් සමඟ මෙම නඩුවේ සමානතාවය සහ ඔබට ද්විත්ව මිල ගණන් අවශ්ය නොවන අවස්ථා ලැයිස්තුවේ විසිරී ඇති ස්වභාවය, ඔබට බෙදීමට හා ග්ලෝබ් කිරීමට අවශ්ය නම් මිස ද්විත්ව මිල ගණන් භාවිතා කිරීමට මම නිර්දේශ කරන්නේ ඇයි.
IFS
පුරුද්දක් ලෙස සිටීමට අවශ්ය නිසා වටිනාකමෙහි කිසිදු අක්ෂරයක් අඩංගු නොවන බව මා දැන සිටියත් මම සෑම විටම විචල්ය ප්රසාරණයන් උපුටා දක්වන්නෙමි. එක් ව්යතිරේකය නම් විචල්ය පැවරුමක් සිදු කිරීමේදී මම අගය උපුටා දක්වන්නේ නැත (අවශ්ය නොවන්නේ නම්, අගයේ ඉඩක් ඇති විට වැනි). වැනි විධාන ආදේශක ඇති විට සංස්කාරක සින්ටැක්ස් ඉස්මතු කිරීම වඩාත් ප්රයෝජනවත් වේ FOO=$(BAR=$(BAZ=blah; printf %s "${BAZ}"); printf %s "${BAR}")
. සෑම දෙයක්ම "නූල්" වර්ණය වර්ණ ගැන්වීම වෙනුවට, මට කැදැලි කේතය සින්ටැක්ස් ඉස්මතු කරයි. මම බැක්ටික්ස් වළක්වා ගන්නේ මේ නිසාය.
>$file
POSIX ස්ක්රිප්ට් වල හරි වුවත් , අන්තර්ක්රියාකාරී නොවන විට පවා එය කඩාවැටෙන්නේ නැත (POSIX අනුකූලතාවය බලාත්මක කරන්නේ නම් $POSIXLY_CORRECT
හෝ --posix
...).
VAR=$VAR1
, සමහර විට මා පුදුමයට පත් කර ඇති අතර local VAR=$VAR1
, සමහර ආකාරවලින්, අවම වශයෙන් සමහර ෂෙල් වෙඩි වලින් වෙනස් ආකාරයකින් වැඩ කිරීම මට මතකයි. නමුත් atm, මට අපසරනය ප්රතිනිෂ්පාදනය කළ නොහැක.
local VAR=$VAR1
හරියට export VAR=$VAR1
ෂෙල් එක මත රඳා පවතී.
විචල්ය ප්රසාරණය සඳහා ද්විත්ව උපුටා දැක්වීම භාවිතා කරන බව සලකන්න, සහ ශක්තිමත්-උපුටා දැක්වීම් සඳහා තනි උපුටා දැක්වීමක් භාවිතා කරයි, එනම් සැන්ස් ප්රසාරණය.
this='foo'
that='bar'
these="$this"
those='$that'
for item in "$this" "$that" "$these" "$those"; do echo "$item"; done
foo
bar
foo
$that
හේතු කිහිපයක් නිසා හැකි සෑම තැනකම ඔබ උපුටා දැක්වීම් භාවිතා කළ යුතු බව සඳහන් කිරීම වටී. ඒවායින් හොඳම ඒවා අතර එය හොඳම භාවිතයක් ලෙස සහ කියවීමේ හැකියාව සඳහා ය. සමහර විට බාෂ් විචක්ෂණශීලී වන අතර බොහෝ විට තර්කානුකූල නොවන හෝ අසාධාරණ / අනපේක්ෂිත ආකාරයන් නිසා, සහ උපුටා දැක්වීම් වෙනස් කිරීම සඳහා ඇඟවුම් අපේක්ෂාවන් පැහැදිලි කරයි, එමඟින් එම දෝෂ මතුපිට අඩු කරයි (හෝ එහි විභවය).
උපුටා දැක්වීම නොකිරීම සම්පූර්ණයෙන්ම නීත්යානුකූල වන අතර බොහෝ අවස්ථාවන්හිදී එය ක්රියාත්මක වනු ඇත, එම ක්රියාකාරිත්වය පහසුව සඳහා සපයා ඇති අතර එය අතේ ගෙන යා හැකි තරම් අඩුය. අභිප්රාය සහ අපේක්ෂාව පිළිබිඹු කිරීම සඳහා සහතික කර ඇති පූර්ණ විධිමත් පුහුණුව උපුටා දැක්වීමකි.
"${somevar}"
ආදේශන මෙහෙයුම් සඳහා ඉදිකිරීම් භාවිතා කරන බව දැන් සලකා බලන්න . ප්රතිස්ථාපනය සහ අරා වැනි භාවිත අවස්ථා කිහිපයක්.
thisfile='foobar.txt.bak'
foo="${thisfile%.*}" # removes shortest part of value in $thisfile matching after '%' from righthand side
bar="${thisfile%%.*}" # removes longest matching
for item in "$foo" "$bar"; do echo "$item"; done
foobar.txt
foobar
foobar='Simplest, least effective, least powerful'
# ${var/find/replace_with}
foo="${foobar/least/most}" #single occurrence
bar="${foobar//least/most}" #global occurrence (all)
for item in "$foobar" "$foo" "$bar"; do echo "$item"; done
Simplest, least effective, least powerful
Simplest, most effective, least powerful
Simplest, most effective, most powerful
mkdir temp
# create files foo.txt, bar.txt, foobar.txt in temp folder
touch temp/{foo,bar,foobar}.txt
# alpha is array of output from ls
alpha=($(ls temp/*))
echo "$alpha" # temp/foo.txt
echo "${alpha}" # temp/foo.txt
echo "${alpha[@]}" # temp/bar.txt temp/foobar.txt temp/foo.txt
echo "${#alpha}" # 12 # length of first element (implicit index [0])
echo "${#alpha[@]}" # 3 # number of elements
echo "${alpha[1]}" # temp/foobar.txt # second element
echo "${#alpha[1])" # 15 # length of second element
for item in "${alpha[@]}"; do echo "$item"; done
temp/bar.txt
temp/foobar.txt
temp/foo.txt
මේ සියල්ලම "${var}"
ආදේශක ඉදිකිරීමේ මතුපිට සීරීමට ලක් නොවේ . Bash shell ස්ක්රිප්ටින් සඳහා නියත යොමු කිරීම වන්නේ TLDP ලිනක්ස් ප්රලේඛන ව්යාපෘතියයිhttps://www.tldp.org/LDP/abs/html/parameter-substitution.html
ls -la
lrwxrwxrwx. 1 root root 31 Nov 17 13:13 prodhostname
lrwxrwxrwx. 1 root root 33 Nov 17 13:13 testhostname
lrwxrwxrwx. 1 root root 32 Nov 17 13:13 justname
පසුව අවසන් කරන්න:
env=$1
if [ ! -f /dirname/${env}hostname ]
වක්රාකාරව භාවිතා කිරීම පිළිබඳ පැහැදිලි උදාහරණයක් ලෙස සඳහන් කිරීම වටී