学习目标:

  1. 掌握shell的基本语法

    1. 变量

      1. 本地变量:作用在当前shellscript中
      2. 环境变量:作用在当前的shell(bash)及其子shell(bash)
      3. 局部变量
      4. 特殊变量 :$#, $?,位置变量:$1,$2,$3…
    2. 条件判断
      1. if 。。elif。。。 else
      2. 逻辑运算来做条件判断: && 或者 ||
      3. 条件表达式:数值比较,字符串,文件,权限。命令
    3. 循环
      1. for循环
      2. while循环
    4. 了解函数
    5. 了解case语句

1 bash编程

Shell 图形化和命令行两种,一个用户一旦登录就默认打开 /bin/bash

查看/etc/passwd最后一列就是用户打开的那个程序,/bin/bash 或者 nolgin

1.1 pstree命令

​ Linux pstree命令将所有行程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 为根

​ 通过ssh链接后敲入改命令的结果如下:

​ 通过本机敲入该命令的结果如下:

1.2 bash

​ Bash 是一个与 sh 兼容的命令解释程序,可以执行从标准输入或者文件中读取的命令(解释器),是许多Linux发行版的默认Shell(启动器).

​ 通俗地讲,用命令行和linux交换的界面就是一个bash(可能不太准确哦),有解释器和启动器的功能.

(1) source 命令 和 . 命令+文件

​ 从当前bash执行命令或者脚本

(2) bash命令 或者文件自己执行(./文件)

​ 从子bash执行命令(重新打开一个bash)
bash -x 文件 ,可以查看程序执行过程(debug)
​ bash -n 文件,检查是否有语法错误

下面的test1中写的为echo $$和pstree

2 文件重定向

2.1 fd

​ 一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。

文件描述符 文件名 类型 硬件
0 stdin 标准输入文件 键盘
1 stdout 标准输出文件 显示器
2 stderr 标准错误输出文件 显示器

​ 0,1,2比较特殊,代表着标准输入(键盘),标准输出(显示器)和错误输出(显示器)。一般指向于当前shell的终端,(包含输入输出设备).如果是本机的话是tty,ssh链接的话,指向的是ptsx(虚拟终端,x为数字,一般从0开始).他们都指向于dev下的设备文件.谁让linux中一切皆文件呢.

下图为ssh登录

下图为本地登录

​ 下面是每个进程的fd指向于文件表,但是实际的文件在节点表中,如果重定向就是把fd到文件表的指针指向其他地方.

补充: 同一个进程的不同文件描述符可以指向同一个文件;
不同进程可以拥有相同的文件描述符;
不同进程的同一个文件描述符可以指向不同的文件(一般也是这样,除了 0、1、2 这三个特殊的文件);
不同进程的不同文件描述符也可以指向同一个文件

2.2 输出重定向

重定向不是命令

​ 示例 /目录下不存在/abb目录下面是各种输出重定向

​ ls / 1>1.out : 把根目录下的list信息输出到1.out文件中

​ ls /abb 2>2.out:把错误信息重定向到2.out文件中

​ ls / /abb 1>3.out 2>4.out 把两种信息重定向到不同文件

​ ls / /abb 1>5.out 2>5.out 不能重定向到同一个文件,会覆盖优先输入的信息,该命令会覆盖错误信息,文件中只有/目录的 信息

​ ls / /abb 1>6.out 2>&1 把1信息重定向到6.out 把错误信息重定向到1,不会覆盖

​ 简单写法为 ls / /abb &>7.out 或者 ls / /abb >& 7.out

tips: > 前面没有空格,除了上面的&> 或者 >&的写法

2.3 输入重定向

​ <<< : 读取字符串 – read aad <<< “hello shell” 然后 echo $aad , 结果为hello shell

​ <<结束符: read aad<<EX 从键盘输入一些数据,遇到EX结束,第一行为aad的内容

​ < : 读取文件: cat 0</etc/passwd

tips: wc -l </etc/passwd : 查看passwd文件有多少行

3 shell编程

3.1 shell变量

环境变量:作用域为当前shell进程及其子进程;

export VARNAME=VALUE

VARNAME=VALUE

export VARNAME “导出”

查看本地环境变量: env命令

Q:为什么每个用户都可以使用 JAVA_HOME?

A:是因为每次用户登录进来后,都会启动~/.bashrc的文件,把变量export当前shell

本地变量

属于当前bash ,比如LANG=zh_CN.UTF-8,如果输入这个只是给当前bash设置了,其他没有设置,再启另一个,发现没有改变LANG的值

set VARNAME=VALUE: 作用域为整个bash进程;

局部变量(local) 虽然叫local其实是局部变量

属于一个函数

sxt(){

echo “sxt1”

local bbb =hello

}

