1
2
3
4
5
6
7
8
9
10
11
12
13
#查看shell环境变量的值(使用的什么)
echo $SHELL

#查看当前正在执行的脚本的名称
echo $0

#可以直接输入其他脚本的路径来切换到这个脚本
/bin/sh

#退出
exit


编写shell脚本

脚本文件可以是任何扩展名,但是约定为sh

Shell脚本文件的第一行一般是一个#!,后面加上bin/bash用来表示这个脚本文件使用的是Bash解释器,用其他的解释器也可以替换,比如bin/zsh

1
2
3
4
5
#!/bin/bash

echo "Hello Shell"
date#显示时间
whoami#显示当前用户

编辑完保存一下并执行

1
2
chmod a+x hello.sh#设置权限
./hello.sh#执行

Shell脚本也是支持函数的,Shel脚本中的变量默认是全局的,它的作用域是从定义的地方开始一直到脚本结束,如果想要在函数中定义一个局部变量的话就需要在变量的前面加上一个local关键字

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

# 函数:检查一个数是否为素数
#$1表示函数的第一个参数,也就是要检查的数字
is_prime(){
local num=$1
# 小于2的数不是素数
#lt是小于,中括号两边都需要空格
if[ $num -lt 2 ];then
return 1#返回1,表示不是素数
fi
#检查从2到sqrt(num)的数
#for循环需要两个小括号把三个表达式都括起来
for((i=2;i*i<=num;i++));do
if[$((num%i))-eq 0 ]; then
return 1#返回1,表示不是素数
fi
done
return 0#返回0,表示是素数
}

image-20251101032854734

然后直接执行就行了

1
2
#后面是脚本名称
sh is_prime.sh

简单使用

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

echo "请输入您的姓名:"
read name#读取输入的名字赋给name
echo "您好,$name"

编辑完后可以执行,执行方法有以下两种
bash game.sh
./game.sh#这种方式要添加执行权限
chmod +x game.sh

我们也可以给这个脚本文件传递一些参数,这些参数可以在脚本里使用$加上数字序号的方式来引用($1、$2、$3等)

修改代码

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

echo "请输入您的姓名:"
#read name
name=$1
channel=$2
echo "您好,$name,欢迎来到#channel"

image-20251101171705262

可以把这些信息保存到一些变量中让脚本文件自动读取这些信息,也就是使用环境变量,这些变量是系统预先定义好的,我们也可以自己定义变量,

1
2
3
4
5
6
name=老杨
channel=geekhour
echo $name#查看值,变成了老杨,但这里只是普通变量,不属于环境变量,只在当前shell会话有效,脚本文件直接引用会无法获取值

#转变环境变量,但退出shell再进入就会失效
export name=老杨

shell在启动时会读取一些配置文件,用ls -a可以看到下面这两个文件,.profile是在用户登录的时候执行的并且只执行一次,而.bashrc文件是在每次新打开一个终端或者新建一个Shell会话的时候执行的,这两个都可以。不同Shel的配置文件可能会有一些差异,比如zsh的配置文件是.zshrc文件

image-20251101182536145

通常.bash profile里面会调用.bashrc,所以一般推荐把环境变量放到.bashrc文件中,这样就可以保证每次新打开一个终端的时候都可以获取到这些环境变量了

系统根目录下也会有一些系统级别的配置文件,比如根目录etc文件夹下的profile和bashrc文件等等,这些文件里面存储的环境变量是对所有用户都有效的

1
2
3
4
5
6
7
8
ls /etc/bash
vi .bashrc
#滚轮滑动到文件最后一行
export name=老杨
export channel=GeekHour
#重新加载文件
source .bashrc
. .bashrc#或者这个,或者退出重进

猜数字小游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#shuf生成随机数,-i 1-10是生成范围,-n 1生成的个数
shuf -i 1-10 -n 1

vi game.sh
#!/bin/bash

echo "请输入您的姓名:"
echo "您好,$name,欢迎来到#channel"
#当我们想要把一个命令的输出结果赋值给一个变量的时候,需要使用到命令替换语法,也就是反引号,这样Shell才会把这个命令的输出结果当成整体处理
#在使用命令替换语法尽量使用$(),在可读性和灵活性都会更好
#number=`shuf -i 1-10 -n 1`
number=$(shuf -i 1-10 -n 1)
echo $number
echo "请输入一个1-10之间的数字"
read guess#读取 变量名
#eq是equal相等,lt是小于
if [[ $guess -eq $number ]];then
echo "猜对了"
elif [[ $guess -lt $number ]];then
echo "小了"
else
echo "大了"
fi
:wq

#执行

image-20251101184535473

if语句格式:if后面加上条件语句,这个条件需要使用两个中括号把它括起来,后面再加上一个分号和then,然后在下面加上一些命令,这些命令就会在这个条件成立的时候被执行,最后再加上一个fi来结束这个if语句

上面的脚本只能执行一次,只要猜对了就结束了,如果想一直执行就是循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
vi game.sh
#!/bin/bash

echo "请输入您的姓名:"
echo "您好,$name,欢迎来到#channel"`
number=$(shuf -i 1-10 -n 1)
echo $number
#while [[ $guess -ne $number ]]
while true
#开始
do
echo "请输入一个1-10之间的数字"
read guess#读取 变量名
#eq是equal相等,lt是小于
if [[ $guess -eq $number ]];then
echo "恭喜你猜对了!是否继续?(y/n):"
read choice
if [[ $choice = "y" ]] || [[ $choice = "Y" ]];then
#继续
continue
else
#结束循环
break
fi
elif [[ $guess -lt $number ]];then
echo "小了"
else
echo "大了"
fi
#结束
done
:wq

#执行

随机数的取法还有下面这种

1
2
#通过取模进行1-10的取值,不加1就是0-9的范围
echo $((RANDOM % 10 + 1))