| 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
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:
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}
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.
$ 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: Shell Scripting Tips UNIX Linux
| 2004-2019 |