浅析Shell脚本

Posted by JustDoDT on April 13, 2018

shell 脚本概述

shell 脚本问题

shell 脚本在工作中十分常见,以下是常见的shell用法

[root@hadoop001 shell]# sh --help
GNU bash, version 4.1.2(1)-release-(x86_64-redhat-linux-gnu)
Usage:  sh [GNU long option] [option] ...
        sh [GNU long option] [option] script-file ...
GNU long options:
        --debug
        --debugger
        --dump-po-strings
        --dump-strings
        --help
        --init-file
        --login
        --noediting
        --noprofile
        --norc
        --posix
        --protected
        --rcfile
        --rpm-requires
        --restricted
        --verbose
        --version
Shell options:
        -irsD or -c command or -O shopt_option          (invocation only)
        -abefhkmnptuvxBCHP or -o option
Type `sh -c "help set"' for more information about shell options.
Type `sh -c help' for more information about shell builtin commands.

shell脚本的后缀必须是.sh ;shell 脚本的第一行是 #!/bin/bash

-x 是shell脚本的debug 模式

[hadoop@hadoop001 shell]$ sh -x variable.sh 
+ HA=www.baidu.com
++ date
+ DATE='Wed Mar 27 22:02:42 CST 2019'
+ echo www.baidu.com
www.baidu.com
+ echo Wed Mar 27 22:02:42 CST 2019
Wed Mar 27 22:02:42 CST 2019

注意:每一行之前都会加上加号(+),提示它是跟踪输出的标识。在子Shell中执行的Shell跟踪命令会加两个加号,即“++”。

变量

[hadoop@hadoop001 shell]$ cat variable.sh 
#!/bin/bash
HA="www.baidu.com"
DATE=`date`
echo ${HA}
echo ${DATE}
[hadoop@hadoop001 shell]$ chmod +x variable.sh 
[hadoop@hadoop001 shell]$ ./variable.sh 
www.baidu.com
Wed Mar 27 21:53:15 CST 2019

静态变量

K=X ’X’ ”X” ;可以直接用一个变量赋值,也可以给这个变量加上单引号或者双引号。

动态变量

K=`X`  

注意:一定是反引号,并且等号的前后不能有空格。

引用

$KA

${K}A 

注意:引用变量的时候一定要用{},不要直接用变量

传递参数

[root@hadoop001 shell]# cat parameter.sh 
#!/bin/bash

echo $1
echo $2
echo "个数:$#"
echo "参数作为一个长字符串: $*"
echo "PID: $$"

数组

shell 中只支持一维数组

[root@hadoop001 shell]# vi array.sh 
#!/bin/bash
arr=(beijing shanghai tianjin chongqing chengdu)

echo ${arr[@]}
echo ${arr[*]}
echo ${arr[4]}
echo ${#arr[@]}

[root@hadoop001 shell]# chmod +x array.sh 
[root@hadoop001 shell]# ./array.sh 
beijing shanghai tianjin chongqing chengdu
beijing shanghai tianjin chongqing chengdu
chengdu
5

@ 和 * 都是取出数组中的所有元素,每个数组之间用空格分隔。

if 判断

[root@hadoop001 shell]# vi if.sh
#!/bin/bash

A="abc"
B="justdodt"


if [ $a == $b ];then
        echo "=="
else
        echo "!="
fi

[root@hadoop001 shell]# chmod +x if.sh 
[root@hadoop001 shell]# ./if.sh 
==

思考:为啥上面的结果是等于呢?

因为是A与B有赋值,但是作为判断的时候是a和b ,a 和 b 都没有赋值,即为null,所以判断出来为 ==

[root@hadoop001 shell]# vi if.sh
#!/bin/bash

A="abc"
B="justdodt"


if [ $A == $B ];then
        echo "=="
else
        echo "!="
fi

[root@hadoop001 shell]# ./if.sh 
!=

注意:== 前后有空格

[ a == b ]

循环

[root@hadoop001 shell]# vi for.sh
#!/bin/bash
 
for varible1 in {1..5}
#for varible1 in 1 2 3 4 5
do
     echo "Hello, Welcome $varible1 times "
done

[root@hadoop001 shell]#chmod +x for.sh
[root@hadoop001 shell]# ./for.sh 
Hello, Welcome 1 times 
Hello, Welcome 2 times 
Hello, Welcome 3 times 
Hello, Welcome 4 times 
Hello, Welcome 5 times 

shell 循环的参考文章

分割

[root@hadoop001 shell]# vi spilt.sh
#!/bin/bash

S="beijing,shanghai,tianjin,chongqing,chengdu,wuhan"
OLD_IFS="$IFS"
IFS=","
arr=($S)
IFS="OLD_IFS"

for x in ${arr[*]}
do
        echo $x
done


[root@hadoop001 shell]# chmod +x spilt.sh 
[root@hadoop001 shell]# ./spilt.sh 
beijing
shanghai
tianjin
chongqing
chengdu
wuhan

awk 取数

[root@hadoop001 shell]# vi awk.log
a,b,c
1,2,3
4,5,6

[root@hadoop001 shell]# awk '{ print $1 }'  awk.log 
a,b,c
1,2,3
4,5,6
[root@hadoop001 shell]# cat awk.log |awk '{ print $1 }'
a,b,c
1,2,3
4,5,6
[root@hadoop001 shell]# cat awk.log |awk -F "," '{ print $1 }'
a
1
4
[root@hadoop001 shell]# cat awk.log |awk -F "," '{ print $3 }'
c
3
6
[root@hadoop001 shell]# cat awk.log |awk -F "," 'NR>1{ print $3 }'
3
6

sed 替换

[root@hadoop001 shell]# vi sed.log
a b c
1 2 3
~

"sed.log" [New] 2L, 12C written
[root@hadoop001 shell]# sed -i 's/a/aa/' sed.log 
[root@hadoop001 shell]# cat sed.log 
aa b c
1 2 3

[root@hadoop001 shell]# sed -i "s/aa/aa'/" sed.log 
[root@hadoop001 shell]# cat sed.log 
aa' b c
1 2 3

[root@hadoop001 shell]# sed -i "s?aa'?bbb?" sed.log 
[root@hadoop001 shell]# cat sed.log 
bbb b c
1 2 3

[root@hadoop001 shell]# sed -i "s/b/w/" sed.log
[root@hadoop001 shell]# cat sed.log 
wbb b c
1 2 3


全局替换
[root@hadoop001 shell]# sed -i "s/b/w/g" sed.log
[root@hadoop001 shell]# cat sed.log 
www w c
1 2 3


前面加
[root@hadoop001 shell]# sed -i "s/^/uuu&/g" sed.log
[root@hadoop001 shell]# cat sed.log 
uuuwww w c
uuu1 2 3

后面加
[root@hadoop001 shell]# sed -i "s/$/&uuu/g" sed.log
[root@hadoop001 shell]# 
[root@hadoop001 shell]# cat sed.log 
uuuwww w cuuu
uuu1 2 3uuu
[root@hadoop001 shell]#