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 切换路径

Fasd 跳转比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 $?