local VARNAME=VALUE:作用域为当前代码段;

特殊变量

$?: 上一个命令的执行状态返回值;

程序执行,可能有两类返回值:

​ 0: 正确执行

​ 1-255:错误执行,1,2,127系统预留;

$#:位置参数个数

$*:参数列表,双引号引用为一个字符串

$@:参数列表,双引号引用为单独的字符串

$ $ (两个 $ 之间没有空格啊): 脚本运行时的当前进程的ID号,有时候会作为临时变量的后缀,haison.$$

位置变量:(文件和函数中使用)

$1,$2…

vim a.test

echo $1

echo $2

执行文件 source a.test a b

屏幕的结果为 a 回车 b

其他

管道| 管道命令会开启一个新的子bash,子bash会继承父bash里面的变量的值在其他情况下不会,需要export一下

•引用:

–双引号:弱引用,参数扩展 ,把引号中的变量进行替换

–单引号:强引用,不可嵌套,把引号中所有类容当成字符串

-翻引号: `` 命令替换当成命令去执行

–花括号扩展不能被引用

–命令执行前删除引用:加转义字符

3.2 shell 流程控制

(1) (())和let

(2) [ ] 和 test

test -a + 文件 : 判断文件是否存在

test -d + 目录或文件: 判断对象是否是目录

test 3 -gt 2 : 判断3 是否大于2 等价于 [ 3 -gt 2 ] – 记得3,2 前后都有空格哦

test 3 -lt 8: 判断3是否小于8 等价于 [ 3 -lt 8 ]

test 3 -le 3:判断3是否小于等于3

ps: 这些结果可以用 echo $? 查看命令的结果,本身没有任何输出
[ -e 文件] :测试文件是否存在

[ -f 文件] :测试文件是否是普通文件

[ -d 目录] :测试文件是否是目录

[ -n string ] : 判断字符串是否为空

[ -s string ] : 判断字符串是否不空

== ,!= 等号两端需要空格

(2.5补充) 表达式

a: [ expression ] – 使用 -a 进行逻辑与 ,使用 -o 进行逻辑或*
例如 if [ $# -gt 1 -a $# -lt 3 -o $# -eq 2 ];

b: test expression

c: 任何一个命令都可以作为条件表达式
其实就是(2)中的内容多了最下面的一条

(3) 创建用户的脚本

#! /bin/bash

useradd $1

echo $1 | passwd --stdin $1 – 设置与用户名相同的密码

echo “add user successfully”

(4) 控制语句

if ;then;else;fi

if test 3 -gt 2;then echo ok;else echo ook;fi – 如果3大于2,就输出ok,不大于输出ook

for((;; ));do;done(())里面的东东和java中类似,不用-gt -lt等直接用> <等就行

for((a=1;a<5;a++));do echo $a;done echo"haha" – 输出1-5的数字,最后输出haha

加强for循环 for in 1 2 3 4 5;do echo $i;done

输出1-5的最简单的写法为 seq 5

while(());do;done 和for一样的 也可以 写为 while [ ];do;done [ ]中写条件 这里就需要写成-gt的格式了
ps: set ts = 4 设置tab为4个字符

case 语句
case 变量 in
value1)
语句
;;
value2)
语句
;;
*) – 默认(其他情况)
语句
;;
esac

tips: /dev/null 为"黑洞文件"可以把输出重定向"吃掉" 如 echo “ha” > /dev/null

shadow文件: 加密密码后的第一个数字为用户创建时间,距离1970年的天数,密码最小使用天数,密码最大使用天数,密码距离最大使用天数前多少天进行警告.

(5)算数运算符

a: let 算数运算符表达式

​ let c=$ A+$ B

b: $[算术表达式]

​ C = $ [$ A+$ B]

c: $((算术表达式))

​ C=$ (($ A+$B))

d:expr 算术表达式1、
注意:表达式中各操作数及运算符之间要有空格。而且要使用命令引用

​ C = expr $A+$B

(6)函数

函数的定义

function 函数名(){

}

1 function可以省略,()不能省略,

2小括号中不能定义参数

3 函数体中可以定义函数,叫嵌套函数

4 函数体中可以写return,只能返回0-255之间的数字,代表当前函数的执行状态,如果没有retrun,执行状态为最后一行命令的状态

函数的调用

函数名就行,不要写小括号

给函数进行传递参数, 例如test(){

​ echo $1

}

函数调用test 100,如果在脚本中写,函数不能直接获取从键盘中输入的值

vim /etc/inittab

0 关闭模式

1 单机

2 无网络

3 默认为3的,完整模式

4 自定义

5 图形化界面

6 重启

chkconifg 345 10 90 :在3,4,5级别上启用,10启动的优先级 越小越优先,一般调整到比较靠后的比如99,90为关闭的优先级

