BigBrother的大数据之旅 Day 4 Linux(4)

学习目标:

  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),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。

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

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

下图为ssh登录
在这里插入图片描述
下图为本地登录
在这里插入图片描述
​ 下面是每个进程的fd指向于文件表,但是实际的文件在节点表中,如果重定向就是把fd到文件表的指针指向其他地方.

Linuxæ–‡ä"¶æè¿°ç¬¦è¡¨ç¤ºæ„å›¾

补充: 同一个进程的不同文件描述符可以指向同一个文件;
不同进程可以拥有相同的文件描述符;
不同进程的同一个文件描述符可以指向不同的文件(一般也是这样,除了 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值