# 一、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
更新于 : 8/7/2024, 2:16:31 PM