以bash为例,记录linux系统shell脚本的基本语法和常用命令。
没必要都背下来,实际用到不记得了一般也是在网上搜,但需要大概知道都能做什么,所以记下来。
常用命令:
ls:列出目录下的文件和目录
- ls -l:显示详细信息,包括文件权限、所有者、大小、修改时间等
- ls -a:显示隐藏文件
- ls -d:显示目录本身,而不是目录里的文件
- ls -R:递归显示目录下所有文件和目录
- ls -lh:以更易读的形式显示文件大小
- ls -t:按修改时间排序
- ls -S:按文件大小排序
- ls -X:按文件类型排序
pwd:显示当前目录的路径
cd:切换目录
- cd ..:返回上级目录
- cd -:返回上次所在目录
- cd ~:返回用户主目录
- cd /:切换到根目录
mkdir:创建目录
- mkdir -p:创建多级目录
- rmdir:删除空目录
touch:创建文件
rm:删除文件或目录
- rm -f:强制删除文件或目录
- rm -r:递归删除目录
- rm -i:删除前询问用户
- rm -I:删除前不询问用户
mv:移动或重命名文件或目录
- mv -i:移动或重命名前询问用户
- mv -I:移动或重命名前不询问用户
cp:复制文件或目录
- cp -r:递归复制目录
find:搜索文件或目录
- find . -name “*.txt”:搜索当前目录下所有.txt文件
- find / -name “passwd”:搜索系统所有/目录下名为passwd的文件
- find / -user root:搜索系统所有/目录下所有root用户的文件
- find / -perm -u=x:搜索系统所有/目录下所有可执行文件
- find / -size +10M:搜索系统所有/目录下大小大于10M的文件
- find / -type f -size +10M:搜索系统所有/目录下类型为文件且大小大于10M的文件
- find / -type d -empty:搜索系统所有/目录下类型为目录且为空的文件夹
chmod:修改文件或目录权限
- chmod 777 file:给file文件添加所有权限(7=rwx,777={u(ser)=7,g(roup)=7,o(ther)=7 })
chown:修改文件或目录所有者
- chown user file:将file文件的所有者修改为user
- chown user:group file:将file文件的所有者和组修改为user:group
chgrp:修改文件或目录组
- chgrp group file:将file文件修改为group组
ln:创建链接
- ln (无参数)file link:创建硬链接
- ln -s (..):创建软链接
- ln -f (..):强制创建链接
ps:查看进程信息
- ps -ef:显示所有进程信息
- ps -ef | grep “keyword”:搜索进程信息
- ps -p pid:显示指定进程信息
- ps -u user:显示指定用户的进程信息
- ps -eo pid,user,cmd | grep “keyword”:搜索进程信息
cat:查看文件内容
- cat -n:显示行号
- cat -b:显示不可打印字符
- cat -T:显示特殊字符
- cat file1 file2:显示多个文件内容
more和less: - 展示文件内容,more命令一次只能看到一屏的内容,less命令可以翻页查看文件内容。
- less:类似more命令,但是可以向前向后翻页,空格翻页,回车翻页,q退出。
- more:类似less命令,但是只能向下翻页。
head:显示文件开头内容
- head -n:显示前n行内容
- head -c:显示前c字节内容
tail:显示文件末尾内容
- tail -n:显示后n行内容
- tail -f:实时显示文件末尾内容
echo:输出内容到屏幕或文件
- echo -e:支持转义字符
- echo -n:不输出换行符
grep:搜索文件内容
- grep -i:忽略大小写
- grep -v:反向选择
- grep -n:显示行号
- grep -c:显示匹配行数
- grep -A:显示匹配行及后n行
- grep -B:显示匹配行及前n行
- grep -C:显示匹配行及上下n行
- grep -o:显示匹配内容
awk:数据分析语言
- awk ‘{print $1}’:打印第一列内容
- awk ‘{print $1,$2}’:打印第一、二列内容
- awk ‘{sum+=$1} END {print sum}’:求和
- awk ‘{print $1,$2}’ file1 file2:打印多个文件内容
- awk -F:指定分隔符
- awk -v:指定变量
- awk -f:执行外部脚本
- awk -v OFS=”:” ‘{print $1,$2}’:指定输出分隔符
sort:排序文件内容
- sort -n:按数字排序
- sort -r:反向排序
- sort -k:按指定列排序
- sort -t:指定分隔符
- sort -u:去除重复行
- sort -m:合并已排序文件
- sort -o:输出到文件
cut:提取文件内容
- cut -d:指定分隔符
- cut -f:指定列
- cut -c:指定字节
uniq:去除重复行
wc:统计文件行数、字数、字节数
- wc -l:显示行数
- wc -w:显示字数
- wc -c:显示字节数
date:显示当前日期和时间
- date “+%Y-%m-%d %H:%M:%S”:显示格式化日期和时间
cal:显示日历
- cal 2024:显示2024年日历
- cal -3:显示上个月、本月、下个月日历
- cal -s:显示星期几缩写
- cal -m:显示月份缩写
- cal -y:显示年份缩写
whoami:显示当前用户
who:显示当前登录用户信息
- who -b:显示当前登录用户的位置
- who -m:显示当前登录用户的电话号码
- who -u:显示当前登录用户的用户ID
groups:显示当前用户组信息
- groups user:显示指定用户的用户组信息
id:显示当前用户信息
- id user:显示指定用户信息
last:显示登录记录
- last -u:显示指定用户的登录记录
uptime:显示系统运行时间
hostname:显示主机名
uname:显示系统信息
- uname -a:显示全部信息
- uname -s:显示操作系统名
- uname -n:显示主机名
- uname -r:显示内核版本
- uname -m:显示硬件平台
man:显示命令帮助信息
- man command:显示command命令的帮助信息
- man -k keyword:搜索keyword关键字的帮助信息
apropos:搜索帮助信息
- apropos keyword:搜索keyword关键字的帮助信息
alias:设置命令别名
- alias name=’command’:设置name别名为command命令
- unalias name:删除name别名
history:显示历史命令
- history:显示所有历史命令
- history -c:清空历史命令
- !n:执行第n条历史命令
- !!:执行上一条命令
- !string:执行最近的以string开头的命令
其他命令
top:查看系统资源占用情况
df:查看磁盘使用情况
du:查看目录或文件大小
free:查看系统内存使用情况
ifconfig:查看网络接口信息
netstat:查看网络连接信息
ssh:远程登录
scp:远程复制文件
ssh-keygen:生成ssh密钥
ssh-copy-id:将ssh密钥拷贝到远程主机
ssh-agent:管理ssh密钥
ssh-add:添加ssh密钥到ssh-agent
ssh-keyscan:扫描远程主机的ssh密钥
sshpass:通过ssh远程执行命令
wget:下载文件
curl:下载文件
tar:打包和压缩文件
gzip:压缩文件
bzip2:压缩文件
unzip:解压文件
zip:压缩文件
unrar:解压rar文件
rsync:同步文件
mount:挂载磁盘
umount:卸载磁盘
fdisk:管理磁盘分区
lsof:查看系统打开的文件
kill:杀死进程
killall:杀死进程
ln:创建链接
bash脚本语法:
- 注释:#开头的行表示注释
- 多行注释:/* */
- 变量:以$开头,如$var表示变量var的值
- 字符串变量:用双引号括起来的内容,如”$str”
- 数字变量:用$((…))括起来的内容,如”$((num1+num2))”
- 数组变量:用${array_name[index]}表示数组元素,如”${array_name[0]}”
- 环境变量:用$ENV{var}表示环境变量var的值
- 字符串:用双引号或单引号括起来的内容,如”hello world”或’hello world’
- 转义字符:\n、\t、\r、\b、\a、\e、\0、\、$、"、'
- 变量替换:$var或${var},如”$name”或”${name}”
- 运算符:支持算术运算、关系运算、逻辑运算、字符串运算
- 算术运算符:+、-、、/、%、*
- 关系运算符:-eq、-ne、-gt、-lt、-ge、-le
- 逻辑运算符:!、&&、||
- 条件语句:if、then、else、fi
- 多分支条件:if [ $num -eq 1 ] || [ $num -eq 2 ]; then…; fi
- 双分支条件:if [ $num -eq 1 ]; then…; else…; fi
- 循环语句:for、while、do、done
- for循环:for var in item1 item2…; do…; done
- while循环:while [ condition ]; do…; done
- until循环:until [ condition ]; do…; done
- 控制结构:case、esac、select、function
- case语句:case $var in pattern1) command1;; pattern2) command2;;…; esac
- select语句:select var in item1 item2…; do…; done
- 函数:function name(){…}
- 调用函数:name arg1 arg2…
- 脚本:#!/bin/bash
- 脚本参数:$#、$0、$1、$2、…、$@、$*
- 脚本执行:./script.sh arg1 arg2…
- 数组:array_name[index]=value
- 后台运行:&
- nohup command &:即使退出系统,command仍然在后台运行
- 管道:|
管道符|表示将前一个命令的输出作为后一个命令的输入。如ls -l /etc | grep “^-“表示列出/etc目录下以”-“开头的文件信息。 - 重定向:>、>>、<、<<
- >:输出重定向,将命令的输出重定向到文件,覆盖原文件内容
- >>:追加重定向,将命令的输出重定向到文件,追加到原文件内容
- <:输入重定向,将文件内容作为命令的输入
- <<:here文档,将后面的内容作为命令的输入,可以跨行
- 将标准输出重定向:
- command > file:将命令的输出重定向到文件
- command >> file:将命令的输出追加到文件
- command < file:将文件内容作为命令的输入
- command << delimiter:here文档,将后面的内容作为命令的输入,可以跨行
- 将标准错误重定向:
- command 2> file:将命令的错误输出重定向到文件
- command 2>> file:将命令的错误输出追加到文件
- 合并重定向:
- command1 > file 2>&1:将命令的输出和错误输出合并到文件
- 筛去错误输出:
- command 2>/dev/null:筛去命令的错误输出
- 环境变量:$PATH、$HOME、$PWD、$USER、$SHELL、$UID、$PS1、$PS2、$PS3、$PS4
- $PATH:搜索命令的路径
- $HOME:用户主目录
- $PWD:当前工作目录
- $USER:当前用户
- $SHELL:当前登录的shell
- $UID:当前用户ID
- $PS1:命令提示符,默认是”$”
- $PS2:第二个命令提示符,默认是”>”
- $PS3:第三个命令提示符,默认是”#”
- $PS4:第四个命令提示符,用于调试脚本
- 退出状态:0表示成功,非0表示失败
- $?:上个命令的退出状态
- $!:上个后台命令的进程号
- 自定义退出状态:exit n,n为0-255之间的整数
- 判断退出状态:if [ $? -eq 0 ]; then…; else…; fi
- 取消自定义退出状态:trap “” EXIT
- 调试:set -x、set -e、bash -x
- set -x:显示执行的命令
- set -e:遇到错误立即退出脚本
- bash -x:显示执行的脚本内容
- 脚本参数:$#、$0、$1、$2、…、$@、$*
- $#:传递给脚本的参数个数
- $0:脚本名
- $1、$2、…:传递给脚本的第一个参数、第二个参数、…
- $@:传递给脚本的所有参数,以”$1” “$2”…的形式展开
- $*:传递给脚本的所有参数,以”$1” “$2”…的形式展开,但是不包括脚本名
- 定时任务:crontab命令
- crontab -e:编辑定时任务
- crontab -l:列出定时任务
- crontab -r:删除定时任务
- 日志:logger命令
- logger “message”:记录日志信息
- logger -p priority “message”:设置日志级别,priority为emerg、alert、crit、err、warning、notice、info、debug
- 进程管理:nohup、&、jobs、kill、bg、fg、disown、wait、trap、killall、killpg、wait
- nohup command:不挂断地运行命令
- &:将命令放入后台运行
- jobs:显示当前后台任务
- kill pid:杀死进程
- kill -9 pid:强制杀死进程
- kill -l:列出所有信号名称
- bg pid:将进程放入后台
- bg %:将当前任务放入后台
- fg pid:将后台进程放入前台
- fg %:将当前任务放入前台
- disown:将当前工作目录切换到后台
- disown %:将当前任务的工作目录切换到后台
# 一个将任务放到后台,记下进程号,等任务完成后再拿到前台的脚本例子 #!/bin/bash # 将任务放到后台 some_command & # 将your_command替换为实际的命令 PID=$! # 记录进程号 echo "任务已放入后台,进程号: $PID" # 等待后台任务完成 wait $PID echo "任务已完成,进程号: $PID" # 将任务带回前台(如果需要) fg %1 # 假设%1是对应的作业号
- wait:等待子进程结束
- wait -n:等待n秒
- wait -p:显示进程号
- 用法举例:
#!/bin/bash # 后台运行sleep - sleep 10 & # 等待后台sleep结束 - wait # sleep结束后输出done - echo "done"
- trap command signal:设置信号处理命令
- killall command:杀死所有command进程
- killpg pid:杀死进程组
- 你不是杀手,你不要一直杀杀杀。
此方悬停