notes

${} 和 $[]

$[expression] can calculate easily.
${expression} can tell us the value of a element in array.

eg

val1=23
val2=24
echo $val1+$val2
echo $[$val1+$val2]        #it is equal to `echo $(( $val1+$val2 )`

[[email protected] workspace]$ ./incalc.sh 
23+24
47

assign values to array.

array=(`echo {1..10}`)
echo ${array[0]}" "${array[9]}

[[email protected] workspace]$ ./array.sh 
1 10

evolve:

array=( {1..10} )
echo ${array[0]}" "${array[9]}

[[email protected] workspace]$ ./array.sh 
1 0

for loop with C style in bash shell

# bash 风格
for i in {1..10} ; do
    echo -n $i 
done
echo

# The Loop With C Style
for (( i=1;i<=10;i++)){
    echo -n $i 
}
echo 

[[email protected] workspace]$ ./Cstyle.sh 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10

the evolution comes from (( )) and { }

for {}

it can shorten command line.
cp f1.{txt,bp} # equal to cp f1.txt f1.bp
new build and edit three files:file1, file2 and file3
vim -O file.{1,2,3}

the connection effect of backslash

follow codes can show backslash’s connection effect.

[[email protected] fileDir]$ echo {a,b,c} :{1,2}
a b c :1 :2
[[email protected] fileDir]$ echo {a,b,c}:{1,2}
a:1 a:2 b:1 b:2 c:1 c:2
[[email protected] fileDir]$ echo {a,b,c}{1,2}
a{1,2} b{1,2} c{1,2}
[[email protected] fileDir]$ echo {a,b,c}.{1,2}
a.1 a.2 b.1 b.2 c.1 c.2
[[email protected] fileDir]$ echo {a,b,c}.{txt,pdf}
a.txt a.pdf b.txt b.pdf c.txt c.pdf
touch `echo {a,b,c}.{txt,pdf}`

create new files we want instantly.
a.pdf a.txt b.pdf b.txt c.pdf c.txt

for (( ))

(( )) allow us to write C style operations. such as, (( val++ )), (( val = $1>$2?$1:$2 ))

Practice

count the number of files. (and got executing time.)

#! /bin/bash
start=`date +%s`
FILE=0
for file in /usr/*;do
FILE=`expr $FILE + 1`;
done
echo "/usr: "$FILE

FILE=0
for file in /usr/bin/*; do
FILE=`expr $FILE + 1`;
done
echo "/usr/bin: "$FILE

FILE=0
for file in /{,usr/}bin/*; do
FILE=`expr $FILE + 1`;
done
echo "{usr}/bin: "$FILE
end=`date +%s`
interval=`expr $end - $start`
echo $interval

————————————————————————————————————————

/usr: 12
/usr/bin: 1764
{usr}/bin: 1876
8

evolve:

#! /bin/bash
start=`date +%s`
ls -l /usr |grep '^[-,d,c,b,l,s]'| wc -l

ls -l /usr/bin |grep '^[-,d,c,b,l,s]'| wc -l

ls -l /{,usr/}/bin |grep '^[-,d,c,b,l,s]'| wc -l

end=`date +%s`
interval=`expr $end - $start`
echo $interval

————————————————————————————————————————

12
1764
1876
0

evolve again:
# ls $dir | wc -l

calculate the greatest common divisor

ARGS=2
if [ $# -ne "$ARGS" ]
then
    echo "Usage: `basename $0` first-number second-number"
    exit 1
fi
gcd ()
{
    dividend=$1
    divisor=$2 
    remainder=1 
    while (( $remainder != 0 ));do
        remainder=`expr $dividend % $divisor`
        dividend=$divisor
        divisor=$remainder
    done
}
gcd $1 $2
echo $dividend

copy all files in folders qt_pro1, qt_pro2, … ,qt_pro12 into folder my_qt.

#!/bin/bash
for it in `ls |grep qt_pro`; do
echo  $it
cp  -r $it/*  my_qt/
echo "...done"
done

delete all other files except Calender and rm.sh

[[email protected] public]$ ls
Calender     libexpat.so.1     libgobject-2.0.so.0  libm.so.6           librt.so.1       libXau.so.6       libXext.so.6
cp.sh        libgcc_s.so.1     libgthread-2.0.so.0  libpthread.so.0     libselinux.so.1  libxcb-dri2.so.0  libXfixes.so.3
libc.so.6    libglapi.so.0     libicudata.so.51     libQt5Core.so.5     libstdc++.so.6   libxcb-glx.so.0   libXxf86vm.so.1
libdl.so.2   libglib-2.0.so.0  libicui18n.so.51     libQt5Gui.so.5      libX11.so.6      libxcb.so.1       read
libdrm.so.2  libGL.so.1        libicuuc.so.51       libQt5Widgets.so.5  libX11-xcb.so.1  libXdamage.so.1   run.sh

shell script:

#! /bin/bash
# rm.sh
for file in `ls` ;do 
    if [ $file != 'Calender' -a $file != 'rm.sh' ]; then
        rm $file
    fi
done

clear content in file.

cat /dev/null > filename

the number of parameters.

more precisely, the number is for the parameters which are passed to script.
the number of parameters of shell script is different to the number of paramters for C programs. The difference is whether take care of the script name.

C:

#include 

int main(int argc,char **argv){
    printf("argc %dn",argc);
    return 0;
}
/*
[[email protected] tmpDir]$ ./run hello wolrd
argc 3
*/

