shell
Shell 不仅仅是命令行,也可以是GUI
Shell 是操作系统和用户交互的“接口
一般来说,我们说的Shell都是Unix Shell,可以认为是CLI
命令 / command
命令的本质是一个程序
这些程序具有发起系统调用(System Call)的能力
编写Shell脚本,其实是在编排这些程序的执行
除此之外,还有Shell语法解释器负责解释一行行
的Shell语句
常见shell解释器
Linux / Unix:
- bash
- sh
- zsh(推荐)
windows:
- CMD
- PowerShell
- WSL(推荐)
常见bash指令
文件新建
- touch : 新建文件
- mkdir :新建文件夹
文件删除
- rmdir :移除文件夹
- rm :移除文件夹
- rm -r :递归移除
- rm -rf :递归强制移除
文件移动
- mv ./source/a.txt ./target :将a.txt移动到target下
- mv -f ./source/a.txt ./target :将a.txt移动到target下并覆盖
- mv -n ./source/a.txt ./target :将a.txt移动到target下不覆盖
- cp ./source/a.txt ./target :将a.txt复制到target下
- cp ./source ./target :递归复制整个文件夹
文件查看
- cat ./config.json: 查看文件全部内容
- head -n 10 /xxx.log:查看文件前10行
- tail -n 10 /xxx.log:查看文件后10行
文件编辑
- nano
- vi / vim
进程相关
- ps :查看当前用户进程
- ps -ax :查看所有进程
- lsof -i :查看打开的网络相关的文件
- lsof -p 2222 :查看pid = 2222的进程的打开文件
- top :系统时时状态
- kill 2222 :杀死pid = 2222的进程
- kill -9 2222 :强制杀死pid = 2222的进程
(Kill命令实际上并不是在“kil”,本质是向进程发送信号。例如: kll-s SIGUSR134534实际上可以调试Nodejs应用,因为Nodejs会在收到SIGUSR1时进入调试模式。 优雅退出的原理就是监听SIGTERM信号,并递归地退出子进程:)
其他
- man 指令 :查看某指令详细用法
- grep : 筛选行
- lsof -i | grep LISTEN :找到所有正在被监听的端口
- awk :筛选列
- docker rm $(docker ps -a awkNR>1 {print $1J') : 除所有的docker容器
- chmod +x $(ls -al awk 'NR>1 {print $9}') :为当前目录下的所有文件添加可执行权限
bash编程基础
变量
#全局变量
STR=abc
#局部变量
local STR=abc
#环境变量
PATH:指定命令的搜索路径
HOME: 指定用户的主工作目录 (即用户登陆到Linux系统中时,默认的目录)
HISTSIZE: 指保存历史命令记录的条数
LOGNAME: 指当前用户的登录名
HOSTNAME: 指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的
SHELL: 指当前用户用的是哪种
ShellLANG/LANGUGE: 和语言相关的环境变量,使用多种语言的用户可以修改此环境变量
MAIL: 指当前用户的邮件存放目录
基础数据类型
#String
ASTRING=abc
ASTRING="abc defg"
#Number
ANUMBER=$[ 1+1 ]
ANUMBER=$(( 1+1 ))
#Array
AARRAY=(a b c d)
AARRAY=(1 2 3 4)
AARRAY[1]=0
运算
#组合
ASTRING=abcdefg
ANUMBER=$(( 1 + 1 ))
STR="The alphabet starts with $ASTRING"
echo $STR # The alphabet starts with abcdefg
SEQ=(1 $ANUMBER 3 4 5)
echo $SEQ #12345
#数学运算
NUM=$( 2+2 ) #4
NUM=$( 2-2 ) #0
NUM=$( 2*2 ) #4
NUM=$( 2/2 ) #1
条件语句
#条件语句 - if then
if conditionl
then
command1
elif condition2
then
command2
else
commandN
fi
#条件语句 - case
case $VAR in
condition1)
command1
;;
condition2)
echo command2
;;
*)
echo command3
;;
esac
比较符
#比较符
-Z var #检查变量var是否为空
-d file #检查file是否存在并是一个目录
-e file #检查file是否存在
-f file #检查file是否存在并是一个文件
-r file #检查file是否存在井可读
-s file #检查file是否存在并非空
-w file #检查file是否存在井可写
-x file #检查file是否存在并可执行
-O file #检查file是否存在并属于当前用户
-G file #检查file是否存在并其默认组与当前用户相同
filel -nt file2 #检查file1是否比file2新
filel -ot file2 #检查file1是否比file2旧
循环语句
for index in 1 2 3 4 5;do
echo "index="$index
done
for ((i=0; i<5; i++)); do
echo $i
done
while(( $i<=10 )) do
echo $i
done
函数定义
#定义
function custom_echo(){
local prefix="input is"
if [ -z $1 ]; then
echo "no input"
else
echo "$prefix $1"
fi
return 0
}
#在函数体中,可以使用Sn来获取第n个实参
#调用
custom echo # unknown
custom echo abc # input is abc
custom_echo abc # input is abc
echo $? #0
# $? : Shell中运行的每个命令都使用退出状态码 (exitstatus) 来告诉shell它完成了处理。退出状态码是一个0-255之间的整数值,在命令结束运行时由命令传给shell。可以在命令执行完毕后立即使用 S? 捕获
#其他特殊变量
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
s@与S*相同 但是使用时加引号,并在引号中返回每个参数
$- 显示Shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
重定向
command > file将输出重定向到 file
command < file将输入重定向到 file
command << file 将输入重定向到 file 的部分内容
command >> file 将输出以追加的方式重定向到 file
交互
echo # 打印并换行
echo -n “xxx # 打印且不换行
read var # 读取输入,存入变量var
read -n I var # 读取输入的第一个字符,存入变量var