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
[root@cuizja learnlinux]# bash hello.sh
这里比较推荐第一种,因为赋予权限之后可以多次执行,比较方便
alias
查看系统中所有命令的别名
alias 别名='原命令'
设定命令别名
unalias 别名
删除别名,临时删除
但是这样修改也是有一个缺点的,那就是,每次关机,重启或者类似操作,别名都会还原会初始值.
这时候,如果想要让别名永久生效的话,就需要将别名写入环境变量配置文件中
vi ~/.bashrc
# 这里的~表示家目录,例如root用户在/root下,其他用户例如user1在home/user1下
命令生效顺序
** 常用快捷键**
history [选项] [历史命令保存文件]
查看命令历史记录文件
历史命令保存文件:~/.bash_history
选项
-c
清空历史命令-w
把缓存中的历史命令写入历史命令保存文件[root@cuizja learnlinux]# history -w
[root@cuizja learnlinux]# history
注意:历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改.
历史命令的调用
!n
重复执行历史命令保存文件的中第n条历史命令!!
重复执行上一条命令!字符串
重复执行最后一条以该字符串开头的命令标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /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 [选项] [文件名]
选项:
命令 < 文件
把文件作为命令的输入
命令 << 标识符
把标识符与标识符之间的内容作为命令输入.
多命令顺序执行
多命令执行符 | 格式 | 作用 |
---|---|---|
; |
命令1 ; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& |
命令1 && 命令2 | 逻辑与 当命令1正确执行,则命令2才会执行 当命令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" ##查看当前主机连接的用户记录
通配符
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个任意字符,也就是匹配任何内容 |
[] | 匹配中括号中任意一个字符,例如[abc]代表一定匹配一个字符,这个字符可以是a或b或c |
[-] | 匹配中括号中任意一个字符,-代表一个范围,例如[a-z]代表匹配一个小写字母 |
[^] | 逻辑非,表示匹配中括号中的一个字符,例如[^0-9] 代表匹配一个不是数字的字符 |
Bash中的特殊符号
符号 | 作用 |
---|---|
'' |
单引号,在单引号中的所有特殊符号都没有特殊含义,包括$ ,`` `(反引号) |
"" |
双引号,在双引号中的特殊符号都没有特殊含义,但是$ ,``(反引号)和 `是例外,拥有"调用变量的值",“引用命令”,"转移符"的作用. |
```` | 反引号,反引号括起来的内容是系统命令,在Bash中会先执行他. |
$() |
和反引号作用相同,用来引用系统命令 |
# |
在shell脚本中,#开头的行代表注释 |
$ |
用于调用变量的值,如需调用变量name时,用$name |
\ |
转移符,跟在\之后的特殊符号将失去特殊含义,变为普通字符,如\$ 将输出$符号,而非变量引用 |
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)用户: 使用操作系统的人
用户组: 具有相同系统权限的一组用户.
/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用户
未完待续~~