Shell

Shell 介绍

什么是 Shell

  1. 一种脚本语言、命令行解释器:可以将一组命令行打包为一个文件,调用操作系统的内核去执行这些命令
  2. shell 中也支持条件判断、分支、定义函数、变量等功能
  3. shell 脚本的扩展名一般以.sh 结尾,但没有强制要求

Shell 的应用

Shell 可以做什么呢?

  1. 可以针对批量操作文件提取转换数据、生成报告
  2. 针对项目环境进行初始化
  3. 执行定时任务,巡检系统运行状态

Shell 解释器的分类

通常包括

  • csh
  • ksh
  • bash
  • zsh

Shell 查看

  • 通过cat /etc/shells可以查看系统有哪些 shell 可以用
  • 通过echo $SHELL可以查看当前使用的 shell
  • 通过 /bin/[SHELL名称] 可以切换 shell

Shell 变量

创建一个 test.sh,并使用 VSCode 打开这个文件

第一行需要声明一下这个文件 使用的是哪个解释器

#!/bin/bash

整数、字符串、数组变量

变量的定义和输出

整数

字符串

数组

命令行结果转为变量

打印 ls 命令返回的结果

1
2
3
4
#!/bin/bash

file=$(ls -l)
echo ${file[@]}

环境变量

获取外部定义的环境变量

变量的赋值

  • :-
  • :=
1
2
3
4
5
6
#!/bin/bash

echo ${VAR1:-"hello VAR1"}
echo ${VAR2:="hello VAR2"}
echo $VAR1
echo $VAR2

内置特殊变量

特殊的一些参数

  • $0 代表当前脚本名称
  • $1 $2 $3 代表脚本的参数
  • $# 代表脚本的参数个数

控制流

if

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

a=10
b=20

if [ $a -gt $b ]; then
echo "$a is greater than $b"
else
echo "$b is greater than $a"
fi

for

1
2
3
4
5
6
#!/bin/bash

for num in 1 2 3 4 5; do
echo "this number is : $num"
done

循环遍历 ls 的结果

1
2
3
4
5
6
#!/bin/bash

for item in $(ls); do
echo "this file name is : $item"
done

while

每隔一秒打印一个 hello

1
2
3
4
5
6
#!/bin/bash

while (true); do
echo "hello"
sleep 1
done

输出 小于 10 的所有正整数

1
2
3
4
5
6
7
8
9
#!/bin/bash

num=1

while (($num<10)); do
echo $num
let "num++"
done

switch case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

echo "输入1-4之间的数字:"
echo "您输入的数字为:"
read aNum

case $aNum in
1) echo "你选择了 1";;
2) echo "你选择了 2";;
3) echo "你选择了 3";;
4) echo "你选择了 4";;
*) echo "你没有输入 1 到 4 之间的数字";;
esac


Shell 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

function test() {
if [ $1 -le $2 ]; then
echo "$1 is less than or equal to $2"
else
echo "$1 is greater than $2"
fi
}

test 1 2
test 3 1

重定向

在 linux 中 每个进程都有三个打开的默认描述符

0 表示标准输入

1 表示标准输出

2 表示标准错误输出

  • 将一个 sh 结果输出到文件中

  • 以追加的方式输出到文件中

在 test.sh 中写入

1
2
3
4
5
#!/bin/bash

echo "is a shell"


然后命令行执行

1
2
3
4
5
6
7
8
9
10
➜  Desktop bash test.sh > file.txt
➜ Desktop cat file.txt
is a shell
➜ Desktop bash test.sh >> file.txt
➜ Desktop bash test.sh >> file.txt
➜ Desktop cat file.txt
is a shell
is a shell
is a shell
➜ Desktop

写一个异常

1
2
3
4
5
6
#!/bin/bash

echo "is a shell"
a=1
b=0
((a/b))

然后输出结果

1
2
3
4
5
6
7
8
9
➜  Desktop bash test.sh
is a shell
test.sh: line 6: ((: a/b: division by 0 (error token is "b")
➜ Desktop bash test.sh 2>> error.log
is a shell
➜ Desktop cat error.log
test.sh: line 6: ((: a/b: division by 0 (error token is "b")
➜ Desktop

把错误的信息输出到标准输出里面

1
2
3
4
5
6
➜  Desktop bash test.sh > file.txt 2>&1
➜ Desktop cat file.txt
is a shell
test.sh: line 6: ((: a/b: division by 0 (error token is "b")
➜ Desktop

更新: 2024-08-08 22:02:20
原文: https://www.yuque.com/zacharyblock/cx2om6/kxmxwdhvlqkut570