【Shell 编程秘籍:脚本编写、变量操作与实战游戏详解】

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

一、第一个shell脚本

  1. 新建一个文件,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好。
  2. 使用vi编辑器或navo,文件第一行一般是#!/bin/bash(#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。)
  3. chmod a+x hello.sh更改用户权限,使脚本具有执行权限
  4. ./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. 关系运算符

在这里插入图片描述

  1. 布尔运算符
    在这里插入图片描述

  2. 逻辑运算符
    在这里插入图片描述

  3. 文件测试运算符
    文件测试运算符用于检测 Unix/Linux 文件的各种属性。
    在这里插入图片描述

  4. 自增和自减操作符

  5. 使用 let 命令 let num++ # 自增 let num-- # 自减

  6. 使用 $(( )) 进行算术运算 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值