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
分割
[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]#