首页 > 系统相关 >大数据技术之Shell

大数据技术之Shell

时间:2024-07-23 16:21:04浏览次数:16  
标签:1025 Shell 数据 技术 echo sh bash root datas

1. shell概述

示意图:

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

● Linux提供的Shell解析器有

查看代码
[atguigu@hadoop101 ~]$ cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

● bash和sh的关系

查看代码
[atguigu@hadoop101 bin]$ ll | grep bash
-rwxr-xr-x. 1 root root 941880 5月  11 2016 bash
lrwxrwxrwx. 1 root root      4 5月  27 2017 sh -> bash

● Centos默认的解析器是bash

查看代码
[atguigu@hadoop102 bin]$ echo $SHELL
/bin/bash

 

2. Shell脚本入门

2.1 脚本格式

#!/bin/bash  以此开头(指定解析器)

2.2 第一个Shell脚本:helloworld

● 【案例】:

[atguigu@hadoop101 datas]$ touch helloworld.sh
[atguigu@hadoop101 datas]$ vi helloworld.sh

在helloworld.sh中输入如下内容
#!/bin/bash
echo "helloworld"

 

脚本的常用执行方式

方式一:bash/sh + 相对/绝对路径  (不用赋予脚本 +x 权限)

sh + 相对

      Helloworld

绝对 bash + 相对 绝对  
相对 绝对 [atguigu@hadoop101 datas]$ /home/atguigu/datas/helloworld.sh

注意:

方式一:本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。

方式二:本质是脚本自己执行,所以需要执行权限。

 

3. 变量

3.1 系统预定义变量

● 常用系统变量

$HOME、$PWD、$SHELL、$USER、$PATH等

● 【案例】

查看系统变量的值:echo $HOME

显示当前Shell中所有变量:set

 

3.2 自定义变量

基本语法

定义变量:变量=值

撤销变量:unset 变量

声明静态变量:readonly 变量 (注意:不能unset)

 

变量定义规则

变量名称起名同java的一样

“=”两侧无空格

默认为字符串类型。

变量值有空格,使用双引号或单引号。

 

【案例】

(1)定义变量A

查看代码
[atguigu@hadoop101 datas]$ A=5
[atguigu@hadoop101 datas]$ echo $A
5

(2)给变量A重新赋值

查看代码
[atguigu@hadoop101 datas]$ A=8
[atguigu@hadoop101 datas]$ echo $A
8

(3)撤销变量A

查看代码
[atguigu@hadoop101 datas]$ unset A
[atguigu@hadoop101 datas]$ echo $A

(4)声明静态的变量B=2,不能unset

查看代码
[atguigu@hadoop101 datas]$ readonly B=2
[atguigu@hadoop101 datas]$ echo $B
2
[atguigu@hadoop101 datas]$ B=9
-bash: B: readonly variable

(5)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

查看代码
[atguigu@hadoop102 ~]$ C=1+2
[atguigu@hadoop102 ~]$ echo $C
1+2

 (6)变量的值如果有空格,需要使用双引号或单引号括起来

查看代码
[atguigu@hadoop102 ~]$ D=I love banzhang
-bash: world: command not found
[atguigu@hadoop102 ~]$ D="I love banzhang"
[atguigu@hadoop102 ~]$ echo $D
I love banzhang

 

3.3 特殊变量

3.3.1 $n

基本语法:  $n 

功能:n为数字

$0         脚本名称,

$1-$9   第一到第九个参数,

n>10    需使用大括号,如${10}

【案例】

[root@1025 datas]# vim parameter.sh

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

[root@1025 datas]# vim paramter.sh
[root@1025 datas]# bash paramter.sh 1 2 3
paramter.sh 1 2

 

3.3.2 $#

基本语法:$#

功能:获取所有输入参数个数,常用于循环

【案例】

[root@1025 datas]# vim paramter.sh

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

[root@1025 datas]# bash paramter.sh 1 2 3
paramter.sh 1 2
3

 

3.3.3 $*、$@

基本语法

一个整体。

区别对待。

【案例】

[root@1025 datas]# vim paramter.sh

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

[root@1025 datas]# bash paramter.sh 1 2 3
paramter.sh 1 2
3
1 2 3
1 2 3

 

3.3.4 $?

基本语法

$? 

功能:最后一次执行的命令的返回状态。  上一个命令,执行正确,返回0    执行错误,返回非0

【案例】判断hello.sh脚本是否正确执行

[root@1025 datas]# bash hello.sh 
hello world!
[root@1025 datas]# echo $?
0

 

4. 运算符

基本语法

“ $[运算式] ”

【案例】计算(2+3)*4 的值

[root@1025 datas]# sum=$(((2+3)*4))
[root@1025 datas]# echo sum
sum
[root@1025 datas]# echo $sum
20
[root@1025 datas]# sum=$[(2+3)*4]
[root@1025 datas]# echo $sum
20

 

5. 条件判断

基本语法

(1) test condition

(2) [ condition ]         (注意condition前后要有空格)

注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。

 

常用判断条件

● 两个整数之间比较

