1.一切皆文件
2.使用纯文本文件保存软件配置信息
3.功能单一的小程序组合完成复杂任务
bash -n 脚本名称
只能大致的测试出一些明显语法错误
bash -x 脚本名称
写大段脚本时常用
pwd:printing working directory
ls
-l:长格式
文件类型:
-:普通文件
d:目录文件
b:块文件(block)
c:字符串文件(character)
l:符号连接文件(symbolic link files)
p:命令管道文件(pipes)
s:套接字文件(socket)
文件权限:9位,每三位一组:rwxr--r--:rwx(读、写、执行)(属主),r--(属组),r--(其它)
文件硬连接的次数
文件的属主(owner)
文件的属组(group)
文件大小(size),单位是字节
时间戳(timestamp):最近一次被修改的时间
访问:access
修改:modify,文件内容发生改变
改变(属性或者元数据改变):change,metadata,元数据(属性数据)
-h:文件大小单位换算 ls -l -h
-a:显示以.开头的隐藏文件(-A:不包含.和..)
-d 查看目录
.:表示当前目录(英文句号)
..:表示父级目录
-i:index node,inode(索引节点)
-r:逆序显示文件
-R:递归显示(recursive)
COMMAND --help
命令手册:manual
man COMMAND
man分章节:
1:用户命令
2:系统调用
3:库调用
4:特殊文件(设备文件)
5:文件格式(配置文件的语法)
6:游戏
7:杂项:(Miscellaneous)
8:管理命令(/sbin , /usr/sbin , /usr/local/sbin)
whatis 显示命令在手册哪个章节
man手册中命令解释:
<>: 必须给出的选项
[]: 可以省略
...:可以出现多次
|:多选一
{}:分组,无特殊意义
SYNOPSIS:用法说明,包括可用的选项
DESCRIPTION:命令功能详尽说明,可能包括每个选项的意义
OPTIOND:说明每个选项的意义
FILES:此命令相关的配置文件
EXAMPLES:使用示例
SEE ALSO :另外参照
翻屏:
向后翻一屏幕:SPACE
向前翻一屏幕:b
向后翻一行:ENTER
向前翻一行:k
查找:
/KEYWORD:向前查找
n:下一个
N:前一个
q:退出
?KEYWORD:向后查找
-w:将系统时间同步到硬件时间
-s:将硬件时间同步到系统时间
在线手册/文档:
info COMMAND
file 命令
rootfs:根文件系统
FHS:Linux
/boot:放系统启动相关的文件,如内核、initrd、grub(bootloader)
/dev:设备文件
设备文件:(字体黄色,背景黑色为特殊文件作为访问设备的入口)
块设备:随机访问,数据块
字符设备:线性访问,按字符为单位
设备号:主设备号(major)和次设备号(minor)
/etc:配置文件存放文件夹
/home:用户家目录,每个用户的家目录默认为/home/USERNAME
/root:管理员的家目录
/lib:库文件及内核模块文件目录
/lib/modules:内核模块
库文件:静态库
动态库(win:.dll linux:.so(shared object))
/media:挂载点目录,移动设备
/mnt:挂载点目录,额外的临时文件系统
/opt:可选目录,第三方程序的安装目录
/proc:伪文件系统,内核映射文件
/sys:伪文件系统,跟硬件设备相关的属性映射文件
/tmp:临时文件,/var/temp
/var:可变化的文件,会随系统使用时间增大
/bin:可执行文件,用户命令
/sbin:管理命令
/usr: universal shared read-only
/usr/bin
/usr/sbin
/usr/lib
/usr/lib
/usr/local:
/usr/local/bin
/usr/local/sbin
/usr/local/lib
文件夹及文件命名规则:
1.长度不能超过255个字符
2.不能使用/当文件名
3.严格区分大小写
相对路径:与当前位置有关
绝对路径:从根目录开始
使用操作系统干些什么?
文件管理
运行程序
内存管理
设备管理
软件管理
进程管理
网络管理
目录管理
ls
cd
pwd
文件创建和删除
mkdir:创建空目录(路径最后的那个目录才是创建的)
-p:一次性创建多层的目录
-v:详细信息:创建多层的目录展示每层的创建情况
eg:/mnt/test/x/m,y
mkdir -pv /mnt/test/x/m /mnt/test/y
mkdir -pv /mnt/test/{x/m,y}
rmdir:-p 删除一脉单承的目录
命令行展开:
/mnt/test/
a_b,a_c,d_b,d_c
(a+d)(b+c) = ab + ac + db + dc
mkdir -pv /mnt/test/{a,d}_{b,c}
touch:改变时间戳
-a
-m
-t
-c
stat:展示文件或文件系统状态
tree:查看目录树
ASCII:
128个不同字符:
7位二进制
计算机存储数据基本单位:字节8位
nano;简单的文本编辑器
-i 交互式,询问是否删除
-f 强制删除
-r 递归删除目录及文件
-rf 直接删除目录不提示
rm -rf / 删除根目录及其所有目录文件,所有文件会被清空,无法重启系统,绝对致命!!!
cp SRC DEST
-r 递归复制一个目录及目录下所有文件
-R 递归复制一个目录及目录下所有文件
-i
-f
-p
-P 保持复制的链接而不拷贝链接指向的文件
-a 归档复制,常用于备份 (archive)
cp file1 file2 file3(only file3 is destination)
一个文件到一个文件
多个文件到一个目录
cp /etc/{passwd,inittab,rc.d/rc.sysinit} /temp 复制三个文件到/temp/
移动文件
mv SRE DEST
mv -t DEST SRC
mv file1 file2(file1 被重命名为 file2)
-d DIRECTORY... 创建目录
install SRC(文件) DEST 复制文件
install -t DEST(文件) SRC
目录管理总结:ls cd pwd mkdir rmdir tree
文件管理总结:touch cat file (查看文件内容类型) rm cp mv nano
日期时间:date hwclock clock cal
文本处理命令:cat,more,less,head,tail,cut,sort,uniq,grep
对于Linux系统而言,文本文件行结束符是$
windows的文本行结束符是“$+回车”
查看文本类:
cat tac more less head tail
cat:链接并显示
-n
-E
tac:从最后一行开始显示
head:查看前n行(默认10行)
tail:查看后n行(默认10行)
-n
tail -f :查看文件尾部,不退出,等待显示后续追加至此文件的新内容
分屏显示:
more,less
处理文本类:
cut,join,sed,awk
讲cut之前:
database:数据库
关系型数据库:
表:二维表 可以没有行不能没有列
-d:指定字段分隔符,默认为空格(如-d : 表示用:做分隔符)
-f:指定要显示的字段
-f1:显示第一个字段
-f1,3:显示第一和第三个字段
-f1-3:显示第一到第三个字段
默认anASCII码顺序升序
-n 数值大小升序排序
-r 降序
-t 字段分隔符
-k 以那个字段为关键字进行排序
-u 排序后相同的行只显示一次 //如果是不相邻的行则不认为是相同行
-f 排序时忽略字符大小写
sort -u /...= uniq /...
uniq -d 只显示重复的行
-D 显示所有重复行
-c 显示所有行,并且显示某行重复的次数
-l 行数
-w 单词数
-c 字节数
-L 最长一行
tr 'ab' 'AB' 将输入的字符含有ab的转换为AB
< 输入重定向
tr 'ab' 'AB' < /home/test.txt 将 /home/test.txt 中所有ab转换为AB
tr -d 删除出现在字符集中的字符
shell :外壳,可执行程序
广义上shell包括:GUI:Gnome,KDE,Xface
CLI:sh,csh(支持编程,编程风格接近C语言),ksh,bash,tcsh,zsh
进程是一个程序的副本,是程序执行的实例。
同时登陆多个用户,有一个shell程序,有多个shell进程。每个进程认为当前系统只有内核和当前进程,意识不到其他进程的存在。
同一个用户可以登陆多次。
系统识别进程靠进程号,进程可以同名。
用户工作环境:
对bash而言:# 管理员
$ 普通用户
shell,子shell(shell 中可以再打开shell)
子shell和父shell彼此无法意识到对方的存在,对某一个shell的环境设置对另一个shell的环境没有关联
bash特性:
1.命令历史、命令补全
2.管道、重定向
3.命令行别名
alias CMDALIAS='COMMAND [options][arguments]'
在shell中定义的别名,只能在当前shell进程起作用。对其他shell讲无效。eg:alias cls=clear
撤销别名:unalias CMDALIAS eg:unalias cls(别名)
\CMD 别名为某些命令加选项时,使用命令本身
命令替换:$(CMMAND) 或者 反引号(波浪线上的引号)`COMMAND`
把命令中某个子命令替换为其执行结果的过程
echo "the cuttent directory is /root."
echo "the current directory is $(pwd)."
例子:创建一个文件,文件名为当前时间:file-2019-02-22-12-10-50.txt
touch ./file-$(date +%F-%H-%M-%S).txt
touch 'a b' 文件名包含了空格,实际最好不要包含
bash支持的引号:
``:变量替换
"":弱引用,可以实现变量替换
'':强引用,不完成变量替换
4.命令行编辑
5.命令行展开
6.文件名通配:globbing
*:匹配任意长度的任意字符 eg: ls a*:显示a开通后跟任意字符的文件
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符 eg:[abc],[a-m],[a-z],[0-9],[a-zA-Z].[0-9a-zA-Z]
[^]:匹配指定范围外的任意单个字符 eg:[^0-9] 非数字
[:space:]:空白字符
[:punct:]:标点符号
[:lower:]:小写字母
[:upper:]:大写字母
[:alpha:]:大小写字母
[:digit:]:数字
[:alnum:]:数字和大小写字母
#man 7 glob 查看相关内容
1.显示所有以a或者m开头的文件:
ls [am]*
2.显示所有文件名包含了数字的文件:
ls *[0-9]*
ls *[[:digit:]]*
3.显示所有以数字结尾且文件名中不包含空白字符的文件:
ls *[^[:space:]]*[[:digit:]] 此表达方式不精确,正则表达式可以解决这个问题
4.显示文件名包含了非字母或数字的特殊符号的文件:
ls *[^[:alnum:]]*
7.支持变量
8.支持编程
命令编辑特性:
光标跳转:
Ctrl+A:跳到命令行行首
Ctrl+E:跳到命令行行尾
Ctrl+U:删除光标到命令行行首的内容
Ctrl+K:删除光标到命令行行尾的内容
命令历史:history
bash自动记录过去使用过的命令,保存在缓冲区
history -c :清空命令历史
-d 500:删除第500个历史记录
-d 500 10:从第500个开始删除10个
-w 保存命令历史至历史文件
命令历史使用技巧
!n :执行命令历史中的第n条命令
!-n:执行命令历史中的倒数第n条命令
!!:执行上一条命令
!string(指定字符串):执行命令历史中最近的以指定字符串(string)开头的命令
!$:引用上一个命令最后一个参数
Esc+.:引用上一个命令最后一个参数
Alt+.:引用上一个命令最后一个参数
命令补全:按Tab键在path环境变量下搜索补全
路径补全:在所给的开头路径查找
不唯一,则两次按Tab键,显示以相应字符串开头命令
环境变量
PATH:命令搜索路径
HISTSIZE:命令历史大小(变量) redhat默认1000条(echo %HISTSIZE 查看变量HISTSIZE的大小)
SHELL: echo $SHELL
用户:获取资源或者服务的标识符
用户组:同样属于标识符
用户的容器就是组,容器关联着访问计算机资源的权限,用户组-方便指派权限
谁发起进程,该进程就代理谁操作计算机,进程也有属主--这叫进程的:安全上下文(security context)
9位,每三位一组:rwxr--r--:rwx(读、写、执行)(属主),r--(属组),r--(其它)
目录权限:
r:可以对此目录执行ls列出内部所有文件;
w:可以在此目录创建文件;
x:可以使用cd切换进此目录,也可以使用ls -l查看内部文件详细信息
默认不应该让文件有x权限,但是目录应该有x权限
000:---
001:--x
010:-w-
011:-wx
100:r--
101:r-x
110:rw-
111:rwx
数字表示权限:755:rwxr-xr-x
rw-r-----:640
标识用户:UID /etc/passwd
标识组 :GID /etc/group
解析:名称解析,将用户名转换为UID,相对应数据库 /etc/passwd(用户数据库文件,用户密码在此不可见,在shadow)
将组转换为GID,相对应数据库 /etc/group
/ect/shadow 存放用户密码
/ect/gshadow 存放组密码
管理员:UID:0 内部法则改不了
普通用户:UID: 1-65535 0给了管理员
系统用户:1-499 专门用来运行某一类服务进程、后台进程,限制其不能登录系统
一般用户:500-60000
管理员组:
普通组:
系统组:
一般组:
·或者这样分类·
私有组:创建用户时,若没有给用户指定组,则系统会为其分配一个 私有组。
基本组:用户的默认组,每个用户都有一个基本组,只有该用户的组
附加组(额外组):
进程:tom(属主) tom(属组)
对象:rwxrw-r-- jarry tom a.txt 该进程以rw-权限访问a.txt
eg:tom:ls
rwxr-xr-x root root /bin/ls
tom 以其它用户(r-x)的身份访问ls命令,ls相关的进程启动后其身份决定于tom(发起人)。
account:登录名
password:
UID:用户ID
GID:基本组ID
comment:用户注释信息
HOME DIR:家目录
SHELL:用户默认shell
/etc/shadow 中字段:
account:登录名
encrypted password:加密的密码
加密方法:对称加密,加密和解密使用同一个密码
公钥加密,每个密码成对出现,一个为公钥(public key),一个为私钥(secret key)
公钥加密只能使用对应的私钥解密,公钥加密安全性比私钥加密高,速度慢的多。
单向加密,也叫散列加密,用来提取数据唯一的特征码(如指纹)。做数据完整性校验,非可逆。
单向加密特性:1.雪崩效应:输入微小变化,特征值就变化巨大,防破解。蝴蝶效应:初始条件的微小变化能引起结果的巨大变化。
2.定长输出
MD5(message digest):128为定长输出,版本5
SHA1(SECURE Hash Algorithm),160位的定长输出
SHA256,SHA512军用级加密算法
增加一个用户:命令:useradd 用户名 增加的用户默认配置在/etc/default/useradd
修改该用户密码:命令:passwd 用户名
手动添加一个组:groupadd 组名 增加的组配置文件列表/etc/group
useradd,userdel,usermod,passwd,chsh,chfn,finger,id,chage(改变用户外围属性)
id:查看用户账号属性信息
-u -g -G -n 等
finger:查看用户账户信息
useradd [options] USERNAME
-u UID(>=500)
-g GID(指定 基本组)
-G GID,...附加组可以有多个,用逗号隔开
-c "COMMENT" 指定注释信息
-d /path/to/somedirectory 指定其家目录
-s /bin/bash (指定shell路径)
/etc/shells:指定了当前系统可用的安全shell
-m -k 为新增用户创建家目录,并将/etc/skel文件拷贝到家目录,该文件为用户
shell环境配置文件
-r 添加一个系统用户,不允许登录系统,没有家目录
-M 不创建家目录
/etc/login.defs 规定创建用户时所要做的动作的配置文件
手动添加一个用户可以分别编辑三个文件,在每个文件中增加一行:
/etc/passwd
/etc/group
/etc/shadow
userdel:userdel [options] USERNAME
-r 删除用户的同时删除家目录,默认不删除
+
..
usermod
-u UID USERNAME
-g GUI GROUPNAME
-a -G GROUPNAME 指定多的附加组,使用-a表示不覆盖之前的附加组
-c 指定注释信息
-d 指定新的家目录,如果此前用户登录过创建了很多文件,则之前的目录无法访问了
-d -m 指定新的家目录的同时,移动之前的文件至新的家目录
-s 指定新的shell
-l 改loginname
-L 锁定账号
-U 解锁账号
更多信息 man usermode
chsh USERNAME 修改改默认shell
chfn USERNAME 修改注释信息
密码管理:
passwd [USERNAME]
--stdin 从标准输入接受密码 ehco "redhat" | passwd --stdin user3
-l 锁定账号密码
-u 解锁账号密码
-d 删除密码 默认redhat不允许无密码账号登录系统
pwck 检查用户账号完整性
groupadd,groupdel,groupmod,gpasswd
groupadd
-g GID 指定GID
-r 添加系统组
groupmod
-g GIU 修改GID
-n 修改组名
groupdel [GROUPNAME] 删除组
gpasswd [GROUPNAME] 为组设定密码
newgrp GROUPNAME 登录到新组,使用exit退出
chage(change age):改变账号的变动修改信息
-d 最近一次的修改时间
-E 过期时间
-I 非活动时间
-m 最短使用期限
-M 最长使用期限
-W 警告时间
cal 查看日历
1.创建一个用户mandriva,其id号为2002,基本组为distro(id 2003),附加组为linux;
#groupadd -g 2003 distro
#groupadd linux
#useradd -u 2002 -g distro -G linux mandriva
2.创建一个用户fedora,其全名为Fadora Community,默认shell为tcsh;
#useradd -c "Fadora Community" -s /bin/tcsh fadora
3.修改mandriva的id号为4004,基本组为linux,附加组为distro和fadora;
#usermod -u 4004 -g linux -G dostro,fadora mandriva
4.给fadora加密码,并且设置其密码最短使用期限是2天,最长为50天;
#passwd -n 2 -x 50 fedora
5.将mandriva的默认shell改为/bin/bash;
#usermod -s /bin/bash mandriva
#chsh -s /bin/bash mandriva
6.添加系统用户hbase,且不允许其登录系统
#useradd -r -s /sbin/nologin hbase
权限管理:chown,chgrp,chmod,umask,
r
w
x
chgrp 改变属组:
chgrp GROUPNAME file1,...
-R 递归修改,修改目录及内部文件的属组
--reference=/path/to/somefile file,...(将file,...的属组设置为/path/to/somefile的属组)
chmod 修改文件权限:
1.chmod修改三类用户权限:
chmod MODE file,...
-R
-reference
rwxr-xr--:chmod 750 /tmp/asd (若为75,则默认075,一定要给够3位数)
2.修改某类用户或某些类权限
u,g,o,a(all)
chmod 用户类别=MODE file,... #MODE=rwx,r-x,--x,...
chmod g=r,o=r file 相当于 chmod go=r file
chmod go=rw,u= #=号后面不给,改为没有任何权限
3.修改某类用户的某位或某些位
chmod u+|-(r/w/x) file,... eg:chmod u-x asd 表示将属主的执行权限去除
eg:chmod u+x asd 表示将属主的执行权限添加
1.新建一个没有家目录的用户openstack;
#useradd -M openstack
2.复制/etc/skel为/home/openstack;
#cp -r /etc/skel /home/openstack
3.改变/home/openstack及其内部的属主属组均为openstack;
#chown -R openstack:openstack /home/openstack
4./home/openstack及其内部文件,属组和其它用户没有任何访问权限
#chmod go= /home/openstack
使用 su - openstack 查看更改是否成功
1.手动添加用户hive,基本组为hive(500),附加组为mygroup
分别编辑:/etc/group
/etc/passwd
/etc/shadow
chmod
chown
用户创建文件目录时计算默认权限使用的umask ,管理员umask=022,普通用户umask=002
创建文件后的权限=666-umask ,文件默认不允许有执行权限,如果创建文件时使用
umask算出有执行权限,则权限数值自动加1。
创建目录后的权限=777-umask
1.登录式shell
正常通过某终端登录:su - USERNAME; su -1 USERNAME;
2.非登录式shell
su USERNAME
图形终端中打开的命令窗口
自动执行的shell脚本
全局配置
/etc/prfile,/etc/profile.d/*.sh,/etc/bashrc
编辑以上任何一个文件内容,对所有用户生效
个人配置
~/.bash_profile,~/.bashrc
prfile类的文件作用:
设定环境变量
运行命令或者脚本:登陆前的准备工作
bashrc类的文件作用:
设定本地变量
定义命令别名
读取顺序:
/etc/prfile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc/ --> etc/bashrc
读取顺序:
~/.bashrc/ --> etc/bashrc --> /etc/profile.d/*.sh
bash.脚本解释器
2019.03.07 练习:
1.显示一个文件的行数,不显示其它信息:
wc -l /etc/passwd
wc -l /etc/passwd | cut -d'' -f1
2.统计/usr/bin/目录下的文件个数:
ls /usr/bin | wc -l
3.取出当前系统上所有用户的shell,要求:每个shell只显示一次,按顺序显示
cut -d: -f7 /etc/passwd | sort -u
4.如何显示var/log目录下的每个文件类型
file /var/log `ls /var/log`
5.取出/etc/inittab文件的第六行
head -6 /etc/inittab | tail -1 #先取前6行再取最后一行,就是第6行
6.取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示在屏幕并保存至/tmp/users
tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users
7.显示/etc目录下所有以pa开头的文件,统计个数
ls -d /etc/pa* | wc -l
8.不使用文本编辑器,将alias cls=clear 一行内容添加至当前用户名的.bashrc文件中
echo "alias cls=clear" >> ~/.bashrc
文本查找的需要:
grep,egrep,fgrep
grep :根据模式,搜索文本,并将符合模式的文本行显示出来。
Pattern:文本字符和正则表达式的元字符组合而成的匹配条件:''中的内容
grep [OPTIOND] PATTERN [FILES...]
基本正则表达式:Basic REGEXP
.:
[]:
[^]:
次数:
*:其前0次1次任意次
\?:0或1次,可有可无
\{m,n\}:至少m次,至多n次:\{0,无穷大\}
锚定:
^:锚定行首:^
$:锚定行尾:$
\<:锚定词首:\<,\b
\>:锚定词尾:\>,\b
分组与引用:
\(\):
\1,\2,\3,...
grep :使用基本正则表达式定义的模式来过滤文本的命令:
-i:忽略字符大小写
-v:反向搜索,不显示模式匹配匹配到的字符,显示未匹配到的字符
-o:只显示匹配到的字符串
--color 显示颜色
-E 使用扩展正则表达式
-A n:(after)当某一行被grep所指定的模式匹配到以后,不但显示该行还会显示之后的n行
-B n:(before)当某一行被grep所指定的模式匹配到以后,不但显示该行还会显示之前的n行
-C n:(context)当某一行被grep所指定的模式匹配到以后,不但显示该行还会显示前后的各n行
位置锚定
锚定行首:^ 其后面的任意字符必须在行首出现
锚定行尾:$ 其前面的任意字符必须在行尾出现
空白行:^$ 用于找出文件中空白行
锚定词首:\<(\b):其后面的任意字符必须作为单词首部出现
锚定词尾:\>(\b):其前面的任意字符必须作为单词的尾部出现
eg:\ 在整个文件中搜索root这个词
分组
\(\):
eg:\(ab\)* :ab这个整体可以出现0次1次任意次
后向引用
\1:引用第一个左括号以及与之对应的右括号所包括的所有内容
grep '\(l..e\).*\1' test1.txt
\2:
字符匹配:
和基本正则表达式相同:.,[],[^],...
次数匹配:
*:
?:0或1次,可有可无
+:相当于\{1,\},匹配其前面的字符至少一次
{m,n}:至少m次,至多n次:\{0,无穷大\},不再加\
位置锚定:
和基本正则表达式一样
分组:
():分组
\1,\2,\3,...
或则
|:or,
eg:C|cat:C或cat
eg:(C|c)at:Cat或cat
练习:
找出ifconfig命令结果中的1-255之间的整数
grep -E ’ ’
或egrep ‘’
grep,egrep,fgrep
fgrep:fast,不支持正则表达式,所以比较快
编译器,解释器
编程语言:
机器语言、汇编语言、高级语言
高级语言:
静态语言:编译型语言(C、C++、JAVA、C#)
强类型(变量)语言
关键字:能够被编译器直接转换为二进制机器代码
动态语言:解释型语言(PHP,ASP.NET,SHELL,Python,perl)执行特性:on the fly
通常是弱类型语言
不需要转换为二进制机器代码,运行时逐句转换;边解释边执行
shell脚本的运行需要bash作为解释器
面向对象
适合于开发大型运用程序
面向过程
linux内核为面向过程的C开发的
面向对象和面向过程没有好坏之分,每种语言都有适用的场景
shell脚本面向过程
JAVA完全面向对象
Python完全面向对象
Perl面向过程和面向对象特性
C++面向过程和面向对象特性
编程能力:
脚本编程
变量:内存空间
内存:编址的存储单元
进程:程序运行起来叫进程
变量:存储的数值不一样,分配的空间不一样
10:存储为字符,16位,一个字符8位
10:存储为数值1010,4位(占用8位,计算机最小存储单位,字节,为8位)
变量类型:(事先确定数据的存储格式和长度)
字符
数值
整型
浮点型:如11.23可以存储为:1.123*10^1或者0.1123*10^2
如存储2013/10/10:存储为字符64位
存储为数值:1970-2013有一万多天,使用24位可存储下
真、假数据类型bool:
逻辑:1+1>2
逻辑运算:与、或、非、异或
shell:弱类型编程语言
强类型:变量在使用前,必须事先声明,甚至还需要初始化;
弱类型:变量用时声明(拿来直接用),甚至不需要区分类型
11+c=?
隐式转换
显式转换
NULL:空,什么都没有
0不是空
变量赋值:VAR_NAME=VALUE 填变量代表的存储空间
环境变量
本地变量(局部变量)
位置变量
特殊变量(bash内置,保存某些特殊数据的变量,也有人称为系统变量)
本地变量:声明 VARNAME=VALUE 整个bash进程可以使用
bash :bash进程的变量,shell中直接声明:NAME=Jerry
echo $NAME
不同shell(子shell父shell)中声明的变量互不相关
局部变量:声明 local VARNAME=VALUE 对当前代码段有用
环境变量: 声明 export VARNAME=VALUE 作用域:整个shell进程及子进程可以使用
‘导出’
脚本在执行时会启动一个子shell进程:
命令行中启动的脚本会继承当前shell环境变量
系统自动执行的脚本(非命令启动)就需要自我定义需要的环境变量
位置变量:
$1,$2,…
特殊变量:
$?:上一个命令执行状态返回值
程序执行,可能返回两类返回值:
程序执行结果
程序状态返回代码(0-255)
0:执行正确
1-255:执行错误
一般:1,2,127系统预留
输出重定向:
>
>>
2>
2>>
&>
/dev/null:设备,软件模拟的设备,软设备;又叫 bit bucket,给什么吃什么,数据黑洞。
ls /etc/passwd &> /dev/null
同时重定向,命令行无输出,echo $? 输出:0
**撤销变量:unset VARNAME **
查看当前shell中的所有变量:
set
查看当前shell中的环境变量:
printenv
env
export
给字符串类型的变量赋值:shell默认全是字符串型
export PATH=$PATH:/home/stevenux
$PATH:引用原来的PATH变量
: :新增内容分号隔开
#本地变量:声明 VARNAME=VALUE 作用域:整个shell进程可以使用
#局部变量:声明 local VARNAME=VALUE 作用域:对当前代码段有用
#环境变量:声明 export VARNAME=VALUE 作用域:当前整个shell进程及子进程可以使用,于其他登陆的shell无关
#环境变量:也可以这样声明:
VARNAME=VALUE
export VARNAME
引用变量:${VARNAME},括号可以省略,必须加花括号的情况:
ANIMAL=Dog
echo “There are some ${ANIMAL}s.” //弱引用,可以实现变量替换
输出:There are some Dogs.
不加花括号,系统认为ANIMALs是变量
echo ‘There are some ${ANIMAL}s.’ //强引用,不完成变量替换
输出:There are some ${ANIMAL}s.
脚本:命令的堆砌,按照实际需要,结合命令流程控制机制实现的源程序
写好的.sh脚本为二进制ASCII码文件,linux内核只识别ELF(可执行可连接文件)文件
让内核启动脚本解释器来执行
shebang:魔数
#!/bin/bash 第一行必须以改内容开始
以#开头为注释行