$ VAR එදිරිව $ AR VAR} සහ උපුටා දැක්වීමට හෝ නොකිරීමට


154

මට ලිවිය හැකිය

VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"

මට අවසාන ප්‍රති result ලය සියල්ලම එක හා සමානයි. මා එකක් හෝ වෙනත් ලිවිය යුත්තේ ඇයි? මේවායින් කිසිවක් අතේ ගෙන යා නොහැකි / පොසික්ස් නොවේද?

Answers:


112

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 වගන්තියට අනුව , කැරලි වරහන් අත්‍යවශ්‍ය නොවේ.


අතේ ගෙන යා හැකි දේ ගැන මට කුතුහලයක් ඇති නිසා ෂෝන් මගේ ප්‍රශ්නය යාවත්කාලීන කළේය
xenoterracide

ෂෝන්: ඔබේ ආදර්ශය වලංගු යැයි මට සැකයි. var1=$varප්‍රසාරණය දෝෂයක් ලබා දෙන කවචයක් පිළිබඳ සැබෑ උදාහරණයක් ඔබට තිබේද ?
ඇලෙක්ස්

@alex: ස්තූතියි. මම හිතුවේ මම එය විධාන රේඛාවෙන් පරීක්ෂා කර ඇති නමුත් මම එය වැරදියි. මම ආදර්ශය වෙනස් කළා.
ෂෝන් ජේ. ගොෆ්

යාවත්කාලීන කළ උදාහරණය සමඟ සාමාන්‍යයෙන් උපුටා දැක්වූ අනුවාදය ඔබට අවශ්‍ය බව මතක තබා ගැනීම වඩා හොඳය.
ඇලෙක්ස්

9
Ha ෂෝන්: පැවරුමකදී උපුටා දැක්වීම් අවශ්‍ය නොවේ . ඒවා ඇතුළුව වෙනත් බොහෝ භාවිතයන් සඳහා ඒවා අවශ්‍ය වේ export VAR=$VAR1. වරහන් සම්බන්ධයෙන් ගත් කල, ඒවා අත්‍යවශ්‍ය නොවේ (ඔබ සඳහන් කළ කොටසේ සිව්වන ඡේදය පරීක්ෂා කරන්න; සියලුම පෙර-පොසික්ස් සහ පොසික්ස් කවච වල තත්වය මෙයයි).
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

65

${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 මෙම නඩුව විවෘතව තබයි). සරල පැවරුම් සමඟ මෙම නඩුවේ සමානතාවය සහ ඔබට ද්විත්ව මිල ගණන් අවශ්‍ය නොවන අවස්ථා ලැයිස්තුවේ විසිරී ඇති ස්වභාවය, ඔබට බෙදීමට හා ග්ලෝබ් කිරීමට අවශ්‍ය නම් මිස ද්විත්ව මිල ගණන් භාවිතා කිරීමට මම නිර්දේශ කරන්නේ ඇයි.


3
සාමාන්‍ය රීතියක් ලෙස, IFSපුරුද්දක් ලෙස සිටීමට අවශ්‍ය නිසා වටිනාකමෙහි කිසිදු අක්ෂරයක් අඩංගු නොවන බව මා දැන සිටියත් මම සෑම විටම විචල්‍ය ප්‍රසාරණයන් උපුටා දක්වන්නෙමි. එක් ව්‍යතිරේකය නම් විචල්‍ය පැවරුමක් සිදු කිරීමේදී මම අගය උපුටා දක්වන්නේ නැත (අවශ්‍ය නොවන්නේ නම්, අගයේ ඉඩක් ඇති විට වැනි). වැනි විධාන ආදේශක ඇති විට සංස්කාරක සින්ටැක්ස් ඉස්මතු කිරීම වඩාත් ප්‍රයෝජනවත් වේ FOO=$(BAR=$(BAZ=blah; printf %s "${BAZ}"); printf %s "${BAR}"). සෑම දෙයක්ම "නූල්" වර්ණය වර්ණ ගැන්වීම වෙනුවට, මට කැදැලි කේතය සින්ටැක්ස් ඉස්මතු කරයි. මම බැක්ටික්ස් වළක්වා ගන්නේ මේ නිසාය.
රිචඩ් හැන්සන්

>$filePOSIX ස්ක්‍රිප්ට් වල හරි වුවත් , අන්තර්ක්‍රියාකාරී නොවන විට පවා එය කඩාවැටෙන්නේ නැත (POSIX අනුකූලතාවය බලාත්මක කරන්නේ නම් $POSIXLY_CORRECTහෝ --posix...).
ස්ටෙෆාන් චසෙලාස්

උපුටා දැක්වීම් අවශ්‍ය නොවන බව සත්‍යයක් වුවත් VAR=$VAR1, සමහර විට මා පුදුමයට පත් කර ඇති අතර local VAR=$VAR1, සමහර ආකාරවලින්, අවම වශයෙන් සමහර ෂෙල් වෙඩි වලින් වෙනස් ආකාරයකින් වැඩ කිරීම මට මතකයි. නමුත් atm, මට අපසරනය ප්‍රතිනිෂ්පාදනය කළ නොහැක.
dubiousjim

හරි, මට මතක ඇති ප්‍රශ්නය හමු විය . එය පෙන්වන්නේ සමහර කවච වල පමණි.
dubiousjim

@dubiousjim local VAR=$VAR1හරියට export VAR=$VAR1ෂෙල් එක මත රඳා පවතී.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

9

උපුටා දැක්වීම

විචල්ය ප්‍රසාරණය සඳහා ද්විත්ව උපුටා දැක්වීම භාවිතා කරන බව සලකන්න, සහ ශක්තිමත්-උපුටා දැක්වීම් සඳහා තනි උපුටා දැක්වීමක් භාවිතා කරයි, එනම් සැන්ස් ප්‍රසාරණය.

පුළුල් කිරීම:

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


2
ඉතා තොරතුරු.
orion elenzil

0
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 ]

වක්‍රාකාරව භාවිතා කිරීම පිළිබඳ පැහැදිලි උදාහරණයක් ලෙස සඳහන් කිරීම වටී

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.