Shell编程使用总结

1. 入门

1)shell命令都会,如:

    date 
    pwd
    cd
    ls -l

2)shell脚本的后缀约定俗成是sh,但也可以不是sh
3)shell脚本文件内容第一行 #!/bin/bash
|-- 不是必须的
|-- 表示用/bin下的bash命令解释(执行)下面的代码
|-- 假如使用sh命令执行shell脚本文件,可以没有+x 和 第一行解释器#!/bin/bash
|-- 假如不是使用sh命令,那么需要+x (执行权限)且第一行需要 #!/bin/bash

4)shell脚本内容是从上而下一行行执行
5)如何执行shell脚本?
假设在/home/hadoop/shell目录下有个hello.sh文件,文件内容为:

#!/bin/bash
echo "www.baidu.com"

执行方式1:绝对路径【需要执行权限】

chmod +x /home/hadoop/shell/examples/hello.sh
/home/hadoop/shell/examples/hello.sh

执行方式2:相对路径【需要执行权限】

chmod +x /home/hadoop/shell/examples/hello.sh
cd /home/hadoop/shell/examples

./hello.sh	【./xxx 表示当前目录下的可执行文件xxx】
hello.sh

执行方式3:sh xxx 命令表示使用sh命令执行xxx文件【不需要执行权限】

sh /home/hadoop/shell/examples/hello.sh

cd /home/hadoop/shell/examples
sh hello.sh

6)shell脚本的debug
方式一:sh -x xxx
方式二:shell脚本第一行 #!/bin/bash 之后加上 -x ,即#!/bin/bash -x

debug模式下
|–前面+或++后面的是shell脚本中的命令
|–不带+或++的为执行结果

2. 变量

变量定义和引用

cd /home/hadoop/shell/examples
vim variable.sh

文件内容为:

 #!/bin/bash
 # 静态变量
 RZ='www.baidu.com'
 # 动态变量(用顿号括起来)
 DATE=`date`
 # 动态变量实际上是命令,可以直接写上命令的完整路径,避免command not found
 DATE2=`/bin/date`
 
 # 引入方式:用括号括起来
 echo ${RZ}
 echo ${DATE}
 # 引入方式:直接接变量名
 echo $RZ
 echo $DATE
 # 直接接变量名,要与后面的内容空格隔开
 echo $RZ z
 # 这个会去找RZz变量,找不到为空
 echo $RZz

说明:
静态变量:变量值可以用单引号、双引号括起来,也可以什么都不括,表示的都是字符串
K=V 或 ‘V’ 或 “V”
如:RZ='www.baidu.com'

动态变量:shell脚本写的时候,并不知道这个值是什么,只有执行到此处才知道值是什么, 动态变量值用`` 顿号括起来,实际上动态变量值放的是命令

K=`V`

如:DATE=date
注意:动态变量放的是命令,如果提示command not found,表示在PATH环境变量中没有这个命令,所以生产上动态变量通常写命令的完整路径,如:

DATE2=`/bin/date`

引用,${变量名} 或者 $变量名(后面要有个空格,跟其它字符隔开)
如:

echo ${RZ}z


echo $RZ z (后面要有个空格,跟其它内容隔开)
echo $RZz (这种写法是错误的,会把RZz作为变量名去找,肯定找不到)

注意:=前后不能有空格

3. 传递参数

cd /home/hadoop/shell/examples
vim paramter.sh

文件内容为:

#!/bin/bash
echo $1
echo $2
echo "参数个数:$#"
echo "输出所有参数:$*"
echo "输出所有参数:$@"
echo "PID:$$"

执行

cd /home/hadoop/shell/examples
chmod +x paramter.sh 
./paramter.sh 
./paramter.sh abc xxx

在这里插入图片描述
说明:
$n 表示传递给函数或脚本的第n个参数值,n=1…9
$# 表示传递给函数或脚本的参数个数
$$ 表示进程的ID号
$* 表示传递给函数或脚本的所有参数
$@ 表示传递给函数或脚本的所有参数

$*、$@、"$*"、"$@"的区别,请看 这篇文章

4. 数组

只支持一维的

cd /home/hadoop/shell/examples
vim array.sh

