常见的有三种:
1、云主机 (阿里云腾讯云)
2、无数据的PC(不推荐多系统混跑)
3、虚拟机(推荐) (在windows/mac上安装虚拟机) (可以随时让虚拟机停下来)
版本号 由 主版本号、次版本号、末版本号 组成
如 5.0.15
(次版本号是奇数为开发版,偶数为稳定版)
https://www.kernel.org
开源的,经常见到的发行版本有5种
02.2.1 RedHat Enterprise Linux
软件经过专业人员测试,有部分要收费
02.2.2 Fedora
通过组建社区来免费提供操作系统,没有专业测试,不稳定
02.2.3 CentOS
基于RedHat Enterprise 源代码编译的, 免费
(结合上面两个操作系统)
02.2.4 Debian
为linux定制了华丽的界面
02.2.5 Ubuntu
为linux定制了华丽的界面
内核版本安装完成后没有用户界面和软件,是提供硬件抽象层、硬盘以及文件系统控制的核心程序
(linux核心只有内核部分,安装完后,用户界面/软件都没有。内核是系统的心脏,是linux中最基层的代码)
发行版本是在内核的基础上加入了用户界面和各种软件的支持
(linux发行版,就是在内核的基础上,加入用户界面,各种软件的支持。比如CentOS、小红帽等等。在内核的基础上,开发不同应用程序,组成的一个完整的操作系统)
推荐 安装VirtualBox虚拟机
,然后在虚拟机中安装linux系统
登录的shell(终端)
图形终端
命令行终端
远程终端(SSH、VNC)
man + 命令名称
man ls
1、首先用type来检测命令是内部还是外部命令
type + 命令名称
如果显示 xx is a shell builtin
, 这说明是内部命令
如果显示 xx is aliased to ls --color=auto
, 这说明是外部命令
比如
type cd
cd is a shell builtin
说明 cd 是 内部 命令
type ls
ls is aliased to `ls --color=auto'
说明 ls 是 外部 命令
help + 命令名称
help cd
命令名称 --help
ls --help
info 命令名称
info ls
linux基本操作命令是命令行
r(reverse) 意为逆向(配合-l使用)
ls -l -r `默认是按照文件名逆向显示的`
ls -l -r -t `按照时间逆向显示`
ls -R 递归显示文件以及文件夹
ls -a 显示隐藏文件
cp -v 显示复制的进度条
cp -p 复制时保留原有时间
cp -a 复制时保留原有所有属性 时间 属组属主 权限
cat 文件名 # 显示文件内容
head -行数 文件名 # head -5 fileA 显示文件前5行内容
tail -行数 文件名 # tail -5 fileA 显示文件最后5行内容
tail -f 文件名 # 当文件内容发生变化,同步更新 比如会实时刷新的日志文件
wc -l 文件名 # 用来 查看文件行数
压缩---> 打包+压缩
打包
是指将一大堆文件或目录变成一个总的文件
压缩
则是将一个大的文件通过一些压缩算法变成一个小文件
1). 打包命令 cvf
将dirA 打包为 dirA.tar
tar -cvf dirA.tar dirA
2). 压缩 分两种 gzip 或 bzip
gzip xxx.tar
gzip dirA.tar
将dirA 压缩为dirA.tgz (tar.gz是tgz的简称)
tar -czvf dirA.tgz dirA/
tar -czvf dirA.tar.gz dirA/
将两个文件夹压缩成一个tgz
tar -czvf dirAB.tgz dirA/ dirB/
bzip打包压缩
tar -cjvf dirA.tbz2 dirA
tar -cjvf dirA.tar.bz2 dirA
解包
tar -xvf dirB.tar -C ./dir # -C 后面的./dir为 执行解的包放的位置
解压缩
tar -xzvf dirB.tgz -C ./B
tar -xjvf dirB.tar.bz2 ./B
vim 是一个同vi向上兼容的文本编辑器
有以下从正常模式到插入模式的 进入方式
i # 光标处的前一个字符进入
I # 光标处的当行某个字符前进入
a # 光标处的下一个字符进入
A # 光标处的当行末尾字符后进入
o # 光标处的下一行进入
O # 光标处的上一行进入
yy 复制当前行
5yy 复制从当前开始的5行
y$ 复制该行中从当前光标开始到结尾的字符
dd 删除当前行
5dd 删除从当前开始的5行
d$ 删除该行中从当前光标开始到结尾的字符
x 删除光标所在的字符
r 按r后输入要替代的字符
g 移动到文本第一行
G 移动到文本最后一行
^ 移动到当前行最开头
$ 移动到当前行最末尾
以字符来选择
以行来选择
选的是上下对齐的块
适用于删除或增加一整块字符
1. 删除
按ctrl v
键盘上下左右选择要删的字符块
按 d
被选中的字符块就被删掉了
2. 增加
ctrl v
键盘上下移动光标 选择要添加字符块的行
按 I (也就是shift i)(光标指向被选字符块的首行首字符)
输入要增加的字符 (比如 output:)
按两次esc
被选中的字符块的每行前面就会加上刚才新增的字符
新建用户 useradd
删除用户 userdel
修改用户密码 passwd
修改用户属性 usermod
usermod -d /new/work/directory username
将username用户的家目录改为 /new/work/directory
chage
更改用户密码过期信息
id username
查看用户的 uid gid group
usermod -g 用户组1 用户1
将 用户1 的 组 改为 用户组1
su -
当前用户为root, 但要临时切换到普通用户下测试某功能,测试完成后恢复到原来的root用户
su 命令用来做 root和普通用户的相互切换
切换用户
切换到root : su 后面 可加 可不加 root
切换到tester : su 后面 必须加 tester
tester是举的一个普通用户的例子
$ pwd 查看当前目录为 /home/tester
$ su 输入root用户密码
显示
# pwd # 井号说明已经进入root用户了, 查看当前目录为 /home/tester
用 su 切换到了root 身份,但shell环境仍然是普通用户的shell
工作目录仍然是普通用户的工作目录
$ pwd 查看当前目录为 /home/tester
$ su - 输入密码
显示
# pwd # 井号说明已经进入root用户了, 查看当前目录为 /root
用 su - 切换到了root 身份,shell环境也切换到root的shell
工作目录变成了root的工作目录
# pwd # 井号说明当前是root用户, 查看当前目录为 /root
# su tester shell环境仍然是root, 查看当前目录为 /root
# su - tester shell环境也切换到普通用户, 查看当前目录为 /home/tester
sudo 将某些只有root用户可以执行的命令授权给普通用户,普通用户就可以在不知道root密码时执行root指定的命令
sudo 是 以自己的身份执行其他用户的指令, 如以普通用户身份执行root用户的指令
比如 只有root用户才能执行关机操作,但如果希望普通用户也可以执行关机,两种方法
方法一: 告诉普通用户root的密码(不安全,不推荐)
方法二: 使用sudo 命令(推荐)
使用sudo 命令的操作方法
普通用户1 ALL=/sbin/shutdown
0 123 456 789 xxxx xxxxxx xxxxxxxx
类型 <–权限–> 大小 时间 文件名
-rw-r-xr--. 1 tester tester 11 Jul 6 17:19 test.sh
权限一共占9个位数,所以用了1-9来表示位数
123 456 789
abc def ghi
权限
abc 文件属主的权限(用户的权限)
def 文件属组的权限(用户组的权限)
ghi 其他用户的权限(其他人的权限)
r 读 r=4
w 写 w=2
x 执行 r=1
-rw-r-xr–. 1 tester tester 11 Jul 6 17:19 test.sh
即表示
属主权限为rw- ,数字表示为6, 属主有读和写权限
属组权限为r-x ,数字表示为5, 属组有读和执行权限
属主权限为r-- ,数字表示为4, 其他用户有读权限
notes
对于test.sh 文件,表示属主没有执行权限,属组有执行权限
经测试,属主不能执行
x 进入目录
rx 显示目录内的文件名
wx 修改目录内的文件名
原文件 -rw-r-xr–. 1 tester tester 11 Jul 6 17:19 test.sh
chmod 修改文件、目录 权限
可以对权限进行 增加 减少 或 直接设置
用字符表示方法
u 对属主设置
g 对属组设置
o 对其他设置
> 对属主 增加执行权限 chmod u+x test.sh
> 对属组 减少执行权限 chmod g-x test.sh
> 对其他 设置为执行权限 chmod o=x test.sh
> 对属主 属组 其他 都增加读取权限 chmod a+r test.sh
> 对属主 属组 其他 都增加读写执行权限 chmod a+r+w+x test.sh
> 用数字表示方法 为所有属性 都增加读写执行权限 chmod 777 test.sh
chown 来 修改属主(owner)、属组(group)
Examples:
chown root /u Change the owner of /u to "root". 将/u的 属主 更改为“root”
chown :staff /u Change the group of /u to "staff". 将/u的 属组 更改为“staff”
chown root:staff /u Likewise, but also change its group to "staff". 将/u的 属主 更改为“root”, 也将其属组更改为“staff”
chown -hR root /u Change the owner of /u and subfiles to "root". 将/u和子文件的 属主更改为“root”
shell是命令解释器,用于解释用户对操作系统的操作
shell把用户执行的命令翻译给内核, 内核根据命令执行的结果,再把结果反馈给用户
CentOS 7 默认使用的shell是bash
有一个内容如下的文件 /home_local/tester/testMethods.sh
来检测不同的执行方式的异同
#!/bin/sh
pwd
cd /home
在当前的终端上产生一个bash的子进程, 在子进程里执行脚本,执行完成后回到父进程
使用这种方式执行, 发现虽然没有执行权限, 但也可以执行
脚本中显示cd到了/home目录, 但是执行完成后又回到了原来的目录
执行
bash testMethods.sh
结果
/home_local/tester
/home
查看 pwd
/home_local/tester
产生子进程
,用#! (Sha-Bang)来解释脚本
使用这种方式执行, 没有执行权限时是不能执行的
脚本中显示cd到了/home目录, 但是执行完成后又回到了原来的目录
先给脚本添加可执行的权限
chmod 777 testMethods.sh
执行
./testMethods.sh
结果
/home_local/tester
/home
查看 pwd
/home_local/tester
在当前的进程中执行
虽然没有执行权限, 但也可以执行
脚本中显示cd到了/home目录, 最终当前目录是/home
会对当前环境造成影响
执行
source ./testMethods.sh
结果
/home_local/tester
/home
查看 pwd
/home
在当前的进程中执行
虽然没有执行权限, 但也可以执行
脚本中显示cd到了/home目录, 最终当前目录是/home
会对当前环境造成影响
执行
. testMethods.sh
结果
/home_local/tester
/home
查看 pwd
/home
管道:用于进程通信
管道符 |
将前一个命令执行的结果传递给后面的命令
(将前一个命令的输出作为后一个命令的输入)
同时会为两个命令创建子进程
将输出到 标准输出中的内容 输出到 文件
wc -l filename.sh 显示文件行数
wc -l 然后在页面中输入任意几行信息,按ctrl D 停止输入, 结果显示输入信息的行数
wc -l < filename.sh 显示文件行数, 用文件代替用户输入
输入
wc -l testMethods.sh
显示
6 testMethods.sh
输入
wc -l < testMethods.sh
显示
6
echo "xxx" > filename.sh 覆盖
echo "xxx" >> filename.sh 追加
18.3.1 输入一条不存在的命令 nocmd, 控制行下方显示错误
bash: nocmd: command not found…
18.3.2 将错误输出重定向到 err.txt
nocmd 2> err.txt
查看err.txt
cat err.txt
bash: nocmd: command not found…
nocommand &> all.txt
输出到标准输出的输出到文件
有意义的变量名
不区分类型
为变量赋值的过程,称为变量替换
1) 变量名=变量值 [等号左右不能出现空格]
value=233
2) 使用let为变量赋值 [通常let用来计算]
let value=10+33
3) 将命令赋值给变量
通常是把命令的值赋给变量
l=ls
4) 将命令结果赋值给变量,使用$() 或``
let c=$(ls -l /etc)
let c=`ls -l /etc`
newed_file=`ls *.html -t | head -1` # 取当前目录下最新的一个 *.html文件
bak_file="${newed_file%.*}_`date +"%y%m%d%H%M"`" # 名字后加时间戳
5) 变量值有空格等特殊字符可以包含在 "" 或 '' 中
string1="hello world"
string2='hello "world"'
${变量名} 也可以 $变量名
echo ${变量名}
echo $变量名
变量的默认作用范围 只针对当前的shell(终端)有效
如果在当前的shell产生新的子shell,或者是当前shell的平行shell或父shell,都是无效的
step1: 举个例子 命令行中给一个变量赋值
demo_var=333
step2: 然后在一个脚本中调用该变量,并打印值
文件名 testDemo.sh
#!/bin/sh
echo demo_var=$demo_var
step3: 用两种在当前shell执行的执行方式来执行
source test07.sh #执行结果 demo_var=333
. test07.sh #执行结果 demo_var=333
可以获取到该变量的值
step4: 用两种会创建子进程的执行方式来执行
bash test07.sh #执行结果 demo_var=
./test07.sh #执行结果 demo_var=
发现并不能获取到该变量的值
改变变量的默认作用范围 用 export
export: 希望在子进程父进程以及其他shell中可以读到当前shell中定义的变量时, 使用export
在命令行中加上
export demo_var
step5: 加上export后 然后用两种会创建子进程的执行方式来执行
bash test07.sh #执行结果 demo_var=333
./test07.sh #执行结果 demo_var=333
可以获取到该变量的值
step6:当不使用变量了,可以对变量删除, 使用unset
unset demo_var
把变量保存在系统中,使它成为环境变量
环境变量:每个shell打开都可以获取到的变量
1)现有的环境变量有哪些
用 env 查看
env
用echo $xxx 来输出值
2) 当前目录的搜索路径
echo $PATH
我们在执行 ls echo 这类命令时, 前面是没有带路径的,这些命令都没有在当前路径,
linux就是通过 $PATH 这个搜索路径来找的
输入
echo $PATH
显示
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
3) 在原来的PATH路径上加上我们的当前目录 /home/tester
PATH=$PATH:/home/tester
就有当期的目录了,可以直接执行
test0717.sh
echo $? # 上一条命令的执行结果(是否成功)
echo $$ # 显示进程的id号
echo $0 # 显示当前的进程名称
为shell脚本添加参数
test0717.sh
如果第二个参数有值, 则用传来的值
如果第二个参数没有值, 则用_来代替
#!/bin/sh
echo para1=$1
echo para2=${2-_}
输入
./test0717.sh a
结果
para1=a
para2=_
输入
./test0717.sh a bbb
结果
para1=a
para2=bbb
定义一个名为IPTS的数组
Array=( 10.0.0.1 10.0.0.2 10.0.0.3)
1)第一个元素
输入
echo ${Array}
显示 第一个元素
10.0.0.1
2)所有元素的列表
输入
echo ${Array[@]}
显示 所有元素的列表
10.0.0.1 10.0.0.2 10.0.0.3
3)元素个数
输入
echo ${#IPTS[@]}
显示 元素个数
3
4)下标值为1的元素
输入
echo ${IPTS[1]}
显示 下标值为1的元素
10.0.0.2
1,输入
expr 4+2 #(错,要数字与运算符中间要加空格)
显示
4+2
2,输入
expr 4 + 2
显示
6
3, 输入
expr 4 + 9.0 #(错, 数字必须是整数)
显示
expr: non-integer argument
expr算得的值如何赋给变量
4, 输入
add_value=`expr 4 + 2`
echo "add_value=$add_value"
显示
add_value=6
let "变量名=变量值"
1, 输入
let b=3*4
echo $b
显示
12
值以0开头为八进制
值以0x开头为十六进制
双圆括号是let命令的简化
((a=10))
((a++))
echo $((10+22))
() 产生子shell 使用圆括号会产生一个子shell,如(xyz=223)
数组初始化
(()) 做算术运算 (()) 是 let 命令的简化 ((a=8+2))
[] 做测试 [ 4 -gt 2 ]
[[]] 测试扩展[[ 4 > 2 ]] 做真正的测试
< 和> 做输入输出重定向 比较大小
{ } 输出范围 ehco {0..9} 输出0-9的数字
let 变量名=变量值
expr (evaluate expressions的缩写)。“表达式求值”。
Shell expr是一个功能强大。并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比>较、字符串匹配、字符串提取等。
expr \( 4 + 2 \) \* 2
12
"(两个反引号) 将计算的结果赋值给新的变量value1=`expr \( 4 + 2 \) \* 2`
echo $value1
12
value2=$(expr \( 4 + 2 \) \* 2)
echo $value2
12
for 参数 in 参数列表
do
操作命令
done
参数列表的产生: 使用 命令 / 文本文件
{0..9} ---> 产生1-9的列表
/home/*.sh
for filename in ls `/home/*.shsh`
do
mv $filename $(basename $filename *.shsh).sh #将后缀为shsh改为sh
done
while [ $# -ge 1 ];
do
echo "total paras=" $#
if [ $1 == help ] ; then
echo '$1' =$1
fi
shift
done
使用nice renice 调整脚本优先级
避免出现 "不可控的"死循环
设置
at + 时间 + 命令
查看
atq
配置
crontab -e
查看
crontab -l
anacontab
find /etc -name passwd 查找 /etc 目录下文件名为passwd的文件
find . -name "*bin" 查找 当前目录下后缀名为 bin的文件名
find /etc -regex .*wd 查找 /etc 目录下以wd结尾的文件
find /etc -regex .etc.*wd 查找 /etc 目录下含 etc且wd结尾的文件
find 目录 -type d -regex 目录名
find 目录 -type f -regex 文件名
find 目录 -atime xxx atime access 访问时间
find 目录 -ctime xxx ctime change 改变时间
find 目录 -mtime xxx mtime modify 修改时间