Linux shell 基础学习
Linux shell 基础学习
1.Shell基础
shell脚本初识
用echo命令写第一个Linux脚本
[root@cuizja learnlinux]# vi hello.sh
#!/bin/bash
# my first shell
echo -e "\e[1;36m helloworld \e[0m"
这里是一个最简单的linux脚本格式,其中#表示注释,但是第一行的#!/bin/bash比较特殊,表示声明什么类型的shell,然后下边开始书写脚本,上述命令的结果表示一个带颜色的helloworld.
现在虽然已经将脚本写完了,但是还是不能直接执行呢
[root@cuizja learnlinux]# ./hello.sh
-bash: ./hello.sh: Permission denied
在Linux中想要运行一个脚本,有两种方式:
- 赋予执行权限,直接运行
[root@cuizja learnlinux]# chmod 755 hello.sh
[root@cuizja learnlinux]# ./hello.sh
- 通过Bash调用执行脚本
[root@cuizja learnlinux]# bash hello.sh
这里比较推荐第一种,因为赋予权限之后可以多次执行,比较方便
2.命令别名与快捷键
alias 查看系统中所有命令的别名
alias 别名='原命令' 设定命令别名
unalias 别名 删除别名,临时删除
但是这样修改也是有一个缺点的,那就是,每次关机,重启或者类似操作,别名都会还原会初始值.
这时候,如果想要让别名永久生效的话,就需要将别名写入环境变量配置文件中
vi ~/.bashrc
# 这里的~表示家目录,例如root用户在/root下,其他用户例如user1在home/user1下
命令生效顺序
- 执行用绝对路径或相对路径执行的命令
- 执行别名
- 执行Bash的内部命令
- 执行按照$PATH环境变量定义的目录顺序查找到的第一个命令
** 常用快捷键**
- ctrl+c 强制终止当前命令
- ctrl+l 清屏
- ctrl+a 光标移动到命令行首
- ctrl+e 光标移动到命令行尾
- ctrl+u 从光标所在位置删除到行首
- ctrl+z 把命令放入后台
- ctrl+r 在历史命令中搜索
3.历史命令
history [选项] [历史命令保存文件] 查看命令历史记录文件
历史命令保存文件:~/.bash_history
选项
-c清空历史命令-w把缓存中的历史命令写入历史命令保存文件
[root@cuizja learnlinux]# history -w
[root@cuizja learnlinux]# history
注意:历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改.
历史命令的调用
- 使用上下箭头调用以前的历史命令
- 使用
!n重复执行历史命令保存文件的中第n条历史命令 - 使用
!!重复执行上一条命令 - 使用
!字符串重复执行最后一条以该字符串开头的命令
4.输出重定向
标准输入输出
| 设备 | 设备文件名 | 文件描述符 | 类型 |
|---|---|---|---|
| 键盘 | /dev/stdin | 0 | 标准输入 |
| 显示器 | /dev/sdtout | 1 | 标准输出 |
| 显示器 | /dev/sdterr | 2 | 标准错误输出 |
输出重定向
| 类型 | 符号 | 作用 |
|---|---|---|
| 标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出输出到指定的文件或设备中. |
| 标准输出重定向 | 命令 >>文件 | 以追加的方式,把命令的正确输出输出到指定的文件或设备中. |
| 标准错误输出重定向 | 错误命令 2> 文件 | 以覆盖的方式,把命令的错误输出输出到指定的文件或设备中. |
| 标准错误输出重定向 | 错误命令 2>> 文件 | 以追加的方式,把命令的错误输出输出到指定的文件或设备中. |
这里错误命令 2> 文件中的2就是文件描述符,这里的错误输出是不能在>两侧加空格.
正确输出和错误输出同时保存
| 命令 | 作用 |
|---|---|
| 命令 > 文件 2>&1 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中. |
| 命令 >> 文件 2>&1 | 以追加的方式,把正确输出和错误输出都保存到同一个文件中. |
| 命令 &>文件 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中. |
| 命令 &>>文件 | 以追加的方式,把正确输出和错误输出都保存到同一个文件中. |
| 命令>>文件1 2>>文件2 | 把正确的输出追加到文件1中,把错误的输出追加到文件2中. |
这里有一个有意思的地方,linux中有一个/dev/null目录,我们可以把他当做黑洞,或者可以理解为不能回收的回收站,当我们需要执行一条命令,但是不需要查看他的结果的时候,可以这样执行:
[root@cuizja learnlinux]# ls &>/dev/null #这里将输出内容丢入了null这个文件,就直接没有了.
输入重定向
wc [选项] [文件名]
选项:
- -c统计字节数
- -w统计单词数
- -l统计行数
命令 < 文件 把文件作为命令的输入
命令 << 标识符 把标识符与标识符之间的内容作为命令输入.
5.管道符
多命令顺序执行
| 多命令执行符 | 格式 | 作用 |
|---|---|---|
; |
命令1 ; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& |
命令1 && 命令2 | 逻辑与 当命令1正确执行,则命令2才会执行 当命令1执行不正确,命令2不会执行 |
| ` | ` |
管道符
命令1 | 命令2 将命令1的正确输出作为命令2的操作对象
示例:
[root@cuizja learnlinux]# ll -a /etc/ | more ##分页显示目录列表
[root@cuizja learnlinux]# netstat -an | grep "ASTABLISHED" ##查看当前主机连接的用户记录
6.通配符
通配符
| 通配符 | 作用 |
|---|---|
| ? | 匹配一个任意字符 |
| * | 匹配0个或任意多个任意字符,也就是匹配任何内容 |
| [] | 匹配中括号中任意一个字符,例如[abc]代表一定匹配一个字符,这个字符可以是a或b或c |
| [-] | 匹配中括号中任意一个字符,-代表一个范围,例如[a-z]代表匹配一个小写字母 |
| [^] | 逻辑非,表示匹配中括号中的一个字符,例如[^0-9]代表匹配一个不是数字的字符 |
Bash中的特殊符号
| 符号 | 作用 |
|---|---|
'' |
单引号,在单引号中的所有特殊符号都没有特殊含义,包括$,`` `(反引号) |
"" |
双引号,在双引号中的特殊符号都没有特殊含义,但是$,``(反引号)和`是例外,拥有"调用变量的值","引用命令","转移符"的作用. |
| ``` ` | 反引号,反引号括起来的内容是系统命令,在Bash中会先执行他. |
$() |
和反引号作用相同,用来引用系统命令 |
# |
在shell脚本中,#开头的行代表注释 |
$ |
用于调用变量的值,如需调用变量name时,用$name |
\ |
转移符,跟在\之后的特殊符号将失去特殊含义,变为普通字符,如\$将输出$符号,而非变量引用 |
7.VI编辑器
VI编辑器的操作分为三种模式:命令模式,输入模式,底行模式
底行模式也可以算作命令模式,知识底行模式需要输入:然后输入命令回车执行,而命令模式输入完立即执行.
底行模式常用指令
:w保存:q退出:!强制执行:ls列出当前编辑器中打开的所有文件:n切换到编辑器中打开的下一个文件,大写N表示上一个文件:15将光标快速定位到第15行/key将光标向后搜索定位到第一个key所在的位置?key将光标向前搜索定位到第一个key所在的位置
命令模式常用指令
h光标左移j光标下移k光标上移l光标右移ctrl+f向下翻页 frontctrl+b向上翻页 backctrl+d向下翻半页 downctrl+u向上翻半页 updd删除光标所在行o在光标所在行的下方插入一行并切换到输入模式yy复制光标所在的行p在光标所在行的下方粘贴(小写p)P在光标所在行的上方粘贴(大写P)
8.用户和用户组
用户: 使用操作系统的人
用户组: 具有相同系统权限的一组用户.
-
/etc/group 存储当前系统中所有用户组信息
Group : x : 123 : abc,def,xyz
组名称 : 组密码占位符 : 组编号 : 组中用户名列表
如果组中用户名列表为空,索命组名和用户名相同,且组中只有一个用户
root用户组编号为0,1~499位系统预留组编号,用户自己新建组号从500开始
-
/etc/gshadow 存储当前系统中用户组的密码信息
Group : * : : abc,def,xyz
组名称 : 组密码 : 组管理者 : 组中用户名列表
如果组的密码为空或者*,!都可以认为组没有密码.
组管理者为空,表示组内所有用户都可以管理列表
-
/etc/passwd 存储当前系统中所有用户的信息
user : x : 123 : 456 : XXXXXX : /home/user :/bin/bash
用户名 : 密码占位符 : 用户编号 :用户组编号 : 用户注释信息 : 用户主目录 : shell类型
-
/etc/shadow 存储当前系统中所有用户的密码信息
user : vf;/Zu8sdf... : : : : :
用户名 : 密码 : : : : :
用户组操作
-
groupadd [选项] 用户组名
-g 编号添加组编号 -
groupmod [选项] 用户组名
-n 新组名修改用户组名-g 编号修改组编号 -
groupdel [选项] 用户组名
用户可以同时属于多个组,一个主要组,多个附属组
-
gpasswd [选项] 组名
-a 用户名用户添加附属组-d 用户名用户删除附属组选项为空的时候直接进入组密码设置.
-
newgrp 附属组名称
需要属于这个组的用户执行的命令,并非root用户执行
用户操作
-
useradd [选项] 用户名
-g 组名用于指定所属组-G 组名用于指定所属附属组-d /home/xxx用于指定用户名个人目录 -
usermod [选项] 用户名
-c content用于添加用户备注-l 新用户名用于修改用名 -
userdel [选项] 用户名
-r删除用户名同时删除个人文件夹 -
passwd [选项] 用户名
-l锁定用户-u解锁用户-d清除用户密码
如果禁止除root外所有普通用户登录linux,只需在etc目录下创建nologin文件即可
[root@cuizja learnlinux]# touch /etc/nologin
切换用户身份
su 用户名如果不添加用户名,即为切换到root用户

浙公网安备 33010602011771号