Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
一、第一个shell脚本
- 新建一个文件,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好。
- 使用vi编辑器或navo,文件第一行一般是
#!/bin/bash
(#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。) chmod a+x hello.sh
更改用户权限,使脚本具有执行权限./test.sh
(需要进行第三步) 或bash test.sh
#执行脚本
- 示例:
#!/bin/bash
# 函数:检查一个数是否为素数
is_prime(){
local num=$1 #shell中默认变量都为全局变量,局部变量前要加loacal
# 小于2的数不是素数
if [ $num -lt 2 ]; then #[]左右要有空格
return 1 # 返回1,表示不是素数
fi #结束 if 条件语句块
#检查从2到sqrt(num)的数
for ((i=2;i*i<=num;i++)); do
if [ $((num % i)) -eq 0 ]; then
return 1 #返回1,表示不是素数
fi
done #结束 for 条件语句块
return 0 #返回0,表示是素数
}
#主程序开始
read -p "请输入一个正整数:" number
if is_prime $number; then
echo "$number 是素数。"
else
echo "$number 不是素数。"
fi
二、变量
1. Shell 变量
1.1 命名规则
- 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
- 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
- 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
- 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
- 避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
- 避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。
1.2 只读变量 readonly
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
2. 变量使用
2.1 Read
#!/bin/bash
echo "请输入您的姓名:"
read name
echo "您好,$name"
2.2 传递参数
#!/bin/bash
echo "请输入您的姓名:"
$name=$1
$channel=$2
echo "您好,$name,欢迎来到$channel"
2.3 命令行自定义变量
name=li
(普通变量,非环境变量,仅在当前shell会话中有效,在脚本文件中无效)export name=li
(转变为环境变量,脚本文件中可获取,但仅在当前Shell对话中有效,退出会失效)- 在
.bashrc
或/etc/bash
中放置环境变量,修改后用..bashrc
重新加载,exit
退出后重进(环境变量永久有效)
3. 删除变量 unset
unset variable_name
4. 特殊变量
$#
传递给脚本或函数的位置参数的个数
$?
上一命令的退出状态码。0表示没有错误,非0值表示有错误
$*
传递给脚本或函数的位置参数,双引号包围时作为一个整体
$@
传递给脚本或函数的位置参数
$$
当前 Shell 进程的进程 ID (PID)
$!
最后一个后台命令的进程 ID
$0
当前 Shell 进程的进程 ID
$1-n
脚本或函数的位置参数
三、Shell字符串
1. 单引号
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
2. 双引号
- 双引号里可以有变量
- 双引号里可以出现转义字符
3. 拼接字符串
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
4. 获取字符串长度
string="abcd"
echo ${#string} # 输出 4
5. 查找字符串
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
6. 参数传递
#!/bin/bash
$ chmod +x test.sh
$ ./test.sh 1 2 3
echo "第一个参数为:$1"; # 第一个参数为:1
echo "参数个数为:$#"; # 参数个数为:3
echo "传递的参数作为一个字符串显示:$*"; # 传递的参数作为一个字符串显示:1 2 3
四、 Shell运算符
1. 关系运算符
-
布尔运算符
-
逻辑运算符
-
文件测试运算符
文件测试运算符用于检测 Unix/Linux 文件的各种属性。
-
自增和自减操作符
-
使用 let 命令
let num++
# 自增let num--
# 自减 -
使用
$(( ))
进行算术运算num=$((num + 1))
# 自增num=$((num - 1))
# 自减
五、 流程控制
1. if
if [ 条件判断式1 ] #或者if [ 条件判断式 ]; then
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
…省略更多条件…
else
当所有条件都不成立时,最后执行此程序
fi
2. for
for 变量 in 值1 值2 …(可以是一个文件等) #或者for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
3. While
while [ 条件判断式 ]
do
程序
done
4. 函数
function 函数名 () {
程序
}
四、猜数字游戏
#! /bin/bash
echo "请输入您的姓名:"
echo "您好,$name,欢迎来到$channel!"
number=$(shuf -i 1-10 -n 1) #命令替换语法 ``或者¥()将语句括起来表示将命令的输出结果当做整体表示
echo $number
while true #对应done结束
do #while开始
echo "请输入一个1-10之间的数字"
read guess
if [[ $guess -eq $number ]]; then
echo "恭喜你,猜对了!请选择是否继续(y/n):"
read choice
if [[ $choice = "y" ]] || [[ $choice = "Y" ]]; then #||代表和
number=$(shuf -i 1-10 -n 1) #或者number=$RANDOM$((RANDOM % 10 +1))
echo $number
continue
else
break
fi
elif [[ $guess -le $number ]]; then
echo "猜小了"
else
echo "猜大了"
fi
done
$ echo $RANDOM
使用RANDOM系统变量,生成一个0-32767之间的随机值
$ echo $RANDOM$((RANDOM % 10 +1))
#生成一个1-10之间的随机值
创作不易,亲亲求点赞求收藏呀ヾ(=・ω・=)o