-lt-gt
小于(less than)   -le 小于等于(less equal)
大于(greater than) -ge 大于等于(greater equal)
-eq 等于(equal) -ne 不等于(Not equal)
= 字符串比较    

● 按照文件权限进行判断

-r 读的权限(read)
-w 写的权限(write)
-x 执行的权限(execute)

● 按照文件类型进行判断

-f 文件存在 且为 常规文件(file)
-e 文件存在(existence)
-d 存在 且为 目录(directory)

【案例】

(1) 23是否大于等于22

[root@1025 datas]# [ 23 -ge 22 ]
[root@1025 datas]# echo $?
0

(2) helloworld.sh是否具有写权限

[root@1025 datas]# ll
总用量 8
-rw-r--r--. 1 root root 32 12月  8 07:32 hello.sh
-rw-r--r--. 1 root root 52 12月  8 07:27 paramter.sh
[root@1025 datas]# [ -w hello.sh ]
[root@1025 datas]# echo $?
0

(3) /opt/datas目录中的文件是否存在

[root@1025 opt]# [ -e /opt/datas ]
[root@1025 opt]# echo $?
0

(4) 多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)

[root@1025 datas]# [ condition ] && echo true || echo false

 

6. 流程控制(重点)

6.1 if判断

基本语法

if  [ 条件判断式 ];then

  程序

fi

或者

if  [ 条件判断式 ]

  then

    程序

elif  [ 条件判断式 ]

       then

              程序

else

       程序

fi

注意:

● [ 条件判断式 ],中括号和条件判断式之间必须有空格。

● if 后要有空格。

【案例】

输入一个数字,如果是1,则输出“我是伢子”,如果是2,则输出“我是阿獠”,如果是3,则输出“我是阿香”,如果是其它,什么也不输出。

[root@1025 datas]# vim if.sh 
[root@1025 datas]# bash if.sh 3
我是阿香
[root@1025 datas]# bash if.sh 1
我是伢子
[root@1025 datas]# bash if.sh 2
我是阿獠

#!/bin/bash
if [ $1 -eq "1" ]
then
        echo "我是伢子"
elif [ $1 -eq "2" ]
then
        echo "我是阿獠"
elif [ $1 -eq "3" ]
then
        echo "我是阿香"
fi

 

6.2 case语句

基本语法

case  $变量名 in

  "值1")

    如果变量的值等于值1,则执行程序1

    ;;

  "值2")

    如果变量的值等于值2,则执行程序2

    ;;

  …省略其他分支…

  *)

    如果变量的值都不是以上的值,则执行此程序

    ;;

esac

注意事项:

● case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

● 双分号“;;”表示命令序列结束,相当于java中的break。

● 最后的“*)”表示默认模式,相当于java中的default。

【案例】输入一个数字,如果是1,则输出“我是伢子”,如果是2,则输出“我是阿獠”,如果是3,则输出“我是阿香”,如果是其它,输出“哈哈哈~”

[root@1025 datas]# vim case.sh
[root@1025 datas]# bash case.sh 1
伢子
[root@1025 datas]# bash case.sh 2
阿獠
[root@1025 datas]# bash case.sh 3
阿香
[root@1025 datas]# bash case.sh 7
哈哈哈~

#!/bin/bash
case $1 in
"1")
        echo "伢子"
;;
"2")
        echo "阿獠"
;;
"3")
        echo "阿香"
;;
*)
        echo "哈哈哈~"
;;
esac

 

6.3 for循环

基本语法1

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

  do

    程序

  done

【案例】从1加到100

[root@1025 datas]# vim for1.sh
[root@1025 datas]# bash for1.sh 
5050

#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do
        sum=$[$sum+$i]
done
echo $sum

 

基本语法2

for 变量 in 值1 值2 值3…

  do

    程序

  done

 【案例】

(1)打印所有输入参数

[root@1025 datas]# vim for2.sh
[root@1025 datas]# bash for2.sh xm xh xg
我是 xm 
我是 xh 
我是 xg 

#!/bin/bash
for i in $*
do
        echo "我是 $i "
done

(2)比较$*和$@区别

$*和$@都表示传递给函数或脚本的所有参数

【案例1】对$*、$@不使用 "",都以$1 $2 …$n的形式输出所有参数。

[root@1025 opt]# vim for.sh
[root@1025 opt]# bash for.sh xm xh xg
I am xm
I am xh
I am xg
---------------------
I am xg
I am xg
I am xg

for i in $*
do
      echo "I am $i "
done
echo "---------------------"
for j in $@
do      
        echo "I am $j"
done

【案例2】对$*、$@使用 "","$*"以"$1 $2 …$n"的形式整体输出。 "$@"以"$1"、 "$2"、 …、"$n"的形式分开输出。

[root@1025 opt]# vim for.sh
[root@1025 opt]# bash for.sh xm xh xg
I am xm xh xg
---------------------
I am xm
I am xh
I am xg

#!/bin/bash 

for i in "$*" 
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次 
        do 
                echo "I am $i"
        done 
echo "---------------------"
for j in "$@" 
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 
        do 
                echo "I am $j" 
done

 

6.4 while循环

基本语法

