笔记2

重定向和管道符:

1.重定向
程序 = 指令 + 数据
命令 变量


在程序中,数据如何输入?又如何输出?

数据输入:键盘 -- 标准输入,并不是唯一输入方式
--stdin
echo "123456" | passwd --stdin "username"

例如:功能添加用户 useradd.sh txt文本文档1000个用户
./useradd.sh a
./useradd.sh b
...

./useradd.sh < user.txt

while line ; do
循环体
done < /etc/passwd

数据输出:显示器 -- 标准输出,但并不是唯一输出方式
ls /etc/ > a.txt

fd文件标识符 0-9 -- 相当于给文件分类;
0 1 2
0 -- 标准输出
1 -- 标准输入
2 -- 错误输入输出(标准错误)

常见重定向符号
1.标准输出
> 覆盖重定向,非常危险
set -C //关闭覆盖重定向功能
>| //强制重定向
>> 追加重定向
不覆盖
2.标准输入
< tr 替换文件内容
tr set1 [set2] < file.txt
<< 将多行数据同时输入
cat >>a.txt<<EOF
>1
>2
>3
>EOF
3.错误输出
2>
扩展:不需要输出内容,只需要输出状态;
ls /etc/ > /dev/null
if [ $? -eq 0 ];then
循环体
if
2>> &> &>> == 2&>1
ls /etc/&> /dev/null


2.管道 - tee

command1 | command2 | command3 | ... ...
前一个命令的执行结果交给后一个命令来执行
【Linux思想:结合小功能实现大功能】
free -m | grep "^Mem" | cut -d' ' -f19
free -m | grep "^Mem" | awk '{print $3}'

tee 一路输出,两路输出
tee /tmp/tee.out
如果没有文件,会创建,默认如果文件存在有内容,会覆盖;

练习:
将/etc/passwd文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中;
head -5 /etc/passwd | tr [a-z] [A-Z] > /tmp/passwd.out

将登录至当前系统上用户信息汇总的后3位信息转换为大写后保存至/tmp/who.out文件中;
who | tail -3 | cut -d' ' -f1 | [[:lower:]] [[:upper:]] | tee /tmp/who.out

tail 查看文件尾部多少行
3.文本处理工具 - wc,cut,sort,uniq


shell脚本语言介绍
优点:调用os(操作系统)的命令行,来实现所以功能;
缺点:没有库调用(区分Python)

shell脚本包括:1.*命令* 2.变量(全局变量,局部变量,本地变量,传参)3.逻辑关系

shell的第一句话!!!
#!/bin/bash --定义脚本解释器(普遍认为#为注释行,这里特殊)shebang
#!/usr/bin/python

/etc/shells --查看当前系统支持的shell程序
echo $SHELL --查当前会话的shell程序
/etc/passwd --制定了用户默认支持的shell程序(/sbin/nologin)

shell的执行:
1.bash命令来执行脚本
-n 查看shell脚本的逻辑错误(注意:单词写错查不出)
-x 逐行显示执行的脚本程序
2.授权 chmod u+x filename.sh
使用全路径执行脚本,即可

3.变量
环境变量
局部变量 declare 命令 --定义变量类型
本地变量 local在函数中使用

变量类型:
数值型:
1.整形 int
2.浮点型 float
3.布尔型 0(True) 1(False)
字符型:
1.普通字符及字符串
2.数组

编程语言的分类:
强类型语言:数值必须被定义,才能进行处理或运算
弱类型语言:编程语言可以自动识别变量类型
【*多态*一个数据具有多个属性,而最后使用的属性取决于和它进行运算的数据】

传参
$? --上一条命令的执行状态 0 正确 1-255 错误
$1 $2 ... ${10} --命令后面传入脚本的数据,以空格为分隔符
$# --传统传参数量${$#}
$* --表示所有传参,所有的传参以字符串形式进行输出
$@ --表示所有传参,所有的传参以列表的形式进行输出
【工作中要对所以的传参进行操作的时候,就要考虑$*和$@】

定义变量格式:
NAME=VALUE
我们通过命令declare定义变量类型
declare -i 整数 int() str()
declare -a 数组
变量命令:
1.下划线的方式指定变量名称
2.驼峰命令方式

test文件测试,条件判断
在脚本中,我们需要进行语句分支;说白了,就要做判断
判断就是使用test命令来实现;
使用格式:
1.test [option] file
2.[语句条件]
常见的test选项:
比较选项:
-eq
-ne
-gt
-ge
-lt
-le
判断选项:
-f
-d
-L
-r -w -x
关联选项:
-o 代表或
-a 代表与
! 代表非
字符串判断:
= 判断两边的字符串是否相等
!= 不等于
-z 判断字符串是否存在
-n 和 -z 相反,存在为假,不存在为真

逻辑运算
与 && 两边的命令都为真,结果才为真
或 || 两边的命令一边为真就是真,同时为假才是假
非 !=

这个逻辑运算符,前后对接的都是单独存在的命令;
[ $? -eq 0 ] && exit 0 || exit 1

算术运算
*let 1+1