shell 脚本与常用的bash命令

关于shell

Shell 是一个用 C 语言编写的程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序,业界所说的 shell 通常都是指 shell 脚本。

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

shell解释器

// Linux/Unix

  1. bash
  2. sh
  3. zsh (Mac)

// windows

  1. cmd
  2. PowerShell
  3. WSL(windows Subsystem of Linux)

常用的bash 命令

没有什么是help 不能解决的,如果有,就用man

比如man ps:

image-20211118164831864

文件相关

// 文件新建
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 示例:

image-20211118165152825

kill 拓展:

  • Kill命令实际并不是在"kill",本质是向进程发送信号。例如,kill -s SIGUSR1 34534 实际可以调试node.js应用,因为node.js 会在收到SIGUSR1信号时进入调试模式。

  • 优雅退出的原理就是监听SIGTERM信号,并递归的退出子进程。

其他

lsof -i | grep LISTEN // 找到所有正在被监听的端口, | 是管道,会将前面的信息传给后面一个命令,行维度
awk //找到列维度的信息,不展开

bash编程基础

全局变量

a=1
export a

局部变量

local a=1

环境变量

shell 自动就带的变量

path: 指定命令的搜索路径
HOME: 指定用户的工作目录(即用户登录到linux系统中时,默认的目录)
HISTSIZE: 保存历史命令的条数
LOGNAME: 当前用户的登录名
HOSTNAME:主机的名称
SHELL:指当前用户用的是哪种shell
LANG/LANGUGE: 和语言相关的环境变量,使用多种语言的用户可以修改此环境变量
MAIL:指当前用户的邮件存放目录

环境变量的输出示例:

image-20211123172046995

基本类型

# 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
比较符
image-20211123173155943

示例:判断一个路径是文件还是目录

if [ -f './src' ];
then echo 'it is a file';
else echo 'it is a dir';
fi

image-20211123173327253

循环

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
  • 函数中可以使用$n来获取第n个实参
  • shell中每个命令都是用退出码(exitstatus)来告诉shell它完成了处理,退出码是一个0-255之间的整数,在命令结束时由命令传给shell,可以在命令执行完毕时立即使用$?捕获

其他特殊变量:

  • $# 传递到脚本或者函数的参数个数
  • $*以一个单字符串回显所有向脚本传递的参数
  • $$ 脚本运行的当前进程ID
  • $!后台运行的最后一个进程的id
  • @ 与 @ 与 @*相同, 但是使用时加加引号, 并在引号中返回每个参数
  • $- 显示shell 使用的当前选项,与set命令功能相同
  • $? 显示最后命令的退出状态,0表示没有错误,其他值表示有错误

重定向

  • 重定向,全称是I/O重定向,默认情况下,bash程序从终端接收输入,并在终端打印输出
  • 如果想改变输入输出来源,需要使用重定向
command < file # 将输入重定向到file
command > file # 将输出重定向到file

command << file # 将输入重定向到file的部分内容
command >> file # 将输出以追加的方式重定向到file

第四种比较常用,常用于输出log文件

示例:ls > ./ls.log

图片1

echo 和 read

echo 'xxx' # 打印并换行
echo -n 'xxx' # 打印不换行

read var # 读取输入  存入变量var
read -n 1 var #读取输入的第一个字符, 存入变量var
image-20211123180405077

demo

连续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

写法注意:

  • 判断条件[]两边要有空格。
  • 变量定义时等号两边不要空格
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值