Shell 是一个用 C 语言编写的程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序,业界所说的 shell 通常都是指 shell 脚本。
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
shell解释器
// Linux/Unix
- bash
- sh
- zsh (Mac)
// windows
- cmd
- PowerShell
- WSL(windows Subsystem of Linux)
没有什么是help 不能解决的,如果有,就用man
比如man ps:
// 文件新建
touch index.js // 新建文件
mkdir ./components // 新建目录
// 文件删除
rmdir // 删除目录
rm // 删除文件,也可以递归删除目录
rm -r // 递归删除
rm -rf // 递归强制删除,要小心使用
// 文件移动
mv ./xxx ./targetXXX // mv 文件 目标目录
mv -f ./xxx ./targetXXX // 移动并强制覆盖
mv -n ./xxx ./targetXXX // 移动不覆盖
// mv 到同一个目录但是改变文件名的方式,用于文件重命名,shell中没有重命名
// 复制
cp 文件名 目标目录
cp -R 目录 目录// 复制目录(cp ./source/ ./target/)
//查看
cat ./package.json //查看文件
head -n 10 文件名// 查看文件前十行, 一般用于查看日志
tail -n 10 文件名// 查看文件后十行
nano
linux 上最简单的文本编辑器,功能比较初级,对于临时和简单文件的编辑可以使用
vi / vim
linux 上功能强大的编辑器,vim 是vi的加强版。如果能够熟练使用,效率不输于GUI编辑器(vscode等)
ps // 查看当前登录用户的进程
ps -ax // 查看所有进程
//lsof
lsof -i // 查看打开的网络相关的文件
lsof -p 2333 // 查看pid= 2333的进程打开的文件
top // 查看实时的进程状态(能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器, 参考:https://www.cnblogs.com/niuben/p/12017242.html)
kill 98433
kill -9 98433 //强杀进程
lsof -i 示例:
kill 拓展:
Kill命令实际并不是在"kill",本质是向进程发送信号。例如,kill -s SIGUSR1 34534 实际可以调试node.js应用,因为node.js 会在收到SIGUSR1信号时进入调试模式。
优雅退出的原理就是监听SIGTERM信号,并递归的退出子进程。
lsof -i | grep LISTEN // 找到所有正在被监听的端口, | 是管道,会将前面的信息传给后面一个命令,行维度
awk //找到列维度的信息,不展开
a=1
export a
local a=1
shell 自动就带的变量
path: 指定命令的搜索路径
HOME: 指定用户的工作目录(即用户登录到linux系统中时,默认的目录)
HISTSIZE: 保存历史命令的条数
LOGNAME: 当前用户的登录名
HOSTNAME:主机的名称
SHELL:指当前用户用的是哪种shell
LANG/LANGUGE: 和语言相关的环境变量,使用多种语言的用户可以修改此环境变量
MAIL:指当前用户的邮件存放目录
环境变量的输出示例:
# String
a=abcdefg
a='this is a string'
# Number
a=$[ 1+ 1 ]
a=$(( 1 + 1 ))
# Array
a=(this is a string)
a=( 1 2 3 4 5)
a[1] = 0
astring=Lili
anumber=$((1+1))
str="your name is $astring "
echo $str # your name is Lili
seq=( 1 $anumber 2 3 4)
echo $seq # 1 2 3 4
If then
if condition1
then
command1
elif condition2
then
command2
else
command3
fi
case
case $VAR in
condition1)
command1
;;
condition2)
command2
;;
*)
command3
;;
esac
示例:判断一个路径是文件还是目录
if [ -f './src' ];
then echo 'it is a file';
else echo 'it is a dir';
fi
for 循环
for index in 1 2 3 4 5; do
echo 'index='$index
done
for ((i = 0; i<5; i++)); do
echo $i
done
while
while(($i <=10)) do
echo $i
done
function fn()
{
if(-z $1); then # 判断第一个参数是否为空
echo 'no input'
else
echo 'the input is $1'
fi
return 0
}
fn() adc # the input is abc
echo $? # 0
其他特殊变量:
- $# 传递到脚本或者函数的参数个数
- $*以一个单字符串回显所有向脚本传递的参数
- $$ 脚本运行的当前进程ID
- $!后台运行的最后一个进程的id
- @ 与 @ 与 @与*相同, 但是使用时加加引号, 并在引号中返回每个参数
- $- 显示shell 使用的当前选项,与set命令功能相同
- $? 显示最后命令的退出状态,0表示没有错误,其他值表示有错误
command < file # 将输入重定向到file
command > file # 将输出重定向到file
command << file # 将输入重定向到file的部分内容
command >> file # 将输出以追加的方式重定向到file
第四种比较常用,常用于输出log文件
示例:ls > ./ls.log
echo 'xxx' # 打印并换行
echo -n 'xxx' # 打印不换行
read var # 读取输入 存入变量var
read -n 1 var #读取输入的第一个字符, 存入变量var
连续cd: 输入任意目录名,可以cd 进入该目录,并且显示该目录下的所有内容,再次输入目录名,重复以上步骤,直至输入为空,退出程序。
while true
do
echo -n 'input a file name:'
read fileName
if [ -z $fileName ]
then
echo '已退出'
break
fi
if [ -d $fileName ]
then
cd $fileName
ls
else
echo $fileName
echo 'this is a invalid file name.'
fi
done
写法注意: