Mandalika's scratchpad [ Work blog @Oracle | My Music Compositions ]

Old Posts: 09.04  10.04  11.04  12.04  01.05  02.05  03.05  04.05  05.05  06.05  07.05  08.05  09.05  10.05  11.05  12.05  01.06  02.06  03.06  04.06  05.06  06.06  07.06  08.06  09.06  10.06  11.06  12.06  01.07  02.07  03.07  04.07  05.07  06.07  08.07  09.07  10.07  11.07  12.07  01.08  02.08  03.08  04.08  05.08  06.08  07.08  08.08  09.08  10.08  11.08  12.08  01.09  02.09  03.09  04.09  05.09  06.09  07.09  08.09  09.09  10.09  11.09  12.09  01.10  02.10  03.10  04.10  05.10  06.10  07.10  08.10  09.10  10.10  11.10  12.10  01.11  02.11  03.11  04.11  05.11  07.11  08.11  09.11  10.11  11.11  12.11  01.12  02.12  03.12  04.12  05.12  06.12  07.12  08.12  09.12  10.12  11.12  12.12  01.13  02.13  03.13  04.13  05.13  06.13  07.13  08.13  09.13  10.13  11.13  12.13  01.14  02.14  03.14  04.14  05.14  06.14  07.14  09.14  10.14  11.14  12.14  01.15  02.15  03.15  04.15  06.15  09.15  12.15  01.16  03.16  04.16  05.16  06.16  07.16  08.16  09.16  12.16  01.17  02.17  03.17  04.17  06.17  07.17  08.17  09.17  10.17  12.17  01.18  02.18  03.18  04.18  05.18  06.18  07.18  08.18  09.18  11.18  12.18  01.19  02.19  05.19  06.19  08.19  10.19  11.19  05.20  10.20  11.20  12.20  09.21  11.21  12.22 


Saturday, November 30, 2019
 
Shell Scripting: Tidbits #2

Shell Scripting Tidbits: #1

Extracting the filename and extension from an absolute path

eg.,

Input: abspath="/var/tmp/localuserinfo.out"

Filename with extension:

$ basename ${abspath}
localuserinfo.out

Extension:

$ basename ${abspath##*.}
        -OR-
$ echo ${abspath##*.}
out

${variable##pattern} trims the longest match from the beginning of a string. Likewise ${variable#pattern} trims the shortest match from the beginning of a string.

Filename without extension:

$ basename ${abspath%.*}
localuserinfo

${variable%pattern} trims the shortest match from the end of a string. Similarly ${variable%%pattern} trims the longest match from the end of a string.

Ref:

Replacing commas with white space in a string

eg.,

Input: dummystr="Python,C,Java"

To replace all matches:

$ echo ${dummystr//,/ }
Python C Java

To replace only the first match:

$ echo ${dummystr/,/ }
Python C,Java

The difference is the extra '/' in pattern in first expression. If pattern begins with '/', all matches of pattern are replaced with string. Otherwise, only the first match is replaced.

Ref: Bash Reference Manual -> Shell Parameter Expansion -> ${parameter/pattern/string}

Sending array as argument to a shell function

Expand array before passing as argument to a function in a shell script. Sending the array name only passes the first element of the array.

Since $@ holds all arguments passed to the function, access the array argument with the help of $@ in the function definition. Using variables $1, $2, .., $n gives access to individual elements in the array.

eg.,
$ cat numbers.sh 

#!/bin/bash

# print_array() .. prints all elements as expected
function print_array() {
 int_array=("$@")
 for elem in "${int_array[@]}"
 do
  echo $elem
 done
}

# print_array2() .. prints only one element .. first one in the array
function print_array2() {
 int_array=($1)
 for elem in "${int_array[@]}"
 do
  echo $elem
 done
}

numbers=(1 2 3 4)
echo "Attempting to print numbers array .."
print_array ${numbers[@]}
echo
echo "Attempt #2 with a different function .."
print_array2 ${numbers[@]}
echo
echo "Attempt #3 with only the array name as argument to print_array function .."
# following call prints only the first element of the array
print_array ${numbers}

$ ./numbers.sh 
Attempting to print numbers array ..
1
2
3
4

Attempt #2 with a different function ..
1

Attempt #3 with only the array name as argument to print_array function ..
1

Labels:





2004-2019 

This page is powered by Blogger. Isn't yours?