文章目录
- 一、 部署虚拟环境安装Linux系统
- 1. 安装VMware和Linux系统
- 2. 重置root管理员密码
- 3. RPM:红帽软件管理器
- 常用命令
- 4. Yum软件仓库
- 常用命令
- 5. systemd初始化进程
- 系统启动过程
- 系统目标
- 系统管理服务
- 二、简单命令
- 查看帮助文档
- 常用系统工作
- 1. echo命令
- 2. date命令
- 3. poweroff/shutdown命令
- 4. wget命令
- 5. ps命令
- 6. top命令
- 7. pidof命令
- 8. kill/killall命令
- 检测系统状态
- 1. ifconfig命令
- 2. uname命令
- 3. uptime 命令
- 4. free命令
- 5. df命令
- 6. du命令
- 7. who命令
- 8. last命令
- 9. history命令
- 切换工作目录
- 1. pwd命令
- 2. cd 命令
- 编辑文本文件
- 1. cat命令
- 2. more/less命令
- 3. head/tail命令
- 4. tr 命令
- 5. wc命令
- 6. stat 命令
- 7. cut 命令
- 8. diff 命令
- 管理文件目录
- 1. touch 命令
- 2. mkdir 命令
- 3. cp 命令
- 4. mv 命令
- 5. rm 命令
- 6. dd 命令
- 7. file命令
- 文件归档打包和压缩
- 1. tar 命令
- 2. find 命令
- 三、管道符、重定向与环境变量
- 输入输出重定向
- 1. 分类
- 2. 重定向符号及作用
- 常用的转义字符
- 重要的环境变量
- 新增变量
- 修改变量值
- 四、 Vim编辑器与Shell命令脚本
- Vim编辑器
- 三种操作模式
- 命令模式常用命令
- 末行模式常用命令
- 配置主机名称
- 配置网卡信息
- 编写Shell脚本
- 简单的脚本
- 接收用户参数
- shell脚本内置参数
- 判断用户参数
- 条件测试语句
- 流程控制语句
- if
- for
- while
- case
- 计划任务服务程序
- 一次性计划任务
- 长期性计划任务
- 五、用户身份和文件权限
- 用户UID
- 查看用户ID和用户组
- 添加用户
- 添加用户组
- 修改用户信息
- 删除用户
- 文件权限
一、 部署虚拟环境安装Linux系统
1. 安装VMware和Linux系统
略过
2. 重置root管理员密码
- 重启Linux系统进入引导界面时,按下键盘的
e
键进入内核编辑界面; - 在
linux16 /vmlinuz-
这一行的最后追加rd.break
参数,并按下Ctrl+X
来运行修改过的内核程序; - 大约30s后,进入系统的紧急救援模式;
- 依次输入以下命令:
-
mount -o remount,rw /sysroot
:加载文件系统到指定的加载点 chroot /sysroot
-
passwd
: 修改密码 - 这里输入两次新密码
touch /.autorelabel
exit
,reboot
- 重启后新密码生效
3. RPM:红帽软件管理器
在RPM之前,Linux系统中安装软件只能采取源码包的形式安装,运维人员需要自行编译代码并解决虚电的软件依赖关系;而且在安装、升级、卸载时需要考虑到其他程序的依赖关系。
RPM会建立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系。
常用命令
-
rpm -ivh filename.rpm
:安装软件,其中i
表示install
;v
表示打印冗余信息;h
表示打印出软件包的hash码 -
rpm -Uvh filename.rpm
:更新软件 ,U
表示update
-
rpm -e filename.rpm
:卸载软件,e
表示erase
擦除、消除
4. Yum软件仓库
为了进一步降低软件安装难度和复杂度,Yum软件仓库可以根据用户的要求分析出所需软件包机器相关的依赖关系,然后自动从服务器下载软件包并安装到系统。
常用命令
-
yum repolist all
:列出所有仓库 -
yum list all
: 列出仓库中所有的软件包 -
yum info packname
:查看软件包信息 -
yum install packname
:安装软件包 -
yum update packname
:升级软件包 -
yum remove packname
:卸载
5. systemd初始化进程
系统启动过程
- BIOS
- 进入Boot Loader
- 加载系统内核
- 内核进行初始化
- 启动初始化进程(systemd)
系统目标
systemd目标名称 | 作用 |
poweroff.target | 关机 |
rescue.target | 单用户模式 |
multi-user.target | 多用户的文本界面 |
graphical.target | 多用户的图形化界面 |
reboot.target | 重启 |
修改系统默认的运行目标为多用户文本界面
模式,使用ln
命令把mutli-uer.target
链接到/etc/systemd/system/
目录:
$ ln -sf /lib/systemd/system/mutli-user.target /etc/systemd/system/default.target
系统管理服务
命令 | 作用 |
| 启动服务 |
| 重启服务 |
| 停止服务 |
| 重新加载配置文件(不终止服务) |
| 查看服务状态 |
systemctl设置服务开机启动
命令 | 作用 |
systemctl enable *.service | 开机自动启动 |
systemctl disable *.service | 开机不自动启动 |
systemctl is-enabled *.service | 检测指定服务是否开机自启 |
systemctl list-unit-files --type=service | 查看各个级别下服务的启动与禁用情况 |
二、简单命令
查看帮助文档
- man command
- info command
- command --help/-h
常用系统工作
1. echo命令
用于在终端输出字符串或变量提取后的值
echo Hello_World
echo $PATH
2. date命令
用于显示和设置系统的时间/日期
date "+%Y-%m-%d %H:%M:%S"
:按照2019-05-21 13:11:11
的格式显示,格式可选
date "+%j"
:显示当前是一年内的第几天
date -s "20190521 13:11:11"
:设置当前时间为2019-05-21 13:11:11
3. poweroff/shutdown命令
用于关闭机器,reboot
和 shutdown -r
效果一样,重启机器
4. wget命令
用于在终端下载网络文件
参数 | 作用 |
- b | 后台下载 |
- p | 下载到指定目录 |
-r | 递归下载 |
wget url
5. ps命令
用于查看系统中的进程状态
参数 | 作用 |
-a | 显示所有进程(包括其他用户的进程) |
-u | 用户以及其他详细信息 |
-x | 显示没有控制终端的进程 |
ps -aux
6. top命令
用于动态地监控进程活动和系统负载等信息
top
结果 | 含义 |
第1行:概览 | 系统时间、运行时间、登录终端数、系统负载(分别是1分钟、5分钟、15分钟的平均值,数值和负载成正比) |
第2行:各个状态进程数 | 进程总数、运行中的进程数、睡眠的进程数、停止的进程数、僵死的进程数 |
第3行:资源占用百分比 | 用户、系统内核、改变过优先级的进程、空闲的资源 |
第4行:物理内存 | 总量、空限量、使用量、内核缓存量 |
第5行:交换区内存 |
7. pidof命令
用于查询某个指定服务进程的PID
pid sshd
8. kill/killall命令
用于终止某个指定PID的进程(kill)或终止某个指定名称的服务的所有进程(killall)
kill -9 12222
killall httpd
检测系统状态
1. ifconfig命令
用户获取网卡配置与网络状态等信息
ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.2 netmask 255.255.255.0 broadcast 192.168.2.255
ether 00:0c:29:46:17:61 txqueuelen 1000 (Ethernet)
RX packets 192858 bytes 136055437 (129.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 165876 bytes 22161518 (21.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2. uname命令
用于查看系统内核与系统版本信息
uname -a
Linux study.rambo 3.10.0-957.10.1.el7.x86_64 #1 SMP Mon Mar 18 15:06:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
要查看当前系统版本的详细信息:
cat /etc/redhat-relaease
CentOS Linux release 7.6.1810 (Core)
3. uptime 命令
用于查看系统的负载信息
uptime
13:50:59 up 8 days, 2:43, 1 user, load average: 0.00, 0.01, 0.05
4. free命令
用于查看当期系统中内存的使用量
free -h
:打印可读的内存用量信息
total used free shared buff/cache available
Mem: 972M 442M 78M 8.8M 451M 276M
Swap: 2.0G 363M 1.6G
5. df命令
用于查看系统磁盘使用量
df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos_study-root 10G 5.2G 4.9G 52% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 14M 473M 3% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda2 1014M 199M 816M 20% /boot
/dev/mapper/centos_study-home 5.0G 187M 4.9G 4% /home
tmpfs 98M 0 98M 0% /run/user/1000
6. du命令
用户查看指定目录/文件的磁盘占用
du -h w3m-0.5.3.tar.gz
2.2M w3m-0.5.3.tar.gz
7. who命令
用户查看当前登入主机的用户终端信息
who
rambo pts/0 2019-05-20 10:33 (192.168.2.16)
8. last命令
用于查看所有系统的登录记录,该记录以日志形式保存在系统中,可以被修改
last
rambo pts/0 192.168.2.16 Mon May 20 10:33 still logged in
rambo pts/0 192.168.2.16 Mon May 13 11:08 - 19:02 (4+07:53)
reboot system boot 3.10.0-957.10.1. Mon May 13 11:08 - 14:38 (8+03:30)
rambo pts/1 192.168.2.16 Wed May 8 12:00 - crash (4+23:07)
rambo pts/0 192.168.2.16 Tue May 7 10:28 - crash (6+00:39)
rambo pts/0 192.168.2.16 Mon May 6 12:25 - 12:34 (00:08)
rambo pts/0 192.168.2.16 Tue Apr 30 17:13 - 17:18 (00:04)
rambo pts/0 192.168.2.16 Tue Apr 30 15:38 - 16:32 (00:54)
rambo pts/0 192.168.2.16 Tue Apr 30 15:05 - 15:33 (00:28)
rambo pts/0 192.168.2.16 Tue Apr 30 11:58 - 12:41 (00:42)
reboot system boot 3.10.0-957.10.1. Tue Apr 30 11:58 - 14:38 (21+02:40)
9. history命令
用户显示历史执行过的命令,!line_num可以直接执行该行命令
history
1066 free -h
1067 ds
1068 dk
1069 fd
1070 fs
1071 df -h
1072 du -h
1073 du
1074 df -h
1075 cd
1076 du -h
1077 df -h
1078 cd /dev/mapper/
1079 du
1080 du -f
1081 du -h
1082 ll
1083 cd
1084 ll
1085 du -h playground
1086 ll
1087 du -h w3m-0.5.3
1088 du -h w3m-0.5.3.tar.gz
!1088
du -h w3m-0.5.3.tar.gz
2.2M w3m-0.5.3.tar.gz
cat ~/.his
切换工作目录
1. pwd命令
用户显示当前所处的工作目录
pwd
/home/rambo
2. cd 命令
cd
或cd ~
:切换到家目录
cd -
:切换到上次的目录
cd /
:切换到根目录
编辑文本文件
1. cat命令
用户查看内容较少的纯文本文件
cat -n 文件
2. more/less命令
more:一个基于vi编辑器的文本过滤器,只能向前浏览
less:与more相似,差别在于其可以向前或向后浏览
按键 | 作用 |
Space空格键 | 下一屏 |
Enter回车 | 下一行 |
PageDown | 向下翻页 |
PageUp | 向上翻页 |
/+字符串 | 匹配查找 |
n | 下一个匹配 |
N | 上一个匹配 |
3. head/tail命令
head:用于显示文件开通的内容,默认前十行
tail:用于显示文件的尾部内容,而且持续刷新一个文件的内容
参数 | 作用 |
-n<数字> | 指定显示头部内容的行数 |
按键内容和less相似
4. tr 命令
用于替换文本文件或标准输入的字符
选项 | 作用 |
-c | 取代所有不属于第一字符集的字符 |
-d | 删除所有属于第一字符集的字符 |
-s | 把连续重复的字符以单独一个字符表示 |
$ echo “HELLO WORLD” | tr [A-Z] [a-z]
hello world$ echo “HELLO WORLD sss” | tr -d [a-z]
HELLO WORLD
5. wc命令
用于统计指定文本的行数、字数和字节数
参数 | 作用 |
-l | 只显示行数 |
-w | 只显示单词数 |
-c | 只显示字节数 |
$ wc /etc/passwd
22 40 1029 /etc/passwd表示该文件有22行;40个单词;1029个字节
$ wc -l /etc/passwd
22 /etc/passwd
$ wc -w /etc/passwd
40 /etc/passwd
$ wc -c /etc/passwd
1029 /etc/passwd
6. stat 命令
用于查看文件的具体存储信息和时间等信息
stat /etc/passwd
文件:"/etc/passwd"
大小:1029 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:17094533 硬链接:1
权限:(0644/-rw-r–r--) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:passwd_file_t:s0
最近访问:2019-05-23 12:01:01.413802969 +0800
最近更改:2019-03-05 11:53:05.231107128 +0800
最近改动:2019-03-05 11:53:05.232107140 +0800
7. cut 命令
用于按列提取文本字符
参数 | 作用 |
-f | 指定要提取的列 |
-d | 指定间隔符号 |
$ cut -d: -f1 /etc/passwd
root
bin
daemon
adm
lp
8. diff 命令
用于比较多个文本文件的差异
$ diff --brief diff_A.txt diff_B.txt
文件 diff_A.txt 和 diff_B.txt 不同$ diff -c diff_A.txt diff_B.txt
*** diff_A.txt 2019-05-20 12:02:59.646072244 +0800
— diff_B.txt 2019-05-20 12:03:21.945384356 +0800*** 1,5 ****
! Welcome to linuxprobe.com Red Hat certified
! Free Linux Lessons
Professional guidance
Linux Course
— 1,6 ----
! Welcome tooo linuxprobe.com Red Hat certified
! Free Linux LeSSonS
! …
Professional guidance
Linux Course
管理文件目录
1. touch 命令
用于创建空白文件或设置文件的时间。也可以用vi等编辑器直接编辑不存在的文件后就新建文件
参数 | 作用 |
-a | 仅修改 读取时间 atime |
-m | 仅修改 修改时间 mtime |
-d | 同时修改 atime 和 mtime |
$ touch file.txt
2. mkdir 命令
用于创建空白的目录
$ mkdir {2007…2009}-0{1…9} {2007…2009}-{10…12}
$ ls
2007-01 2007-07 2008-01 2008-07 2009-01 2009-07
2007-02 2007-08 2008-02 2008-08 2009-02 2009-08
2007-03 2007-09 2008-03 2008-09 2009-03 2009-09
2007-04 2007-10 2008-04 2008-10 2009-04 2009-10
2007-05 2007-11 2008-05 2008-11 2009-05 2009-11
2007-06 2007-12 2008-06 2008-12 2009-06 2009-12
3. cp 命令
用于复制文件或目录
参数 | 作用 |
-p | 保留原始文件的属性 |
-d | 若对象为“链接文件”,则保留该属性 |
-r | 递归持续复制 |
-i | 若目标文件存在则询问是否覆盖 |
-a | 相当于-pdr |
4. mv 命令
用于剪切或将文件重命名
$ mv x.log linux.lg
对同一个目录中对一个文件进行剪切操作就是重命名文件
5. rm 命令
用于删除文件或目录
6. dd 命令
用于按照制定大小和个数的数据块来复制和转换文件
参数 | 作用 |
if | 输入的文件名称 |
of | 输出的文件名称 |
bs | 设置每个块的大小 |
count | 设置要复制块的个数 |
$ dd if=/dev/zero of=file.file count=1 bs=500M
记录了1+0 的读入
记录了1+0 的写出
524288000字节(524 MB)已复制,2.74164 秒,191 MB/秒
7. file命令
用于查看文件的类型
$ file anaconda-ks.cfg
anaconda-ks.cfg: ASCII text
$ file /dev/sda
/dev/sda: block special
文件归档打包和压缩
1. tar 命令
用于文件归档,将多个文件归档到一个文件中;在归档的同时也可对文件进行压缩,文件格式一般为*.tar
、*.tar.gz
、*.tar.bz2
参数 | 作用 |
-c | 创建归档文件 |
-x | 解开归档文件 |
-t | 查看归档包里有哪些文件 |
-z | 使用gzip压缩或解压 |
-j | 用bzip2压缩或解压 |
-v | 显示归档过程 |
-f | 目标文件名 |
-p | 保留原始的权限与属性 |
-P | 使用绝对路径 |
-C | 解压到指定目录 |
tar czvf linuxprobe.tar.gz diff_A.txt diff_B.txt file.file
diff_A.txt
diff_B.txt
file.file
[rambo@study linuxprobe]$ ll
总用量 517724
-rw-rw-r–. 1 rambo root 98 5月 20 12:02 diff_A.txt
-rw-rw-r–. 1 rambo root 122 5月 20 12:03 diff_B.txt
-rw-rw-r–. 1 rambo root 4862064 5月 23 15:42 etc.tar.gz
-rw-rw-r–. 1 rambo root 524288000 5月 23 15:12 file.file
-rw-rw-r–. 1 rambo root 10 5月 20 14:12 LinuxDemo.txt
-rw-rw-r–. 1 rambo root 509099 5月 23 15:44 linuxprobe.tar.gz
2. find 命令
用于按照指定条件来查找文件
参数 | 作用 |
-name | 匹配名称 |
–type [b/d/c/p/l/f] | 匹配文件类型(后面的字母参数依次表示块设备、目录、字符设备、管 道、链接文件、文本文件) |
-exec ······ {} \ | 后面可跟用于进一步处理搜索结果的命令 |
$ find -name ‘diff*’ -exec cp -a {} ~ ;
[rambo@study ~]$ ll
总用量 64008
drwxrwxr-x. 2 rambo root 23 4月 11 11:13 admin
drwxrwxr-x. 2 rambo root 42 5月 14 12:47 bin
-rw-rw-r–. 1 rambo root 98 5月 20 12:02 diff_A.txt
-rw-rw-r–. 1 rambo root 122 5月 20 12:03 diff_B.txt
其中的 {} 表示find命令搜索出的每一个文件,并且命令的结尾必须是 \;
三、管道符、重定向与环境变量
输入输出重定向
1. 分类
名称 | 描述符 | 作用 |
标准输入重定向 | STDIN, 0 | 默认从键盘输入,也可从其他文件或命令中输入 |
标准输出重定向 | STDOUT, 1 | 默认输出到屏幕 |
错误输出重定向 | STDERR, 2 | 默认输出到屏幕 |
2. 重定向符号及作用
符号 | 例子 | 作用 |
< | 命令 < 文件 | 将文件作为命令的输入 |
<< | 命令 << 分界符 | 从标准输入中读取,直到遇见分界符才停止 |
< > | 命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将执行结果的标准输出重定向到文件2 |
> | 命令 > 文件 | 将标准输出重定向到文件中,覆盖写模式 |
>> | 命令 >> 文件 | 将标准输出重定向到文件中,追加写模式 |
2> | 命令 2> 文件 | 将错误输出重定向到文件中,覆盖写模式 |
2>> | 命令 2>> 文件 | 将错误输出重定向到文件中,追加写模式 |
>> 2>&1或者 &>> | 命令 >> 文件 2>&1 或者 命令 &>> 文件 | 将标准输出和错误输出都写入文件中,追加写模式 |
常用的转义字符
符号 | 作用 | 例子 |
反斜杠 | 使反斜杠后面的一个变量变为单纯的字符串 | $ echo "Price is \$$PRICE" Price is $5 |
单引号 | 转义其中所有的变量为单纯的字符串 | $ echo 'Price is $PRICE’ Price is $PRICE |
双引号 | 保留其中的变量属性,不进行转义处理 | $echo "Price is $PRICE" Price is 5 |
反引号 Linux study.rambo 3.10.0-957.10.1.el7.x86_64 #1 SMP Mon Mar 18 15:06:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux |
重要的环境变量
新增变量
[root@linuxprobe ~]# mkdir /home/workdir
[root@linuxprobe ~]# WORKDIR=/home/workdir
[root@linuxprobe ~]# cd $WORKDIR
[root@linuxprobe workdir]# pwd
/home/workdir
修改变量值
[root@linuxprobe ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 86: …t@linuxprobe ~]#̲ PATH=PATH:/root/bin
[root@linuxprobe ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
四、 Vim编辑器与Shell命令脚本
Vim编辑器
三种操作模式
- 命令模式:刚打开文件/Esc进入该模式;控制光标移动,对文本进行复制、剪切、粘贴、删除和查找等功能
- 输入模式:正常的录入模式,进入方式
- o:光标后一位
- i/insert:光标当前位置
- a:光标下新建一行
- 末行模式:保持或退出文档,也可以在此执行一些命令
命令模式常用命令
命令 | 作用 |
dd | 删除(剪切)光标所在整行 |
5dd | 删除(剪切)从光标处开始的 5 行 |
yy | 复制光标所在整行 |
5yy | 复制从光标处开始的 5 行 |
n | 显示搜索命令定位到的下一个字符串 |
N | 显示搜索命令定位到的上一个字符串 |
u | 撤销上一步的操作 |
p | 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 |
末行模式常用命令
命令 | 作用 |
:w | 保存 |
:q | 退出 |
:q! | 强制退出,不保存 |
:wq! | 强制保存退出 |
:set nu | 显示行号,当shell脚本报错时通过报错信息定位问题 |
:set nonu | 不显示行号 |
:命令 | 执行该命令 |
:整数 | 跳转到该行 |
| 将光标所在行的第一个one替换成two |
| 将光标所在行的所有one替换成two |
:%s/one/two/g | 替换全文中的one |
?字符串 | 从下到上搜索 |
/ | 从上到下搜索 |
配置主机名称
- vi编辑
/etc/hostname
文件;修改内容 -
hostname
命令查看。
配置网卡信息
- 进入
/etc/sysconfig/network-scripts/
目录; - 编辑相应的网卡名称的文件,如
ifcfg-ens33
➢ 设备类型: TYPE=Ethernet
➢ 地址分配模式: BOOTPROTO=static
➢ 网卡名称: NAME=eno16777736
➢ 是否启动: ONBOOT=yes
➢ IP 地址: IPADDR=192.168.10.10
➢ 子网掩码: NETMASK=255.255.255.0
➢ 网关地址: GATEWAY=192.168.10.1
➢ DNS 地址: DNS1=192.168.10.1
- 重启网络服务:
systemctl restart network
编写Shell脚本
Shell脚本命令的工作方式分为两种
- 交互式:用户每输入一条命令就立即执行
- 批处理:由用户事先编写好一个完整的 Shell 脚本, Shell 会一次性执行脚本
中诸多的命令。
查看终端解释器:
[rambo@study ~]$ echo $SHELL
/bin/bash
简单的脚本
- 导入shell解释器
- 注释
- shell命令
[root@linuxprobe ~]# vim example.sh #!/bin/bash 导入bash作为解释器 #For Example BY本脚本的注释
pwd
ls -al
执行:
- 解释器执行:
[root@linuxprobe ~]# bash example.sh /root/Desktop
total 8
drwxr-xr-x. 2 root root 23 Jul 23 17:31 .
dr-xr-x—. 14 root root 4096 Jul 23 17:31 …
- 直接执行
[root@linuxprobe ~]# ./example.sh
bash: ./Example.sh: Permission denied
[root@linuxprobe ~]# chmod u+x example.sh [root@linuxprobe ~]# ./example.sh
/root/Desktop
total 8
drwxr-xr-x. 2 root root 23 Jul 23 17:31 .
dr-xr-x—. 14 root root 4096 Jul 23 17:31 …
-rwxr–r--. 1 root root 55 Jul 23 17:31 example.sh
bash: ./Example.sh: Permission denied
[root@linuxprobe ~]# chmod u+x example.sh [root@linuxprobe ~]# ./example.sh
/root/Desktop
total 8
drwxr-xr-x. 2 root root 23 Jul 23 17:31 .
dr-xr-x—. 14 root root 4096 Jul 23 17:31 …
-rwxr–r--. 1 root root 55 Jul 23 17:31 example.sh
接收用户参数
shell脚本内置参数
参数名 | 作用 |
$0 | 脚本程序名称 |
$? | 对应上次命令的返回值 |
$# | 参数的个数 |
$* | 所有位置的参数值 |
$1-$6 | 分别对应第N个参数的值 |
判断用户参数
Shell脚本中的条件测试语法可以判断表达式是否成立,如果成立返回0
;否则返回其他随机数值。
语法:
[ 条件表达式 ]
条件测试语句
分为4种:
- 文件测试语句;
运算符 | 作用 |
-d | 测试文件是否为目录 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
[rambo@study ~]$ [ -d /etc/favicon.png ]
[rambo@study ~]$ echo $?
1
- 逻辑测试语句;
命令 | 作用 |
&& | 逻辑与,当前面的命令执行成功后才会执行后面的命令 |
|| | 逻辑或,当前面的语句执行失败才执行后面的命令 |
! | 非,将测试条件的结果取反 |
[rambo@study ~]$ [ $USER = root ] && echo “root” || echo “user”
user[rambo@study ~]$ su - root
[root@study ~]# [ $USER = root ] && echo “root” || echo “user”
root
- 整数值比较语句
参数 | 作用 |
-eq | 是否相等 |
-ne | 是否不等 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否小于等于 |
-ge | 是否大于等于 |
[rambo@study ~]$ [ 10 -eq 10 ]
[rambo@study ~]$ echo [ 10 -lt 10 ]
[rambo@study ~]$ echo $?
1
- 字符串比较语句
参数 | 作用 |
= | 比较字符串是否相同 |
!= | 比较字符串是否不同 |
-z | 判断字符串是否为空 |
[rambo@study ~]$ [ -z echo $?
1
流程控制语句
if
从技术角度区分:
- 单分支结构
if 条件测试操作
then 命令
fi
- 双分支结构
if 条件测试操作
then 命令1
else 命令2
fi
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo “Host $1 is On-line.”
else
echo “Host $1 is Off-line.”
fi
- 多分支结构
if 条件测试操作1
then 命令1
elif 条件测试操作2
then 命令2
else
命令3
fi
#!/bin/bash
read -p “Enter your score(0–100):” GRADE
if [ $GRADE -lt 0 ] || [ GRADE is Error"
elif [ $GRADE -ge 85 ] && [ GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ GRADE is Pass"
else
echo “$GRADE is Fail”
fi
for
for 变量名 in 取值列表
do
命令序列
done
[rambo@study linuxprobe]$ cat ipadds.txt
192.168.2.3
192.168.2.1
8.8.8.8
1.1.1.1
114.114.114.114[rambo@study linuxprobe]$ vi CheckHosts.sh
#!/bin/bash
HLIST=$(cat ./ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ]
then
echo “Host $IP is On-line.”
else
echo “Host $IP is Off-line.”
fi
done[rambo@study linuxprobe]$ bash CheckHosts.sh Host 192.168.2.3 is Off-line.
Host 192.168.2.1 is On-line.
Host 8.8.8.8 is On-line.
Host 1.1.1.1 is On-line.
Host 114.114.114.114 is On-line.
while
while 条件测试操作
do
命令序列
done
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo “商品实际价格0-999之间,猜猜看是多少?”
while true
do
read -p “请输入您猜测的价格:” INT
let TIMES++
if [ $INT -eq PRICE,您共猜了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ]
then
echo “太高了”
elif [ $INT -lt $PRICE ]
then
echo “太低了”
fi
done[rambo@study linuxprobe]$ bash Guess.sh 商品实际价格0-999之间,猜猜看是多少?
请输入您猜测的价格:500
太高了
请输入您猜测的价格:250
太低了
请输入您猜测的价格:325请输入您猜测的价格:296
太高了
请输入您猜测的价格:291
太低了
请输入您猜测的价格:293
太高了
请输入您猜测的价格:292
恭喜您答对了。实际价格是292,您共猜了 11 次
case
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
…
*)
默认命令序列
esac
[rambo@study linuxprobe]$ cat Checkkeys.sh #!/bin/bash
read -p “请输入一个字符,并按Enter键确认:” KEY
case “$KEY” in
[a-z]|[A-Z])
echo “字母”
;;
[0-9])
echo “数字”
;;
*)
echo “空格、功能键、或其他控制字符”
esac
计划任务服务程序
一次性计划任务
命令 | 作用 |
at | 设置任务,交互式 |
echo “命令序列” | at 时间 | 设置任务,非交互式 |
at -l | 罗列一次性计划任务 |
atrm 任务序号 | 删除任务 |
[root@linuxprobe ~]# echo “systemctl restart httpd” | at 23:30
job 4 at Mon Apr 27 23:30:00 2017
[root@linuxprobe ~]# at -l
3 Mon Apr 27 23:30:00 2017 a root
4 Mon Apr 27 23:30:00 2017 a root[root@linuxprobe ~]# atrm 3
[root@linuxprobe ~]# at -l
4 Mon Apr 27 23:30:00 2017 a root
长期性计划任务
命令 | 作用 |
crontab -e | 创建、编辑任务 |
crontab -l | 查看当前任务 |
crontab -r | 删除指定任务 |
crontab -u | 编辑其他用户的任务 |
crontab的参数:分
、时
、日
、月
、星期
、命令
字段 | 说明 |
分 | [0-59] |
时 | [0-23] |
日 | [1-31] |
月 | [1-12] |
星期 | [0-7],0和7 都为星期日 |
命令 | 要执行的命令或脚本 |
[root@linuxprobe ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*
五、用户身份和文件权限
用户UID
id范围 | 分类 |
0 | 系统的管理员用户 |
1-999 | 系统用户 |
1000及以上 | 普通用户,由管理员创建的用于日常工作的用户 |
查看用户ID和用户组
[rambo@study ~]$ id
uid=1000(rambo) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[rambo@study ~]$ id rambo
uid=1000(rambo) gid=0(root) 组=0(root)
[rambo@study ~]$ id root
uid=0(root) gid=0(root) 组=0(root)
在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且
这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户
组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满
足日常的工作需要。
添加用户
useradd [选项] 用户名
参数 | 作用 |
-d | 指定用户的家目录,默认: /home/username |
-e | 账户的过期时间,格式为 |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
[rambo@study ~]$ sudo useradd -d /home/rambo -u 8888 -g rambo rambo2
[sudo] rambo 的密码:
useradd:警告:此主目录已经存在。
不从 skel 目录里向其中复制任何文件。
[rambo@study ~]$ id rambo2
uid=8888(rambo2) gid=1000(rambo) 组=1000(rambo)
添加用户组
groupadd [选项] 群组名
修改用户信息
usermod [选项] 用户名
用户信息保存在/etc/passwd
文件中,可以直接编辑该文件来修改用户;也可以使用usermod
命令修改已经创建的用户信息,诸如用户的 UID、基本/扩展
用户组、默认终端等 。
参数 | 作用 |
-c | 填写用户账户的备注信息 |
-d -m | 参数连用,重新指定用户的家目录并自动把旧数据迁移 |
-e | 账户的过期时间,格式为`YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户,禁止登录 |
-U | 解锁用户 |
-s | 变更默认终端 |
-u | 修改UID |
[rambo@study ~]$ sudo usermod -G rambo rambo
[sudo] rambo 的密码:
[rambo@study ~]$ id rambo
uid=1000(rambo) gid=0(root) 组=0(root),1000(rambo)passwd [选项] 用户名
passwd 命令用于修改用户密码、过期时间、认证信息等 。
参数 | 作用 |
-l | 锁定用户 |
-u | 解锁 |
–stdin | 允许通过标准输入修改用户密码; |
-d | 使该用户可以使用空密码登录 |
-e | 强制用户下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法 |
[root@linuxprobe ~]# passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@linuxprobe ~]# passwd linuxprobe
Changing password for user linuxprobe.
New password:
Retype new password:
passwd: all authentication tokens updated successfully
删除用户
userdel [选项] 用户名
参数 | 作用 |
-f | 强制删除用户 |
-r | 同时删除用户及其家目录 |
文件权限
字符 | 类型 |
- | 普通文件 |
d | 目录文件 |
l | 链接文件 |
b | 块设备文件 |
c | 字符设备文件 |
p | 管道文件 |