chkconfig tomcat on 加入开机

chkconifg --list 查看列表

参考文章:

1 关于fd(这篇文章写得很好)

http://c.biancheng.net/view/3066.html

BigBrother的大数据之旅 Day 4 Linux(4)相关推荐

  1. BigBrother的大数据之旅 Day 1 Linux(1)

    Today is a new day! 1 scala是大数据的主流编程语言 Scala是一种强大的JVM语言,混合了函数式和面向对象编程范式 2 大数据的本质为:分布式计算 3 大数据中常见的数据类 ...

  2. BigBrother的大数据之旅Day 2 Linux(2)

    1vi和vim vim是vi的升级版,加入了高亮更适合编程,是liunx中的文本编辑器 1.1vim + 文件: 打开文件,光标移动到末 1.2 vim +数字 文件: 打开文件,光标移动到数字行 1 ...

  3. BigBrother的大数据之旅 Day 3 Linux(3)

    1 安装软件 1.1 编译安装 1 编译安装步骤: (1) ./config 生成依赖关系, ./configure --prefix=/usr/nginx-1.8(指定一个不存在的目录) (2) m ...

  4. BigBrother的大数据之旅 Day 5 负载均衡

    BigBrother的大数据之旅 Day 5 负载均衡 学习目标: 掌握nginx集群 nginx的配置文件基本配置 Location(难点,重点) 一个配置属性:根据用户的请求地址,去服务器上匹配文 ...

  5. BigBrother的大数据之旅Day 13 hbase(2)

    HBase(2) 详述人员角色表的设计思路以及实现 思路:两个部分的信息分别保存到两张表中,因为hbase是列存储的表,一般存储非关系数据,就像记笔记一样,把关键点写上. 第一张表: 个人信息表 ro ...

  6. BigBrother的大数据之旅Day 12 Hbase(1)

    HBASE (Hadoop Database)是个高可用,高性能, 面向列可伸缩.实时读写的分布式数据库 Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase ...

  7. BigBrother的大数据之旅Day 14 某项目流程

    某平台日志项目流程 架构分析 1 埋点程序把数据 以url的方式提交给nginx服务器 2 nginx服务器把日志信息(文本文件)保存到本地硬盘 3 flume,安装中nginx上通过主动方式读取日志 ...

  8. BigBrother的大数据之旅Day 15 sqoop

    sqoop part one 1 数据迁移工具 2 通常用于hdfs和关系型数据库之间 3 实质是mapreduce 4 数据的导入导出是从hdfs的角度来说的,谁让sqoop是apache的东西呢 ...

  9. BigBrother的大数据之旅Day 11 hive(2)

    HIVE参数 命名空间 读写权限 含义 hiveconf 可读写 hive-site.xml当中的各配置变量 例:hive --hiveconf hive.cli.print.header=true ...

最新文章

  1. FutureTask中Treiber堆的实现
  2. javaweb项目开发日志的原理,方式
  3. leangoo新增自定义模板、移动卡片、复制泳道功能
  4. Java新手问题集锦
  5. harmonyos 2.0怎么升级,HarmonyOS 2.0正式发布 分布式能力获得全面升级
  6. LeetCode-Remove Duplicates from Sorted Array-从有序数组移除重复-简单逻辑
  7. [GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(中)
  8. 深度学习入门首推资料--吴恩达深度学习全程笔记分享
  9. ASP.NET 常用语句代码
  10. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_7_练习_对文本的内容进行排序...
  11. poj 1087.A Plug for UNIX (最大流)
  12. ​「5G消息」的最新消息
  13. 手把手教你开发 MyBatis 插件
  14. 假定一种编码的编码范围是a-y的25个字母,形成一个数组如下: a,aa,aaa,aaaa,aaab,aaac,...yyyy 其中a的Index为0aa的Index为1aaa为2,以此类推。
  15. 局域网内的ARP断网攻击
  16. 自除数的判断——C语言实现
  17. 关于log4j的参数含义
  18. MFC实现CIE1931
  19. 模式识别 | PRML概览
  20. 游戏出海正当时,突破文化壁垒或成为关键

热门文章

  1. 从零开始写一个小米便签
  2. oracle数据库事务日志已满,SQL Server中已满事务日志原因的检测(上)
  3. 小科普:什么是屏幕分辨率
  4. DFC Session Management 白皮书
  5. BP_TOOLS_MODE[] = bp-tools
  6. 4.7 matlab交互式绘图工具(绘图工具栏)
  7. 疫情后推动出行即服务
  8. “打开方式”中找不到打开某一类型文件想使用的软件
  9. kafka生产者的发送消息的流程以及代码案例
  10. 计算机网络安全-----Internet安全