文件内容为:

    #!/bin/bash 
    arr=(zeng zhangsan lisi wangwu zhaoliu xiaoshiqi)
    echo ${arr[@]}
    echo ${arr[*]}
    echo ${arr[4]}
    echo ${#arr[@]}

执行

cd /home/hadoop/shell/examples
chmod +x array.sh 
./array.sh 

在这里插入图片描述

5. if判断

cd /home/hadoop/shell/examples
vim if.sh

文件内容为:

    #!/bin/bash
    
    a="abc"
    b="hello"
    
    # 注意==前后有空格
    if [ $a == $b ];then
            echo "=="
    else
            echo "!="
    fi

执行

cd /home/hadoop/shell/examples
chmod +x if.sh 
./if.sh 

在这里插入图片描述

6. 循环

cd /home/hadoop/shell/examples
vim forwhile.sh

文件内容为:

   #!/bin/bash
   for x in 1 2 3 4 5
   do
   	echo $x
   done
   
   echo "--------------------------------------"
   for ((i=1;i<15;i++))
   do
   	echo $i
   done
  
   echo "--------------------------------------"
   x=1
   y=1
   while(($y<10))
   do
  		echo $y
  		let "y++"
  		let "x++"
   done
   echo "x:${x}"

执行

cd /home/hadoop/shell/examples
chmod +x forwhile.sh 
./forwhile.sh

在这里插入图片描述

7. 分割

cd /home/hadoop/shell/examples
vim split.sh

文件内容为:

    #!/bin/bash
    S="zeng,zhangsan,lisi,wangwu,zhaoliu,xiaoshiqi"
    OLD_IFS="$IFS"
    IFS=","		#指定按什么符号进行分割
    arr=($S)	#待分割的字符串
    IFS="OLD_IFS"
    
    for x in ${arr[*]}
    do
    	echo $x
    done

说明:上面OLD_IFS="$IFS" 与 IFS="OLD_IFS"的代码是固定格式的,用于按特定符号分割字符串

执行

cd /home/hadoop/shell/examples
chmod +x split.sh 
./split.sh

在这里插入图片描述

8. awk

awk命令用于取数
1)先创建2个测试文件

cd /home/hadoop/shell/examples
mkdir awk
cd awk
vi test1.log

文件内容为
a b c
1 2 3
4 5 6

vi test2.log

文件内容为
a,b,c
1,2,3
4,5,6

2)创建awk测试shell脚本

cd /home/hadoop/shell/examples/awk
vim awk.sh

文件内容为:

    # 读取test1.log内容作为 awk的输入,并打印出第一列
cat test1.log | awk '{print $1}'

# 读取test1.log内容作为 awk的输入,并打印出第一行的第1列和第3列,接着打印第二行的第1列和第3列...
cat test1.log | awk '{print $1,$3}'

# 读取test1.log内容作为 awk的输入,并打印出第1列的所有数据,接着打印第3列的所有数据
cat test1.log | awk '{print $1 $3}'


echo "---------------------------"
# 读取test2.log内容作为 awk的输入,用逗号分隔,并打印出第一行的第1列和第3列,接着打印第二行的第1列和第3列...
cat test2.log | awk -F ',' '{print $1,$3}'

# 读取test2.log内容作为 awk的输入,用逗号分隔,并打印出第1列的所有数据,接着打印第3列的所有数据
cat test2.log | awk -F ',' '{print $1 $3}'


echo "---------------------------"
# 取第二行的第3列,取第三行的第3列
cat test2.log | awk -F ',' 'NR>1 {print $3}'

执行

cd /home/hadoop/shell/examples/awk
chmod +x awk.sh 
./awk.sh

在这里插入图片描述

9. sed

sed 替换

1)先创建1个测试文件

cd /home/hadoop/shell/examples
mkdir sed
cd sed
vi test.log

文件内容为
a b c
1 2 3

2)创建sed测试shell脚本

cd /home/hadoop/shell/examples/sed
vim sed.sh

文件内容为:

    #!/bin/bash
    
    # 替换以a开头的字符串为aa
    # -i 表示替换
    # 's/'表示以a为开头的字符串
    sed -i 's/a/aa/' test.log
    
    # 替换以a开头的字符串为aa,因为加了g表示全局
    # 所以把所有a替换为aa
    sed -i 's/a/w/g' test.log
    
    # ^符号表示开头,
    # uuu& 即在前面加uuu字符串,并拼上后面的内容
    sed -i "s/^/uuu&/g" test.log
    
    # $符号表示结尾
    # &kkk 即每行的内容拼上kkk,即后面都加kkk字符串
    sed -i "s/$/&kkk/g" test.log

执行

cd /home/hadoop/shell/examples/sed
chmod +x sed.sh 
./sed.sh
cat test.log

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值