shell:

# !/bin/bash
echo "length: "$#
echo "first: "$0
echo "second: "$1
[[email protected] tmpDir]$ ./run.sh hello world
length: 2
first: ./run.sh
second: hello

find files in subdirectory recursively

#! /bin/bash
shopt -s globstar   #enable option globstar
for file in **; do
    echo $file
done

result:

[[email protected] recurseTest]$ ./recFile.sh 
file1.txt
file2.txt
recFile.sh
subdir
subdir/childDir
subdir/childDir/file.txt
subdir/files
subdir/files2

read and save the first two lines content in file.

code block here has important effect.

file="./read"
{
read line1
read line2
} < $file
echo $line1
echo $line2

save multiple results.

script:

{
echo "this is an I/O redirect file."
echo time is `date` 
}> file

result:

[[email protected] workspace]$ cat file
this is an I/O redirect file.
time is Mon Apr 3 14:29:42 CST 2017

test whether a command exists.

type $1 >& /dev/null
if (( $? != 0 )) ;then
    echo $1 is not a legitimate command
else echo $1 is a legitimate command.
fi

result:

[[email protected] workspace]$ ./type.sh ls
ls is a legitimate command.
[[email protected] workspace]$ ./type.sh lsl
lsl is not a legitimate command

a interesting phenomenon is that null parameter is regarded as right instruction.

[[email protected] workspace]$ ./type.sh
is a legitimate command.

absolutely it’s right, because we can click down Enter and nothing wrong happens.

delete the first line in file.

[[email protected] workspace]$ cat file
this is an I/O redirect file.
time is Mon Apr 3 14:29:42 CST 2017

tip: awk use $0 to print all fields.

cat file | awk '{if (!match($1,"^this")) printf("%s"),$0 }' > file

convert all characters to uppercase or lowercase

[[email protected] workspace]$ ./upOrLower.sh 
origin text:         time is Mon Apr 3 14:29:42 CST 2017
first upper case:     Time is Mon Apr 3 14:29:42 CST 2017
all upper case:         TIME IS MON APR 3 14:29:42 CST 2017
first lower case:     time is Mon Apr 3 14:29:42 CST 2017
all lower case:         time is mon apr 3 14:29:42 cst 2017
[[email protected] workspace]$ cat upOrLower.sh

shell script:

#!/bin/bash
text=`cat file`
echo -e "origin text:tt "$text
echo -e "first upper case:t "${text^}
echo -e "all upper case:tt "${text^^}
echo -e "first lower case:t "${text,}
echo -e "all lower case:tt "${text,,}

0 0 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
A prohibited operation
0
Would love your thoughts, please comment.x
()
x