while [ 条件判断式 ]

  do

    程序

  done

【案例】

[root@1025 datas]# vim while.sh
[root@1025 datas]# bash while.sh 
5050


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

 

7. read读取控制台输入

基本语法

read(选项)(参数)

选项:

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)。

参数

       变量:指定读取值的变量名

【案例】提示7秒内,读取控制台输入的名称

[root@1025 datas]# vim read.sh
[root@1025 datas]# bash read.sh 
Enter your name in 7 seconds

#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME

 

8. 函数

8.1系统函数

8.1.1 basename

基本语法

basename [string / pathname] [suffix]        

(功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

选项:

suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

【案例】截取该/opt/a.txt路径的文件名称

8.1.2 dirname

基本语法

dirname 文件绝对路径         

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

【案例】获取a.txt文件的路径

8.2 自定义函数

基本语法

[ function ] funname[()]

{

       Action;

       [return int;]

}

funname

注意:

● 先声明函数,再调用,

● shell脚本是逐行运行。不会像其它语言一样先编译。

● 函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

【案例】

[root@1025 opt]# vim fun.sh 
[root@1025 opt]# bash fun.sh 
Please input the number1:2
Please input the number1:5
7

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;

标签:1025,Shell,数据,技术,echo,sh,bash,root,datas
From: https://www.cnblogs.com/sikewang/p/18318711

相关文章

  • 【YashanDB知识库】yac修改参数后关闭数据库hang住
    【标题】yac修改参数后关闭数据库hang住【问题分类】性能优化【关键词】YashanDB,yac,shutdownhang【问题描述】修改yac参数后执行shutdownimmediate,数据库hang住。【问题原因分析】Shutdown操作时,线程在获取gInstance->trigger->sema信号量时卡住。该信号量应由mai......
  • python 使用 random模块生成随机测试数据
    前言python中可以使用random模块生成随机测试数据常用函数说明random.seed(a)设置初始化随机种子,可输出相同随机数序列;a取整数或浮点数,不设置时默认以系统时间为种子random.random()生成一个0.0到1.0之间的随机浮点数random.uniform(a,b)生成一个[a,b]之间......
  • c 使用cJSON生成及解析json类型数据
    一、概述cJSON官网作用:可以在c程序中方便的进行json字符串的解析及生成 二、代码示例//组装一个json串voidCJsonTest::valueToJsonObject(){cJSON*root,*fmt;char*out;root=cJSON_CreateObject();//创建一个obj(申请了堆内存记得释放)......
  • 硬盘取证(电子数据取证)
    硬盘取证是电子数据取证的一个重要分支,涉及对硬盘驱动器(包括传统硬盘HDD、固态硬盘SSD等)进行调查,以收集、保存、分析和呈现与法律案件或安全事件有关的电子证据。硬盘取证的目标是确保收集的证据在法庭上具有可接受性和可靠性,同时遵守相关法律法规。硬盘取证的基本步骤:证据......
  • 每次测试后自动清理 postgres 数据库
    我有与postgres数据库对话的sqlalchemy应用程序。我想使用测试容器进行一些“集成测试”并尝试各种场景。只是为了让事情变得简单,假设在我的应用程序中我只期望一个表users至少包含admin行。我希望这在所有测试中可用。这就像我的数据库状态......
  • 重测序数据处理得到vcf文件
    重测序数据处理得到vcf文件文章目录重测序数据处理前言1.数据是rawdata,需用fastp对数据进行质控和过滤2.利用getorganelle软件组装叶绿体基因组3.检查基因组大小,确认是否完整,然后和已知的红毛菜科叶绿体基因组一起构树4.根据树形结果挑选坛紫菜个体,为了后续分析方......
  • MySQL 数据库的设计规范
    Author:ACatSmilingSince:2024-07-23为什么需要数据库设计我们在设计数据表的时候,要考虑很多问题。比如:用户都需要什么数据?需要在数据表中保存哪些数据?如何保证数据表中数据的正确性?当插入、删除、更新的时候该进行怎样的约束检查?如何降低数据表的数据冗余度,保证数据表不......
  • 直播预约丨《袋鼠云大数据实操指南》No.4:数据服务API实战解读,助力企业数字化跃迁
    近年来,新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕。面对这些引领经济转型的新兴概念,为了更好地服务于客户并提供切实可行的实践指导,自3月20日起,袋鼠云将推出全新......
  • 3D视觉:结构光与线扫描技术
    目录引言结构光3D相机构成工作原理一、投射结构光二、采集反射光图案三、三角测量与深度计算四、构建三维模型应用线扫描3D相机构成工作原理1、激光投射:2、光线反射与捕捉:3、数据采集与处理:4、3D重建:应用3D视觉的重要性结构光在自动化中的作用线扫描在质量......
  • 【待做】【攻防技术系列+Linux后门】alias
    alias用法系统默认别名:alias设置别名:aliasls='ls-laih'删除别名:unaliasls加参数:aliasls='ls-laih;pwd'❗注意系统启动默认加载的配置文件:/etc/profile切换用户就会执行/etc/profile/etc/bashrcbashshell~/.bash......