ലിനക്സ് ഷെൽ സ്ക്രിപ്റ്റിംഗിൽ അറേകൾക്കൊപ്പം പ്രവർത്തിക്കുന്നു - ഭാഗം 8
അറേകൾ എന്ന ആശയമില്ലാതെ ഒരു പ്രോഗ്രാമിംഗ് ഭാഷ നമുക്ക് സങ്കൽപ്പിക്കാൻ കഴിയില്ല. വിവിധ ഭാഷകൾക്കിടയിൽ അവ എങ്ങനെ നടപ്പിലാക്കുന്നു എന്നത് പ്രശ്നമല്ല. പകരം ഒരു പ്രതീകാത്മക നാമത്തിൽ സമാനമോ വ്യത്യസ്തമോ ആയ ഡാറ്റ ഏകീകരിക്കാൻ അറേകൾ ഞങ്ങളെ സഹായിക്കുന്നു.
ഇവിടെ ഷെൽ സ്uക്രിപ്റ്റിംഗിനെക്കുറിച്ച് ഞങ്ങൾക്ക് ആശങ്കയുണ്ട്, ഈ അറേകളുടെ ആശയം ഉപയോഗിക്കുന്ന ചില ഷെൽ സ്uക്രിപ്റ്റുകൾ ഉപയോഗിച്ച് കളിക്കാൻ ഈ ലേഖനം നിങ്ങളെ സഹായിക്കും.
അറേ ഇനീഷ്യലൈസേഷനും ഉപയോഗവും
ബാഷിന്റെ പുതിയ പതിപ്പുകൾക്കൊപ്പം, ഇത് ഏകമാന ശ്രേണികളെ പിന്തുണയ്ക്കുന്നു. ഷെൽ-ബിൽറ്റിൻ declare വഴി ഒരു അറേ വ്യക്തമായി പ്രഖ്യാപിക്കാൻ കഴിയും.
declare -a var
എന്നാൽ മുകളിൽ പറഞ്ഞതുപോലെ അറേ വേരിയബിളുകൾ പ്രഖ്യാപിക്കേണ്ട ആവശ്യമില്ല. ഇനിപ്പറയുന്ന രീതിയിൽ നേരിട്ട് അറേ ചെയ്യാൻ നമുക്ക് വ്യക്തിഗത ഘടകങ്ങൾ ചേർക്കാം.
var[XX]=<value>
ഇവിടെ 'XX' എന്നത് അറേ സൂചികയെ സൂചിപ്പിക്കുന്നു. അറേ എലമെന്റുകൾ പരിഗണിക്കുന്നതിന് ചുരുണ്ട ബ്രാക്കറ്റ് വാക്യഘടന ഉപയോഗിക്കുക, അതായത്.
${var[XX]}
ശ്രദ്ധിക്കുക: അറേ ഇൻഡക്uസിംഗ് എപ്പോഴും 0-ൽ ആരംഭിക്കുന്നു.
ഒരു മുഴുവൻ ശ്രേണിയും സമാരംഭിക്കുന്നതിനുള്ള മറ്റൊരു സൗകര്യപ്രദമായ മാർഗ്ഗം ചുവടെ കാണിച്ചിരിക്കുന്നതുപോലെ ഒരു ജോടി പരാന്തീസിസ് ഉപയോഗിച്ചാണ്.
var=( element1 element2 element3 . . . elementN )
അറേകൾക്ക് മൂല്യങ്ങൾ നൽകുന്നതിന് മറ്റൊരു മാർഗമുണ്ട്. ഈ ഇനീഷ്യലൈസേഷൻ വഴി മുമ്പ് വിശദീകരിച്ച രീതിയുടെ ഒരു ഉപവിഭാഗമാണ്.
array=( [XX]=<value> [XX]=<value> . . . )
നിർവ്വഹണ സമയത്ത് read shell-builtin ഉപയോഗിച്ച് നമുക്ക് മൂല്യങ്ങൾ അറേയിലേക്ക് വായിക്കാനും നിയോഗിക്കാനും കഴിയും.
read -a array
ഇപ്പോൾ ഒരു സ്ക്രിപ്റ്റിനുള്ളിൽ മുകളിലുള്ള പ്രസ്താവന നടപ്പിലാക്കുമ്പോൾ, അത് കുറച്ച് ഇൻപുട്ടിനായി കാത്തിരിക്കുന്നു. സ്പെയ്സ് കൊണ്ട് വേർതിരിച്ച അറേ ഘടകങ്ങൾ ഞങ്ങൾ നൽകേണ്ടതുണ്ട് (അല്ലാതെ ക്യാരേജ് റിട്ടേൺ അല്ല). മൂല്യങ്ങൾ നൽകിയ ശേഷം അവസാനിപ്പിക്കാൻ എന്റർ അമർത്തുക.
അറേ എലമെന്റുകളിലൂടെ സഞ്ചരിക്കാൻ നമുക്ക് ലൂപ്പിനും ഉപയോഗിക്കാം.
for i in “${array[@]}” do #access each element as $i. . . done
ഇനിപ്പറയുന്ന സ്ക്രിപ്റ്റ് ഈ പ്രത്യേക വിഭാഗത്തിന്റെ ഉള്ളടക്കങ്ങൾ സംഗ്രഹിക്കുന്നു.
#!/bin/bash array1[0]=one array1[1]=1 echo ${array1[0]} echo ${array1[1]} array2=( one two three ) echo ${array2[0]} echo ${array2[2]} array3=( [9]=nine [11]=11 ) echo ${array3[9]} echo ${array3[11]} read -a array4 for i in "${array4[@]}" do echo $i done exit 0
സ്റ്റാൻഡേർഡ് സ്ട്രിംഗ് ഓപ്പറേഷനുകളിൽ പലതും അറേകളിൽ പ്രവർത്തിക്കുന്നു. അറേകളിൽ (സ്ട്രിംഗ് ഓപ്പറേഷനുകൾ ഉൾപ്പെടെ) ചില പ്രവർത്തനങ്ങൾ നടപ്പിലാക്കുന്ന ഇനിപ്പറയുന്ന സാമ്പിൾ സ്ക്രിപ്റ്റ് നോക്കുക.
#!/bin/bash array=( apple bat cat dog elephant frog ) #print first element echo ${array[0]} echo ${array:0} #display all elements echo ${array[@]} echo ${array[@]:0} #display all elements except first one echo ${array[@]:1} #display elements in a range echo ${array[@]:1:4} #length of first element echo ${#array[0]} echo ${#array} #number of elements echo ${#array[*]} echo ${#array[@]} #replacing substring echo ${array[@]//a/A} exit 0
മുകളിലെ സ്ക്രിപ്റ്റ് എക്സിക്യൂട്ട് ചെയ്യുമ്പോൾ ലഭിക്കുന്ന ഔട്ട്പുട്ട് താഴെ കൊടുക്കുന്നു.
apple apple apple bat cat dog elephant frog apple bat cat dog elephant frog bat cat dog elephant frog bat cat dog elephant 5 5 6 6 Apple bAt cAt dog elephAnt frog
മേൽപ്പറഞ്ഞ സ്uക്രിപ്റ്റ് സ്വയം വിശദീകരിക്കുന്നതിനാൽ വിശദമായി വിശദീകരിക്കുന്നതിൽ അർത്ഥമില്ലെന്ന് ഞാൻ കരുതുന്നു. ആവശ്യമെങ്കിൽ ഞാൻ ഈ പരമ്പരയിലെ ഒരു ഭാഗം സ്ട്രിംഗ് കൃത്രിമത്വത്തിന് മാത്രമായി സമർപ്പിക്കും.
കമാൻഡ് സബ്സ്റ്റിറ്റ്യൂഷൻ ഒരു കമാൻഡിന്റെയോ ഒന്നിലധികം കമാൻഡുകളുടെയോ ഔട്ട്പുട്ട് മറ്റൊരു സന്ദർഭത്തിലേക്ക് അസൈൻ ചെയ്യുന്നു. ഇവിടെ അറേകളുടെ ഈ സന്ദർഭത്തിൽ നമുക്ക് കമാൻഡുകളുടെ ഔട്ട്പുട്ട് അറേകളുടെ വ്യക്തിഗത ഘടകങ്ങളായി ചേർക്കാം. വാക്യഘടന ഇപ്രകാരമാണ്.
array=( $(command) )
സ്വതവേ, വൈറ്റ് സ്uപെയ്uസുകളാൽ വേർതിരിച്ച കമാൻഡിന്റെ ഔട്ട്uപുട്ടിലെ ഉള്ളടക്കങ്ങൾ വ്യക്തിഗത ഘടകങ്ങളായി അറേയിലേക്ക് പ്ലഗ് ചെയ്uതിരിക്കുന്നു. ഇനിപ്പറയുന്ന സ്ക്രിപ്റ്റ് ഒരു ഡയറക്ടറിയുടെ ഉള്ളടക്കങ്ങൾ പട്ടികപ്പെടുത്തുന്നു, അവ 755 അനുമതികളുള്ള ഫയലുകളാണ്.
#!/bin/bash ERR=27 EXT=0 if [ $# -ne 1 ]; then echo "Usage: $0 <path>" exit $ERR fi if [ ! -d $1 ]; then echo "Directory $1 doesn't exists" exit $ERR fi temp=( $(find $1 -maxdepth 1 -type f) ) for i in "${temp[@]}" do perm=$(ls -l $i) if [ `expr ${perm:0:10} : "-rwxr-xr-x"` -eq 10 ]; then echo ${i##*/} fi done exit $EXT
1-ഡൈമൻഷണൽ അറേ ഉപയോഗിച്ച് നമുക്ക് ഒരു 2-ഡൈമൻഷണൽ മാട്രിക്സ് എളുപ്പത്തിൽ പ്രതിനിധീകരിക്കാൻ കഴിയും. വരി പ്രധാന ക്രമത്തിൽ ഒരു മാട്രിക്സിന്റെ ഓരോ വരിയിലെയും പ്രാതിനിധ്യ ഘടകങ്ങൾ ക്രമാനുഗതമായ രീതിയിൽ അറേ സൂചികകളിൽ ക്രമാനുഗതമായി സംഭരിക്കുന്നു. ഒരു mXn മാട്രിക്സിനായി, അതിനുള്ള ഫോർമുല ഇങ്ങനെ എഴുതാം.
matrix[i][j]=array[n*i+j]
2 മെട്രിക്സ് ചേർക്കുന്നതിനും ഫലമായുണ്ടാകുന്ന മാട്രിക്സ് പ്രിന്റ് ചെയ്യുന്നതിനും മറ്റൊരു മാതൃക സ്ക്രിപ്റ്റ് നോക്കുക.
#!/bin/bash read -p "Enter the matrix order [mxn] : " t m=${t:0:1} n=${t:2:1} echo "Enter the elements for first matrix" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do read x[$(($n*$i+$j))] done done echo "Enter the elements for second matrix" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do read y[$(($n*$i+$j))] z[$(($n*$i+$j))]=$((${x[$(($n*$i+$j))]}+${y[$(($n*$i+$j))]})) done done echo "Matrix after addition is" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do echo -ne "${z[$(($n*$i+$j))]}\t" done echo -e "\n" done exit 0
ഷെൽ സ്ക്രിപ്റ്റിംഗിനുള്ളിൽ അറേകൾ നടപ്പിലാക്കുന്നതിന് പരിമിതികൾ ഉണ്ടെങ്കിലും, ഒരുപിടി സാഹചര്യങ്ങളിൽ ഇത് ഉപയോഗപ്രദമാകും, പ്രത്യേകിച്ചും കമാൻഡ് സബ്സ്റ്റിറ്റ്യൂഷൻ ഉപയോഗിച്ച് നമ്മൾ കൈകാര്യം ചെയ്യുമ്പോൾ. ഒരു അഡ്മിനിസ്ട്രേറ്റീവ് വീക്ഷണകോണിൽ നിന്ന് നോക്കുമ്പോൾ, അറേകൾ എന്ന ആശയം ഗ്നു/ലിനക്സ് സിസ്റ്റങ്ങളിൽ നിരവധി പശ്ചാത്തല സ്ക്രിപ്റ്റുകൾ വികസിപ്പിക്കുന്നതിന് വഴിയൊരുക്കി.