1

Bash Quick Reference

 2 years ago
source link: https://oopsmonk.github.io/posts/2014-12-04-bashquickref/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Bash Quick Reference

December 4, 2014 · 3 min · oopsmonk | Suggest Changes

Advanced Bash-Scripting Guide
sed
awk

Internal Variables#

#current parent pid
$$
#last background process pid
$!
#last exit status
$?
#current instance pid, Bash 4.x above.
$BASHPID

Arithmetic Expansion#

a=12
b=$(($a + 10))

b=`expr $a + 1`
b=$(expr $a + 1)

let b=$a+3
#let b=$a + 3 #incorrect 
let "b = $a + 3"

declare -i b=$a+$a

Manipulating Strings#

  • String is a number
if [[ $var =~ ^-?[0-9]+$ ]]; then
    echo "$var is a number"
fi

if [[ ! $var =~ ^-?[0-9]+$ ]]; then
    echo "$var is not a number"
fi
  • Find String between two words or characters
var="Hello there are (123340) and (123)"
#last string between '(' and ')'.
substr=$( echo $var | sed 's/.*(\(.*\)).*/\1/' )
#String between '(' and ')'.
substr=$( echo $var | awk -v FS="(\(|\))" '{print $2 " " $4}' )

#String between 'there' and 'and'.
substr=$( echo $var | awk -v FS="(there|and)" '{print $2}' )
#String between 'there' and 'and'.
substr=$( echo $var | sed 's/.*there\(.*\)and.*/\1/' )
#String between 'there' and 'and'.
substr=$( echo $var | grep -o -P '(?<=there).*(?=and)' )

Loop#

  • read variables
#read from file
echo "123, abc, hello world!" > /tmp/test
echo "12 43, ddd, !" >> /tmp/test

while IFS=',' read var1 var2 var3
do
    echo "var1=$var1 var2=$var2 var3=$var3"
done < "/tmp/test"


#read from variable
x="one, two, three"
while IFS=',' read var1 var2 var3
do
    echo "var1=$var1 var2=$var2 var3=$var3"
done <<< $x
  • iterate IP address
#iterate class C ip address
for i in 192.168.100.{1..10}
do
    echo "$i"
done

#iterate class B ip address
for x in 192.168.{1..5}
do
    for i in $x.{1..10}
    do
        echo "$i"
    done
done
  • infinite while loop
while :
do
    echo "infinite loops [ CTRL+C to stop]" 
    sleep 5
done

Array#


# Simple array
arrayA=( Mon Tue Wed Thu Fri Sat Sun )
echo "${!arrayA[*]}"    # 0 1 2 3 4 5 6
echo "${#arrayA[*]}"    # 7
echo "${arrayA[*]}"     # Mon Tue Wed Thu Fri Sat Sun

echo "${!arrayA[@]}"    # 0 1 2 3 4 5 6
echo "${#arrayA[@]}"    # 7
echo "${arrayA[@]}"     # Mon Tue Wed Thu Fri Sat Sun

echo "${arrayA[2]}"     # Wed
echo "$arrayA"          # Mon
echo "${arrayA[20]}"    # null 

arrayA=( one two )
echo "${arrayA[*]}"     # one two
arrayA+=( three "four" )
echo "${arrayA[*]}"     # one two three four

# Key/Value 
declare -A arrayB=( ["Mon"]="Monday" ["Tue"]="Tuesday" 
["Wed"]="Wednesday" ["Thu"]="Thursday" ["Fri"]="Friday" 
["Sat"]="Saturday" ["Sun"]="Sunday" )

echo "${!arrayB[*]}"    # Thu Tue Wed Mon Fri Sat Sun
echo "${#arrayB[*]}"    # 7
echo "${arrayB[*]}"     # Thursday Tuesday Wednesday Monday Friday Saturday Sunday

echo "${!arrayB[@]}"    # Thu Tue Wed Mon Fri Sat Sun
echo "${#arrayB[@]}"    # 7
echo "${arrayB[@]}"     # Thursday Tuesday Wednesday Monday Friday Saturday Sunday

echo "${arrayB[2]}"     # null
echo "$arrayB"          # null
echo "${arrayB["Tue"]}" # Tuesday

declare -A arrayB=( ["one"]=1 ["two"]="2" )
echo "${!arrayB[*]}"    # one two
echo "${arrayB[*]}"     # 1 2
arrayB+=( ["three"]="3" ["four"]=4 )
echo "${!arrayB[*]}"    # four one two three
echo "${arrayB[*]}"     # 4 1 2 3

arrayB+=( ["four"]="aa" ["five"]="5a1c" )
echo "${!arrayB[*]}"    # four one five two three
echo "${arrayB[*]}"     # 4aa 1 5a1c 2 3

I/O redirection#

Forking Processes#


pid_perfix="/tmp/proc-"

function doSomething(){
    local pid_file="$pid_perfix$BASHPID"
    echo "this is task $1 : $pid_file " > $pid_file
    sleep 5
}

w_pid=""
for task in {1..5}
do
    doSomething $task &
    w_pid+="$! "
    sleep 1
done

for p in $w_pid
do
    wait $p
done

#clean up
for p in $w_pid
do
    #del pid file 
    rm "$pid_perfix$p"
done

exit 0

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK