Linux_Shell编程

概述

  Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
  Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。Shell是解释执行的脚本语言,在Shell中可以调用Linux系统命令。

Shell脚本的helloworld

  1. 脚本格式
    (1)脚本以#!/bin/bash开头
    (2)脚本必须有可执行权限(chmod +x 文件名.sh)
  2. 第一个Shell脚本
    (1)需求:创建一个Shell脚本,输出helloworld
    (2)操作:
[admin@hadoop1 datas]$ touch helloworld.sh
[admin@hadoop1 datas]$ vi helloworld.sh
在helloworld.sh中输入如下内容
#!/bin/bash
echo "helloworld"


  1. 脚本的常用执行方式

第一种:输入脚本的绝对路径或相对路径
(1)首先要赋予helloworld.sh 脚本的+x权限
(2)执行脚本
 [admin@hadoop1 datas]$ chmod 777 helloworld.sh
    /root/helloWorld.sh
    ./helloWorld.sh

第二种:bash或sh+脚本(不用赋予脚本+x权限)

    sh /root/helloWorld.sh
    sh helloWorld.sh

Shell中的变量

  • Linux Shell中的变量分为,系统变量和用户自定义变量。
  • 系统变量:$HOME$PWD$SHELL$USER等等
  • 显示当前shell中所有变量:set
一、定义变量
  • 基本语法

    (1)定义变量:变量=值
    (2)撤销变量:unset 变量
    (3)声明静态变量:readonly变量,注意:不能unset

  • 变量定义规则

    (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
    (2)等号两侧不能有空格
    (3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
    (4)变量的值如果有空格,需要使用双引号或单引号包括

  • 举个栗子

    (1)定义变量A
      A=8
    (2)撤销变量A
      unset A
    (3)声明静态的变量B=2,不能unset
      readonly B=2
    (4)可把变量提升为全局环境变量,可供其他shell程序使用
      export 变量名

#!/bin/bash
echo $a
二、将命令的返回值赋给变量
  • A=’ ls -la ’ 反引号,运行里面的命令,并把结果返回给变量A
  • A=$(ls -la) 等价于反引号
三、位置参数变量
  • 基本语法

    nn n ( 功 能 描 述 : n 为 数 字 , 0代表命令本身, 1 1 − 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 10 10 ) * (功能描述:这个变量代表命令行中所有的参数, ∗ 把 所 有 的 参 数 看 成 一 个 整 体 ) @ (功能描述:这个变量也代表命令行中所有的参数,不过 @ @ 把 每 个 参 数 区 分 对 待 ) # (功能描述:这个变量代表命令行中所有参数的个数),常用于循环。

  • 举个栗子

(1)输出输入的的参数1,参数2,所有参数,参数个数

#!/bin/bash
echo "$0  $1   $2"
echo "$*"
echo "$@"
echo "$#"

(2)$*$@的区别

#!/bin/bash 
for i in "$*" 
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次 
        do 
                echo "The parameters is: $i" 
        done 
x=1 
for y in "$@" 
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 
        do 
                echo "The parameter$x is: $y" 
                x=$(( $x +1 )) 
done
a)$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,
    都以$1 $2 …$n的形式输出所有参数
b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,
    以“$1” “$2”…”$n”的形式输出所有参数
四、预定义变量

$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

运算符

  • 基本语法
    (1)“$((运算式))”或“$[运算式]
    (2)expr m + n
    注意:expr运算符间要有空格
    (3)expr m - n
    (4)expr \*, /, % 乘,除,取余
  • 举个栗子:计算(2+3)X4的值
    (1)采用$[运算式]方式
[root@hadoop1 datas]# S=$[(2+3)*4]
[root@hadoop1 datas]# echo $S
(2)expr分布计算
        S=`expr 2 + 3`
        expr $S \* 4
(3)expr一步完成计算
        expr `expr 2 + 3` \* 4

条件判断

判断语句
  • 基本语法
 [ condition ](注意condition前后要有空格)
#非空返回true,可使用$?验证(0true,>1false
  • 举个栗子
[admin]     返回true
[]          返回false
[condition] && echo OK || echo notok  条件满足,执行后面的语句

&& 表示前一条命令执行成功时,才执行后一条命令,要和&区分
|| 表示上一条命令执行失败后,才执行下一条命令,要和|区分

常用判断条件
  • 两个整数之间比较
    = 字符串比较

    -lt 小于
    -le小于等于
    -eq 等于
    -gt 大于
    -ge 大于等于
    -ne 不等于

  • 按照文件权限进行判断

    -r 有读的权限
    -w 有写的权限
    -x有执行的权限

  • 按照文件类型进行判断

    -f 文件存在并且是一个常规的文件
    -e 文件存在
    -d文件存在并是一个目录

  • 举个栗子

(1)23是否大于等于22

[ 23 -ge 22 ]

(2)test.txt是否具有写权限

[ -w test.txt ]

(3)/root/install.log目录中的文件是否存在

[ -e /root/install.log ]

流程控制

if判断
  • 基本语法

    if [ 条件判断式 ];then
    程序
    fi
    或者
    if [ 条件判断式 ]
    then
    程序
    fi

    注意事项:
    (1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
    (2)if后要有空格

  • 举个栗子
#!/bin/bash

if [ $1 -eq "123" ]
then
        echo "123"
elif [ $1 -eq "456" ]
then
        echo "456"
fi
case语句
  • 基本语法

    case $变量名 in
    “值1”)
    如果变量的值等于值1,则执行程序1
    ;;
    “值2”)
    如果变量的值等于值2,则执行程序2
    ;;
    …省略其他分支…
    *)
    如果变量的值都不是以上的值,则执行此程序
    ;;
    esac

    注意事项:
    (1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
    (2)双分号“;;”表示命令序列结束,相当于java中的break。
    (3)最后的“*)”表示默认模式,相当于java中的default。

  • 举个栗子

!/bin/bash

case $1 in
"1")
        echo "1"
;;

"2")
        echo "2"
;;
*)
        echo "other"
;;
esac
for循环
  • 基本语法1

    for 变量 in 值1 值2 值3…
    do
    程序
    done

  • 举个栗子
    (1)打印输入参数

#!/bin/bash
#打印数字

for i in "$*"
    do
      echo "The num is $i "
    done

for j in "$@"
        do
        echo "The num is $j"
done
  • 基本语法2

    for (( 初始值;循环控制条件;变量变化 ))
    do
    程序
    done

  • 举个栗子
    (1)从1加到100

#!/bin/bash

s=0
for((i=0;i<=100;i++))
do
        s=$[$s+$i]
done
echo$s
while循环
  • 基本语法

    while [ 条件判断式 ]
    do
    程序
    done

  • 举个栗子
    (1)从1加到100

#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
        s=$[$s+$i]
        i=$[$i+1]
done

echo $s

read读取控制台输入

  • 基本语法

    read(选项)(参数)
    选项:
    -p:指定读取值时的提示符;
    -t:指定读取值时等待的时间(秒)。
    参数
    变量:指定读取值的变量名

  • 举个栗子
    读取控制台输入的名称

#!/bin/bash

read -t 7 -p "please 7 miao input your name " NAME
echo $NAME

函数

系统函数
  • basename基本语法

    basename [pathname] [suffix]
    basename [string] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
    选项:
    suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

  • 举个栗子

[admin@hadoop1 opt]$ basename /opt/test.txt test.txt
[admin@hadoop1 opt]$ basename /opt/test.txt .txt test
  • dirname基本语法

    dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

  • 举个栗子

    [atguigu@hadoop101 opt]$ dirname /opt/test.txt /opt
自定义函数
  • 基本语法

    [ function ] funname[()]
    {
    Action;
    [return int;]
    }
    funname

  • 老司机带路
    (1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
    (2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

  • 举个栗子
    (1)计算输入参数的和

#!/bin/bash
function sum()
{
    s=0
    s=$[ $1 + $2 ]
    echo "$s"
}

read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;

工具

cut
>   cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。 - 基本用法
 cut [选项参数] filename  
 # 说明:默认分隔符是制表符
- 选项参数说明 |选项参数|功能| |:—:|:—-:| |-f|列号,提取第几列| |-d|分隔符,按照指定分隔符分割列| |-b|按照字节分| > 举个栗子 (1)切割每一行第 1-5 个字节
[root@hadoop1 shell]# cut -b 1-5 cut.txt
(2)切割test.txt第一列
[root@hadoop1 ~]# cut -d: -f1 test.txt
(3)切割IP地址
ifconfig eth0 | grep "inet addr" | cut -d: -f2 | cut -d" " -f1
sed
  sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。 - 基本用法
sed [选项参数]  ‘commandfilename
- 选项参数说明 |选项参数|功能| |:—:|:—-:| |-n|显示经过sed特殊处理的数据| |-e|允许多点编辑| |-i|直接修改读取的文档内容,而不是由屏幕输出| 命令功能描述 |命令|功能描述| |:—:|:—-:| |`a \`|新增, a 的后面可以接字串,在下一行出现| |`d`|删除| |`c \`|把选定的行改为新的文本| |`i \`|插入, i 的后面可以接字串| |`p`|打印| |`s`|替换指定字符| 举个栗子 (1)将“hive”这个单词插入到test.txt第二行后
sed '2a hive' test.txt
(2)删除test.txt文件所有包含h的行
sed '/h/d' test.txt
(3)将test.txt文件中h替换为H
sed 's/h/H/g' test.txt
#‘g’表示global,行内全部替换
(4)将test.txt文件中的第二行删除并将hadoop替换为HADOOOP
sed -e '2d' -e 's/hadoop/HADOOP/g' test.txt
awk

  一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

  • 基本用法
awk  [选项参数]‘pattern1{action1}pattern2{action2}...’filename

pattern: 表示 AWK 在数据中查找的内容,就是匹配模式(通常都是正则表达式)
action:在找到匹配内容时所执行的一系列命令

  • 选项参数说明
选项参数功能
-F指定输入文件折分隔符
-v赋值一个用户定义变量

举个栗子
(1)搜索/etc/passwd以root关键字开头的所有行,并输出该行的第7列

awk -F: '/^root/{print $7}' /etc/passwd

说明:只有匹配了patter的行才会执行action
(2)只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加”admin,/bin/bash”。

awk -F: 'BEGIN{print"user,shell"} {print $1","$7} END{print "admin,/bin/bash"}' /etc/passwd

说明:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
(3)将/etc/passwd文件中的用户id增加指定数值并输出

awk -F: -va=1 '{print $3+a}' /etc/passwd
  • awk的内置变量
变量说明
ARGC命令行参数个数
ARGV命令行参数排列
FILENAME文件名
NR已读的记录数
NF浏览记录的域的个数

举个栗子
(1)统计/etc/passwd:文件名,每行的行号,每行的列数

awk -F: '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF}' /etc/passwd

(2)切割IP

ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'
本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 chmod命令的其他例子 6 1.4.5 可以选择使用符号模式或绝对模式 7 1.5 目录 7 1.6 suid/guid 7 1.6.1 为什么要使用suid/guid 8 1.6.2 设置suid/guid的例子 8 1.7 chown和chgrp 9 1.7.1 chown举例 9 1.7.2 chgrp举例 9 1.7.3 找出你所属于的用户组 9 1.7.4 找出其他用户所属于的组 10 1.8 umask 10 1.8.1 如何计算umask值 10 1.8.2 常用的umask值 11 1.9 符号链接 12 1.9.1 使用软链接来保存文件的多个映像 12 1.9.2 符号链接举例 12 1.10 小结 13 第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 3.1.7 删除crontab文件 25 3.1.8 恢复丢失的crontab文件 25 3.2 at命令 25 3.2.1 使用at命令提交命令或脚本 26 3.2.2 列出所提交的作业 27 3.2.3 清除一个作业 27 3.3 &命令 27 3.3.1 向后台提交命令 28 3.3.2 用ps命令查看进程 28 3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准错误 43 5.9 合并标准输出和标准错误 43 5.10 exec 44 5.11 使用文件描述符 44 5.12 小结 45 ... ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值