# 一、Shell 认知
# 1、解析器
shell 是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核
cat /etc/shells
# /bin/sh
# /bin/bash
# /usr/bin/sh
# /usr/bin/bash
# /bin/tcsh
# /bin/csh
# 2、脚本使用
- 指定解析器
#!/bin/bash
cd /home/
touch banzhang.txt
echo "I LOVE YOU" >> banzhang.txt
- 执行脚本
# 添加执行权限
chmod +x *.sh
# 执行脚本
sh ruoyi.sh
bash ruoyi.sh
# 二、Shell 基础
# 1、$ 变量
- 系统变量
# 举例
echo $HOME
# /root (root用户的home目录)
# /home/lencamo (lencamo用户的home目录)
# 其他
$PWD
$USER
$SHELL
- 自定义变量
# 定义
A=1 # 注意:等号两边不能有空格
echo $A # 1
# 取消
unset A
# 只读变量(不能取消)
readonly B="Hello Work!"
echo $B # Hello Work!
- 全局变量
# 例如: /etc/profile 下设置的全局变量
export JAVA_HOME=/data/local_service/java/jdk1.8.0_351
export MAVEN_HOME=/data/local_service/apache-maven-3.8.6
# 任何脚本可用
echo $JAVA_HOME
echo $MAVEN_HOME
# 3、$ 数字
前面我们可以使用$
来定义变量,当$
后面跟数字时其含有又有所不同。
- 数字
# 编写
vim ruoyi.sh
echo $0 # 脚本名称
echo "$1 $2" # 执行脚本时附带的参数
echo "${10} ${11}"
# 使用
sh ruoyi.sh # 结果:ruoyi.sh 0
sh ruoyi.sh arg1 # 结果:ruoyi.sh 1 arg1
# 4、$ 特殊符号
- 特殊符号
# 编写
vim ruoyi.sh
echo $# # 执行脚本时附带的参数的个数
echo $* # 表示所有的参数(整体)
echo $@ # 表示所有的参数(分开)
# 使用
sh ruoyi.sh arg1 arg2 arg3
# 结果
3
arg1 arg2 arg3
arg1 arg2 arg3
$?
上一条命令是否执行成功
vim ruoyi.sh
# 内容
mkdir ./a/b/c
echo $? # 表示上条命令是否成功 0 表示成功 其他表示失败
# 使用
sh ruoyi.sh
# 结果
mkdir: 无法创建目录"./a/b/c": 没有那个文件或目录
1
# 5、$[] 运算
提示
不同于定义变量,使用 expr 时,后面的运算符两边 👀 必须要有空格
加
+
、减-
、乘\*
、除/
、取余%
- 使用示例
# 基础使用
expr `expr 2 + 3` \* 4
# 高级使用
$[(2+3)*4]
$(((2+3)*4))
# 6、输入输出
# -t 7 表示输入的时间限制,-p "xxx" 表示要用户输入的内容提示
read -t 7 -p "input you name " NAME
echo $NAME
# 7、内容写入
- 单行内容
echo "写入一行内容" >demo.txt
- 批量写入
使用 cat 命令 ✔
# 编写
touch $1.vue
cat >$1.vue <<EOF
<template>
<div class="$1">
<h2>$1</h2>
</div>
</template>
<script setup lang="ts">
//
</script>
<style lang="scss" scoped>
.$1 {
//
}
</style>
EOF
# 使用
sh ting.sh demo
使用 echo 命令
# 编写
content="<template>
<div class="$1">
<h2>$1</h2>
</div>
</template>
<script setup lang="ts">
//
</script>
<style lang="scss" scoped>
.$1 {
//
}
</style>"
touch $1.vue
echo -e "$content" >$1.vue
# 使用
sh ting.sh demo
# 三、流程控制
提示
在真实的开发中,我们可以利用 shellman (opens new window)(语法提示) 和 shell-format (opens new window) 这两个插件进行快速开发
# 1、判断符号
# 逻辑类
-lt # 小于(less then)
-gt # 大于(greater then)
-eq # 等于(equal)
-le # 小于等于(less equal)
-ge # 大于等于(greater equal)
-ne # 不等于(not equal)
# 权限类
-x # 可执行(execute)
-r # 可读(read)
-w # 可写(write)
# 文件类
-f # 是否为文件file
-d # 是否为文件夹directory
-e # 文件是否存在existence
# 判断类
&& # 类比if else
|| # 类比默认值
# 2、[ condition ]
提示
如果我们打印[ condition ]
的话,只要 condition 非空即为 true。
并且,condition 两边必须有空格(注意对比$[operation]
)
# 用shell判断 2 < 6
[ 2 -lt 6 ]
echo $?
# 用shell判断Dockerfile文件是否存在
[ -e /home/Ruoyi-Vue/Dockerfile ]
echo $?
# 多条件判断
[ -w /home/demo.txt ] && echo OK
echo $?
# 其他
# ……
# 3、if / case 语句
# base
#!/usr/bin/env bash
# if
if [ $1 -gt 1 ]; then
echo "大于1"
elif [ $1 -lt 1 ]; then
echo "小于1"
else
echo "等于1"
fi
# case
case "${item}" in
1)
echo "item = 1"
;;
2 | 3)
echo "item = 2 or item = 3"
;;
*)
echo "default (none of above)"
;;
esac
# 4、for / while 语句
# for i
s=0
for((i=0;i<100;i++)); do
s=$[$s+$i] # s 表示变量;$s 表示变量的值
# echo "${i}"
done
echo $s # 5050
# for ij
for((i=0;i<n;i++)); do
for((j=0;j<m;j++)); do
echo "${i}, ${j}"
done
done
# for in
# for item in {"Hello World!",a,bc,1372}; do
for item in "$@"; do
echo "${item}"
done
# while
s=0
i=1
while [ $i -le 100 ]; do
s=$[$s+$i]
i=$[$i+1]
done
echo $s # 5050
# 四、其他
# 1、函数
- 内置函数
# 1、文件名称
basename /a/b/c/d/demo.txt
# 结果: demo.txt
basename /a/b/c/d/demo.txt .txt
# 结果: demo
# 2、文件路径
dirname /a/b/c/d/demo.txt
# 结果: /a/b/c/d
- 自定义函数
function sum() {
s=0
s=$(($1 + $2)) # 函数参数
echo $s
}
read -p "input your paratemer1: " P1
read -p "input your paratemer2: " P2
sum $P1 $P2
# 2、cut 工具
在文件中剪切数据用,从文件中的每一行剪切字节、字符和字段并将这些字节、字符和字段输出
# -d : 表示设置:为切隔符切割成多列 -f 2,3 表选择切割后的第几列
cut -d : -f 2,3
# 获取ip
ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1
# 3、sed 工具
对文件进行过滤,不会改变原文件
# 新增(a)
sed "2a -----" demo.txt # 表示在第二行下面新建一行并添加内容-----
# 删除(d)
sed "/xxx/d" demo.txt # 表示删除xxx
# 替换(s)
sed "s/我/它/g" demo.txt # 表示全局范围内查找并替换
- 多条件
sed -e "/xxx/d" -e "s/我/它/g" demo.txt
# 4、awk 工具
强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
awk [选项参数] 'pattern1{action1}' filename
# 示例
# 搜索出demo.txt中以 root开头的行,并打印它们的 第1,7列
# -F : 表示指定为切隔符;$7表第七行
awk -F : '/^root/ {print $1 "," $7}' demo.txt
# 5、sort 工具
对文件进行排序
# -t : 表示使用:作为切割符
# -nr:-n表示按照数值大小排序,-r表示倒叙排列
# -k 2:表示按照第二列进行排序
sort -t : -nrk 2 demo.txt