user 用户相关命令
useradd username
passwd username
usermod -l usernewname username
userdel usernewname
# 强制删除用户usertest主目录和邮件池
userdel -rf usertest
group 用户组相关命令
groupadd groupname
# 查看用户所在的组
groups username
# 更改组名
groupmod -n groupname groupnewname
groupdel groupnewname
管理用户与组
# 往group1中添加用户test
gpasswd -a test group1
# 删除group1中的test
gpasswd -d test group1
# 查看组中有几个用户
cat /etc/group | grep groupname
时间
date
date -d "2021-09-09 12:00:01"
# 修改时间
date -s "2021-09-09 12:00:01"
logname 显示登录用户名
su 切换用户
# 切换到root用户执行命令, 再切换回当前用户, 需要输入root密码
su -c ls root
id 查看用户id 用户组id
top 命令 实时监控进程
# 停止监控
q
# 显示完整命令
top -c
# 指定pid
top -p 3550
PS
# 当前正在运行
ps
# 全部运行
ps -A
# 查看更全的信息
ps -ef
# 指定用户进程信息
ps -u username
Kill
# 杀掉进程
kill 999
# 彻底杀掉
kill -9 999
# 杀掉用户进程
kill -9 $(ps -ef | grep username)
killall -u username
shutdown
# 关机
shutdown
# 取消关机
shutdown -c
# 立即关机
shutdown -h now
# 警告 1分钟后关机
shutdown +1 "1分钟关机"
# 警告 1分钟后重启
shutdown -r +1 "1分钟重启"
who 当前登录系统的用户
who
who -H
timedatectl 设置时间
# 查看所有时区
timedatectl list-timezones
# 设置野区
timedatectl set-timezone Asia/Shanghai
# 禁用ntp
timedatectl set-ntp false
# 启用ntp
timedatectl set-ntp true
clear 清屏 command + L 同样能做到
clear
ls
ls
# 显示文件夹(不隐藏的文件与文件夹详细信息)
ls -l
# 全部文件夹与文件(包含隐藏)
ls -a
ls -al
pwd 打印目录
pwd
cd 切换路径
# 相对路径
cd testdir
# 绝对
cd /home/test
# 返回上一级
cd ..
# 返回home
cd
# 返回前一个目录
cd -
mkdir 创建文件夹
mkdir folder
# 创建多级目录
mkdir -p test/folder
rmdir 删除空文件夹
rmdir folder
# 删除多级空文件夹
rmdir -p test/test
rm 删除文件或文件夹
rm a.txt
# 删除里面的目录和文件, 可删除多级目录和文件
rm -r test
# 强制删除
rm -f a.txt
cp 文件复制
cp test/a.txt copy.txt
# 复制test文件夹, test文件夹内的文件夹与文件, 全量复制
cp -r test testnew
# 与上面的含义不同, 把test文件夹内的文件夹与文件, 复制到目录testnew下
cp -r test/ testnew
# 复制所有文件
cp * testnew
mv 移动文件夹或文件, 同一目录就有改名的效果
mv test/a.txt testnew
# 改名
mv a.txt aaa.txt
文件drwxr-xr-x
# 第1位
# d 文件夹 - 文件 l链接
# r读 w 写 x可执行
# 第2-4位
# 当前用户的权限
# 第5-7 属组的权限
# 第8-10位 其他组的权限
chgrp (change group)
chgrp root a.txt
# 多了提示语句, 功能和去掉一样
chgrp -v test a.txt
chown (change own) 修改用户和用户组
chown root a.txt
# 目录及内文件夹与文件都修改组
chown -R root folder
# 修改用户与用户组, root(用户):root(用户组)
chown -R root:root folder
chmod 修改权限, 010 权限设置数字二进制,0 则无此权限, 1则有权限, 一个文件有3组这样的
chmod 755 a.xtx
# folder 文件夹内全部文件与文件夹
chmod 755 folder
# u 当前用户, g当前用户组, o其他组
chmod u=rwx,g=rx,o=r a.txt
chmod -R u=rwx,g=rx,o=r folder
# 去掉其他组的权限
chmod -R o-rwx folder
练习java html swift 用户可操作一个文件夹
# 创建用户
useradd java
useradd web
useradd swift
# 创建用户组
groupadd dev
# 用户java web swift添加到用户组dev
gpasswd -a java dev
gpasswd -a web dev
gpasswd -a swift dev
# 创建文件夹
mkdir -p /tmp/work
# 文件夹添加dev组
chgrp -R dev /tmp/work
# 文件夹增加读写执行权限
chmod -R 770 /tmp/work
vim/vi
# 普通模式 -> 退出文件
# :q 退出
# :q! 强制退出
# :wq 保存退出
# :wq! 强制保存退出
# 普通模式->编辑模式
# i 当前字进入编辑模式
# I 在行首进入编辑模式
# a 当前字尾进入编辑模式
# A 行尾进入编辑模式
# o 当前行下一行进入编辑模式
# O 当前行上一行进入编辑模式
# 编辑模式 -> 普通模式
# esc 返回键到普通模式
# 普通模式中, 移动光标
# j 向下一行
# k 向上一行
# h 向前
# l 向后
# 移动指定12行
# 12G
touch 创建文件
# 不存在则创建, 存在则更新修改时间属性
touch a.txt
# 创建a 1-10.xt文件
touch a{1..10}.txt
# 查看文件详细信息
stat a.txt
cat 查看小文件内容(bat 类似软件)
cat a.txt
# 显示行号
cat -n a.txt
less 分屏显示文件内容
less a.txt
# 查看时显示行号
less -N a.txt
# 快捷键同vim
tail 查看文件尾
# 默认展示最后10行
tail a.txt
# 展示3行
tail -3 a.txt
# 动态展示, 会不断刷新
tail -f a.txt
# 5行动态展示
tail -5f a.txt
# 从2行展示到末尾
tail -n+2 a.txt
# 展示最后60字
tail -c 60 a.txt
head 查看文件头, 与tail 一致
grep 搜索文件内容(ag同样也可搜索)
# 查看指定文件的内容
grep "word" a.txt
# 查看指定文件的内容, 并显示行号
grep -n "word" a.txt
# 忽略大小写
grep -i "w" a.txt
# 不包含w则展示这一行
grep -v "w" a.txt
# 与其他命令连用, 查看包含ssh的进程
ps -ef | grep "ssh"
# 查看包含ssh的进程, 不包含本次查询进程
ps -ef | grep ssh | grep -v "grep"
# 查看匹配数量
ps -ef | grep -c ssh
echo
echo "hello"
# 覆盖写入hello 到 a.txt
echo "hello" > a.txt
# 追加写入hello 到 a.txt
echo "hello" >> a.txt
# 把错误或正确的日志追加写入到 error.log中
cat nofile.txt &>> error.log
awk
aa 90 93 90
bb 100 93 90
# 查看包含aa和bb在文件的内容, 不能有空格
cat a.txt | awk '/aa|bb/'
# 空格切割, 再打印出来
# -F ',' 以,切割
# $ + 数字 获取第几段
# $0 获取 当前行
cat a.txt | awk -F ' ' '{print $1,$2,$3,$4}'
# '{OFS="==="}' 代替切割符
cat a.txt | awk -F ' ' '{OFS="==="}{print $1,$2,$3,$4}'
# 制表符 \t 替换切割符
cat a.txt | awk -F ' ' '{OFS="\t"}{print $1,$2,$3,$4}'
# 切割完, 第一段内容转成大写
# toupper() 转成大写
# tolower() 转成小写
# length() 返回字符长度
cat a.txt | awk -F ' ' '{print toupper($1),$2,$3,$4}'
# 'BEGIN{}{totel=totel+$3}END{print totel}'
# 求最后一位合
cat a.txt | awk -F ' ' 'BEGIN{}{totel=totel+$3}END{print totel}'
# 总分和总人数
cat a.txt | awk -F ' ' 'BEGIN{}{totel=totel+$3}END{print totel,NR}'
# 总分和总人数 平均分
cat a.txt | awk -F ' ' 'BEGIN{}{totel=totel+$3}END{print totel,NR,(totel/NR)}'
ln 软链接
# ln -s 源 软链, 源可以是文件和文件夹
ln -s test/a.txt a.txt
ln -s test/folder folder
find 查找文件
find . -name a.c
# 查找修改时间1天内的
find . -ctime -1
find ~ -ctime -1
gzip 压缩
# gzip 压缩, 会删除原文件
gzip a.txt
# 解压-d, 打印过程, 解压同样会删除原压缩文件
gzip -dv a.txt.gz
# 压缩全部文件
gzip *
gunzip
# 解压同样会删除原压缩文件
gunzip a.txt.gz
gunzip *
tar, 本身不具有压缩功能, 只是调用其他压缩软件
# -c 建立新的压缩文件
# -v 显示指令执行过程
# -f <备份文件> 指定压缩文件
# -z 通过gzip处理压缩文件
# -t 列出压缩文件中的内容
# -x 表示解压
# 仅打包文件
tar -cvf a.tar a.txt
# 打包并压缩
tar -zcvf a.gz a.txt
# 仅查看压缩包中内容
tar -ztvf error.gz
# 解压压缩包
tar -zxvf error.gz
zip
# -q 不显示指令执行过程
# -r 递归处理, 指定目录和子目录 子文件一并处理
zip -rq test.zip test
unzip
# -l 显示压缩包中的文件
unzip -l test.zip
# 直接解压
unzip test.zip
# 解压到指定文件夹内
unzip -d ~/dev test.zip
bzip2, 压缩时间长, 压缩率高
bzip2 a.txt
# 打印过程
bunzip2 -v a.txt.bz2
ifconfig
# 查看网卡信息
ifconfig
# 关闭网卡
ifconfig eth0 down
# 启用网卡
ifconfig eth0 up
# 配置ip
ifconfig eth0 192.168.1.200
# 配置ip 和 子网掩码
ifconfig eth0 192.168.1.200 netmask 255.255.255.0
ping
ping 192.168.0.100
ping www.baidu.com
# -c 10 ping 指定10次
ping -c 10 192.168.0.100
ping -c 10 www.baidu.com
netstat 显示网络状况
# 所有的连接情况
netstate -a
# -i 显示网卡列表
netstat -i
lsblk (list block缩写) 列出硬盘使用情况
# 硬盘 硬盘分区信息
lsblk
# 显示详细系统信息
lsblk -f
df 硬盘使用情况
df
# 查看文件硬盘情况
df folder
# 查看所有详细信息
df --total
# -h MB GB KB显示
df -h
mount 挂载
mkdir folder
# 自动挂载
mount -t auto /dev/cdrom folder
# 解除
unmount folder
yum (Yellow dog Updater,Modified)
# 查看可用更新
yum check-update
# 更新所有
yum update
# 安装 更新tree
yum install tree
yum update tree
# 卸载
yum remove tree
# 搜索
yum search tree
# 清除缓存目录下的软件包
yum clean packages
# 清除缓存目录下的headers
yum clean headers
# 清除缓存目录下的旧的headers
yum clean oldheaders
# 清除缓存
yum clean
yum clean all
更改yum源, 或添加其他yum源
yum install wget
cd /etc/yum.repos.d
mv CentOS-BaseOS.repo CentOS-BaseOS.repo-backup
wget -O CentOS-BaseOS.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清空之前的缓存
yum clean all
# 使用新的源做缓存
yum makecache
rpm, 安装下载本地并安装, 不常用
shell 命令解释器, bash zsh 多种shell
# 查看默认shell
echo $SHELL
# vim a.sh
# 写入内容
#!/bin/zsh
# 注释
echo "Hello"
# 增加执行权限
chmod 755 a.sh
chmod +x a.sh
# 执行
./a.sh
# 多行注释
:<<! 内容
内容
!
shell 变量
- 普通变量
- 方式一
- 变量名=变量值 变量值必须是一个整体, 中间没有特殊字符
- 方式二
- 变量名=‘变量值’ 单引号中的内容, 原样赋值
- 方式三
- 变量名=“变量值” 如果双引号里面有其他变量, 会把变量的结果进行拼接, 然后赋值
- 方式一
number=10
echo $number
echo ${number}
a='10'
echo $a
echo ${a}
b='$number'
echo $a
c="10"
echo $b
echo ${b}
d="$number"
echo $d
- 命令变量
- 方式一
- 变量名=
命令
- 变量名=
- 方式二
- 变量名=$(命令)
- 方式一
e=`date`
echo $e
# 推荐方式二
f=$(date)
echo $f
- 使用变量
- 方式一
- $变量名 非标准
- 方式二 “$变量名” 非标准
- 方式三 ${变量名} 在双号里面使用变量的值
- 方式四 “${变量名}” 标准使用方式
- 方式一
f=$(date)
result="时间${f}"
# 标准使用
echo "${result}"
- 只读变量
echo "${result}"
readonly result
result="aaa"
- 删除变量
f=$(date)
echo "${f}"
unset f
echo "${f}"
shell 数组
- 定义数组, 数组名=(值1 值2…)
arr=(1 2 3 4 5)
- 给数组的元素赋值, 数组名[索引]=值, bash(0开始) 和 zsh(1开始)的脚标开始位置不一致
arr[1]=10
- 获取元素, ${数组名[下标]}
${arr[1]}
echo ${arr[1]}
- 获取长度, ${#数组名[*]} ${#数组名[@]}
${#arr[*]}
${#arr[@]}
echo ${#arr[*]}
echo ${#arr[@]}
shell 算术运算符, 原生bash不支持数学运算
# 格式中有空格, 注意
# + expr $a + $b
# - expr $a - $b
# * expr $a \* $b
# / expr $a / $b
# % expr $a % $b
# = $a = $b
# ++ -- 自增自减 ((a++))
num1=`expr 2 + 2`
echo $num1
num2=`expr 2 \* 2`
echo $num2
a=10
b=20
num3=`expr $a + $b`
echo $num3
c=30
num4="$c"
echo $num4
e=1
((e++))
echo $e
shell 字符串运算符, 1为假 0为真
# 运算符, []之间必须有空格
# = 检测2个字符串是否相等 [ $a = $b ]
# != 检测2个字符串是否不相等 [ $a != $b ]
# -z 检测字符串长度是否为0 [ -z $a ]
# -n 检测字符串长度是否不为0 [ -n "$a" ]
# $ 检测字符串是否为空 [ $a ]
#!/bin/bash
a="aaa"
b="bbb"
[ "${a}" = "${b}" ]
echo $?
[ "${a}" != "${b}" ]
echo $?
[ -z "${a}" ]
echo $?
[ -n "${a}" ]
echo $?
[ $"${a}" ]
echo $?
# 其中$?, 获取上一语句运行结果
# 获取字条串长度
echo ${#a}
shell 关系运算符, 只支持数字, 不支持字符串, 除非字符串是数字
1为假, 0为真
# -eq 检测2个数是否相等 [ $a -eq $b ]
# -ne 检测2个数是否不相等 [ $a -ne $b ]
# -gt 检测左边的数大于右边 [ $a -gt $b ]
# -lt 检测左边的数小于右边 [ $a -lt $b ]
# -ge 检测左边的数是否大于等于右边 [ $a -ge $b ]
# -le 检测左边的数是否小于等于右边 [ $a -le $b ]
#!/bin/bash
a="111"
b="222"
[ "${a}" -eq "${b}" ]
echo $?
[ "${a}" -ne "${b}" ]
echo $?
[ "${a}" -gt "${b}" ]
echo $?
[ "${a}" -lt "${b}" ]
echo $?
[ "${a}" -ge "${b}" ]
echo $?
[ "${a}" -le "${b}" ]
echo $?
shell 布尔运算符
# ! 取反运算 [ ! false ]
# -o 或运行, 有一个表达式为true 则返回true [ $a lt 20 -o $b -gt 100 ]
# -a 与运行, 2个表达式都为true 才返回true [ $a lt 20 -a $b -gt 100 ]
#!/bin/bash
a=111
b=222
[ ! "${a}" -eq "${b}" ]
echo $?
[ "${a}" -gt 100 -o "${a}" -lt 100 ]
echo $?
[ "${a}" -gt 100 -a "${a}" -lt 100 ]
echo $?
[ "${a}" -ge 100 -a "${a}" -le 200 ]
echo $?
shell 逻辑运算符
# 运算符
# && 逻辑的AND [[ true && true ]] 返回true
# || 逻辑OR [[ false || false ]] 返回false
#!/bin/bash
a=111
b=222
[[ "${a}" -gt 100 && "${a}" -lt 100 ]]
echo $?
[[ "${a}" -gt 100 || "${a}" -lt 100 ]]
echo $?
[[ "${a}" -ge 100 || "${a}" -le 200 ]]
echo $?
shell 判断
# 三种方式
if [ 条件 ]
then
语句体
if
if [ 条件 ]
then
语句体
else
语句体
if
if [ 条件 ]
then
语句体
elif [ 条件 ]
语句体
else
语句体
if
if [ $(ps -ef | grep -c "ssh") -ge 1 ]
then
echo "true"
fi
if [ $(ps -ef | grep -c "nonono") -gt 2 ]
then
echo "true"
else
echo "flase"
fi
if [ $(ps -ef | grep -c "nonono") -gt 2 ]
then
echo "true"
elif [ $(ps -ef | grep -c "nonono") -eq 1 ]
then
echo "one"
else
echo "flase"
fi
shell 选择语句
变量
case 变量 in
模式1 )
语句体1
;;
模式2 )
语句体2
;;
esac
#!/bin/zsh
# 注释
a=2
case "${a}" in
"1" )
echo '1'
;;
"2" )
echo '1'
;;
esac
shell 循环语句
for 变量 in 范围
do
循环体
done
#!/bin/zsh
# 注释
for loop in 1 2 3 4 5
do
echo $loop
done
while [ 条件 ]
do
语句体
done
#!/bin/zsh
# 注释
a=1
while [ "${a}" -le 10 ]
do
echo "${a}"
((a++))
done
shell 函数
函数必须调用
# 无参无返回值
函数名(){
函数体
}
函数名
#!/bin/zsh
# 注释
printhello(){
echo "Hello"
}
printhello
# 有参无返回值
函数名(){
echo $1
echo $2
}
函数名 a b
printab(){
echo $1
echo $2
}
printab 10 20
# 有参有返回值
函数名(){
echo $1
return $(($1+$2))
}
函数名 10 20
printhe(){
echo $1 + $2
#return `expr $1 + $2` 这样写也可
return $(($1+$2))
}
printhe 10 20
echo $?
练习
- 依次输入2个数, 打印合
- read 读取屏幕内容
#!/bin/bash
# 注释
getab(){
echo "第1个数"
read number1
echo "第2个数"
read number2
return $(($number1+$number2))
}
getab
echo $?