首页 > 系统相关 >Shell 编程入门指南:从基础到进阶,轻松掌握 Shell 脚本编程技巧--附有测试题目

Shell 编程入门指南:从基础到进阶,轻松掌握 Shell 脚本编程技巧--附有测试题目

时间:2024-04-02 15:59:15浏览次数:25  
标签:bin 文件 Shell -- 编程 echo num done bash

$shell编程

set nu 显示行号

生成随机数RANDOM

快速入门

文件 shell脚本文件第一行特殊格式

 #!/bin/bash
echo 跟输出内容

shell脚本执行方式

 # 方式一
sh 文件.sh
# 方式二
./文件.sh   相对路径
# 方式三
/root/文件.sh   绝对路径

shell的数据类型

字符串:建议使用双引号

整数型:计算时需要使用"$((运算式))"或"$[运算式]"

变量

变量名=变量值 =号两侧不能有空格

用户变量

 username="itcast"
echo $username
# 结果
itcast

 

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

#!/bin/bash 
jdUrl="http://www.jd.com"
readonly jdUrl

删除变量

使用 unset 命令可以删除变量。

 # 语法
unset variable_name

环境变量

可以使用env命令查看所有的系统环境变量

常见环境变量:
PATH 决定了shell将到哪些目录中寻找命令或程序 
HOME 当前用户主目录 
HISTSIZE 历史记录数 
LOGNAME 当前用户的登录名 
HOSTNAME 指主机的名称 
SHELL 当前用户Shell类型 
LANGUGE  语言相关的环境变量,多语言可以修改此环境变量 
MAIL 当前用户的邮件存放目录 
PS1 基本提示符,对于root用户是#,对于普通用户是$

自定义环境变量

1.vi /etc/profile ,在文件末尾加上要定义的环境变量
2.export 变量名=变量值
3.wq 退出
4.source /etc/profile
5.输入 env 查看环境变量,是否有自己定义的环境变量。
6.使用环境变量.环境变量的使用方式和普通变量是一样的:$环境变量名.

 

特殊变量
变量解释
$#命令行参数的个数
$n$1表示第一个参数,$2表示第二个参数,以此类推
$0当前程序的名称
$?前一个命令或许或函数的返回码
$*以“参数1 参数2 。。。”形式保存所有参数
$@以“参数1”“参数2”。。。形式保存所有参数
$$本程序的(进程ID号)PID
$!上一个命令的PID
字符串
#单引号
name='钱学森'
str='我很崇拜$name'
echo $str
#结果 我很崇拜$name
#双引号
name="钱学森"
str="我很崇拜$name"
echo $str
#结果 我很崇拜 钱学森

双引号的优点:

1) 双引号里可以有变量

2) 双引号里可以出现转义字符

 

拼接字符串
#1.双引号拼接
#!/bin/bash
yourname="吴恩达"
wenhou_1="你好,$yourname ."
wenhou_2="你好,"$yourname" ."
wenhou_3="你好,\"$yourname\" ."
echo $wenhou_1 $wenhou_2 $wenhou_3
#你好,吴恩达 . 你好,吴恩达 . 你好,"吴恩达" .
#2.单引号拼接
#!/bin/bash
yourname="钱学森"
wenhou_4='你好,$yourname.'
wenhou_5='你好,'$yourname.''
wenhou_6='你好,"$yourname" .'
echo $wenhou_3 $wenhou_4 $wenhou_5
#你好,$yourname. 你好,钱学森. 你好,"$yourname" .
获取字符串长度

格式:${#变量名}

#!/bin/bash
string="jobs"
echo ${string}    # 输出结果: jobs
echo ${#string}   # 输出结果: 4
提取子字符串

格式:${变量名:起始下标值:截取字符串数量}

#!/bin/bash
str="敢于亮剑决不后退"
echo ${str:2:2}    # 输出结果为: 亮剑
查找子字符串位置

格式:`expr index "$变量名" 查找字符`

#!/bin/bash
string="i am a boy"
echo `expr index "$string" am`    # 输出是: 3
算数运算符

val=`expr 2 + 2`

val=$[a+b]

#!/bin/bash 
a=4 
b=20
#加法运算 
each expr $a + $b 
#减法运算 
echo expr $a - $b 
#乘法运算,注意*号前面需要反斜杠 
echo expr $a \* $b 
#除法运算 
echo $a / $b 
#此外,还可以通过$(())、$[]进行算术运算。 
echo "a = $a" 
c=$((a+b)) 
d=$[a+b] 
echo "c = $c" 
echo "d = $d"
语句判断
数字
运算符说明
-eq检测两个数是否相等,相等返回 true。
-ne检测两个数是否不相等,不相等返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。
-lt检测左边的数是否小于右边的,如果是,则返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。
字符串
判断符说明
-n STRING字符串长度不为零
-z STRING字符串长度为0
=判断两个字符串是否一样
!=判断两个字符串是否不一样
文件
判断符说明
-f存在且是普通文件
-d存在且是目录
-h存在且是符号链接
-e文件存在
–r文件存在并且可读
–w文件存在并且可写
–x文件存在并且可执行
if语句
if
# 语法
if condition
then
    command1 
    command2
    ...
    commandN 
fi
if else
# 语法
if condition
then
    command1
    command2
    ...
    commandN
else
    command
fi
# 案例
#!/bin/bash
read -p "Enter your score(0-100):" n #-p参数表示给出提示信息
if [ $n -ge 85 ] && [ $n -le 100 ] ; then
 echo "优"
elif [ $n -ge 70 ] && [ $n -le 84 ] ; then
 echo "良"
elif [ $n -ge 60 ] && [ $n -le 69 ] ; then
 echo "中"
else
 echo "差" 
fi
for循环
字符串型循环
# for循环一般格式为:
for 变量 in 值1 值2 值3…
do
程序
done
# 顺序输出当前列表中的数字:
#!/bin/bash
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done
# 顺序输出字符串中的字符
#!/bin/bash
for str in 'This is a string'
do
    echo $str
done
# 打印/root目录下所有文件的名字 
#!/bin/bash  
for file in $(ls /root)
do 
        echo $file  
done
# 求1-100的和
sum=0
for ((i=1 ;i<=100 ;i++))
do sum=$[sum +i]
done
echo $sum
​
数字性循环
# 该格式的语法如下:
for ((初始值;循环控制条件;变量变化))
do
程序
done
# 案例
#!/bin/bash
for ((i = 0; i <= 5; i++)) 
do
    echo "welcome $i times"
done
while循环
# 语法
while 条件
do
    程序
done
# 案例,求1-100的和
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
  let sum=sum+$i
  let i++
done
echo $sum
无限循环
# 无限循环语法格式:
while :
do
    command
done
# 或者
while true
do
    command
done
# 或者
for (( ; ; ))
case 语句
# 格式
case 变量名 in
    模式1) 输出内容
    ;;
    模式2) 输出内容
    ;;
    模式3) 输出内容
    ;;
esac
# 案例
read -p "请输入1-4数字:" num
# echo $num
case $num in
1) echo "你选择了1"
;;
2) echo "你选择了2"
;;
3) echo "你选择了3"
;;
4) echo "你选择了4"
;;
*) echo "输入并不正确"
;;
esac  
跳出循环
break
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    
    read aNum
​
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done
continue
#!/bin/bash
​
while :
​
do
​
    echo -n "输入 1 到 5 之间的数字: "
​
    read aNum
​
    case $aNum in
​
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done
函数
语法
# 格式
函数名(){
    表达式
}
函数名
# 案例
test(){
    echo "这是一个函数"
}
echo "---函数开始执行---"
test
echo "---函数执行完毕---"
​
函数参数
#!/bin/bash
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
​
funWithParam 1 2 3 4 5 6 7 8 9 34 73
群组
定义群组

array_name=(value1 ... valuen)

#!/bin/bash
​
my_array=(A B "C" D)
​
#我们也可以使用下标来定义数组:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
读取数组

读取数组元素值的一般格式是:${array_name[index]}

test_num=("a" "b" "c" "d" "e")
echo "提取第一个元素 ${test_num[0]}"
echo "提取第四个元素 ${test_num[4]}" 
# 提取全部元素
echo "提取全部元素 ${test_num[*]}"
获取数组的长度
echo "数组元素个数为:${#test_num[*]}
echo "数组元素个数为:${#test_num[@]}
遍历数组
# 方式一
test_num=(aa bb cc dd)
for num in ${test_num[*]}
do echo $num
done
# 方式二
test_num_2=(aa bb cc dd ee)
test_num_2_num=${#test_num_2[*]}
for ((i=0 ; i<test_num_2_num ;i++));
do
 echo "----------"
 echo ${test_num_2[$i]}
done
​
加载其他文件的变量
# 第一步 创建 vim test1.sh 文件
#!/bin/bash
my_arr=(aa bb cc)
# 第二步 创建 vim test2.sh 文件
#!/bin/bash
source ./test1.sh
for var in ${my_arr[*]}
do
echo $var
done
​
​
1. 测试题目一:计算器程序

编写一个 Shell 脚本,实现一个简单的四则运算计算器程序,要求用户输入两个数字和一个运算符(加法、减法、乘法、除法),然后输出计算结果。

#!/bin/bash

# 提示用户输入两个数字和运算符
echo "请输入第一个数字:"
read num1

echo "请输入第二个数字:"
read num2

echo "请选择运算符(+、-、*、/):"
read operator

# 根据用户输入的运算符进行计算
case $operator in
    +)
        result=$((num1 + num2))
        ;;
    -)
        result=$((num1 - num2))
        ;;
    *)
        echo "无效的运算符。"
        exit 1
        ;;
esac

# 输出计算结果
echo "计算结果:$num1 $operator $num2 = $result"
 

2. 测试题目二:文件信息查看器

编写一个 Shell 脚本,实现一个文件信息查看器,用户输入一个文件名(包括路径),脚本能够判断该文件是文件还是目录,以及该文件的大小和权限信息,并输出这些信息给用户。

#!/bin/bash

# 提示用户输入文件名(包括路径)
echo "请输入要查看的文件名(包括路径):"
read filename

# 检查文件是否存在
if [ ! -e "$filename" ]; then
    echo "文件不存在!"
    exit 1
fi

# 判断文件类型
if [ -f "$filename" ]; then
    filetype="文件"
elif [ -d "$filename" ]; then
    filetype="目录"
else
    filetype="未知"
fi

# 获取文件大小
filesize=$(du -h "$filename" | cut -f1)

# 获取文件权限信息
filepermissions=$(ls -l "$filename" | cut -d ' ' -f 1)

# 输出文件信息
echo "文件类型: $filetype"
echo "文件大小: $filesize"
echo "权限信息: $filepermissions"
 

3.测试题目:文件重命名脚本

编写一个 Shell 脚本,实现将指定目录下的所有.txt文件批量重命名为.txt.bak的功能。

 

#!/bin/bash

# 指定目录
directory="/your/directory/path"

# 将指定目录下的所有.txt文件重命名为.txt.bak
for file in $directory/*.txt; do
    mv "$file" "${file%.txt}.txt.bak"
done
 

4.测试题目:文件搜索脚本

编写一个 Shell 脚本,实现在指定目录及其子目录中搜索包含指定关键字的文件,并输出这些文件的路径。

#!/bin/bash

# 指定搜索的目录
search_dir="/your/directory/path"

# 指定搜索的关键字
keyword="your_keyword"

# 在指定目录及其子目录中搜索包含关键字的文件
grep -r -l "$keyword" "$search_dir"
 

 

 

标签:bin,文件,Shell,--,编程,echo,num,done,bash
From: https://blog.csdn.net/hulknnn/article/details/137143334

相关文章

  • SQL语句中 DDL 、DML 、DQL 、DCL学习、看板
    DDL语句(数据定义语言)DDL(DataDefinitionLanguage)语句:数据定义语言,主要是进行定义/改变表的结构,数据类型,表之间的连接操作.常用的语句关键字有CREATE,DROP,ALTER等.CREATETABLE表名(列名1数据类型,列名2数据类型,列名3数据类型,...)​ALTERTABLE表名;......
  • 用C语言输出100到200以内的所有素数 (只能被本身或则1整除的数)
    代码如下#include<stdio.h>intmain(){//输出100到200以内的所有素数(只能被本身或则1整除的数)   inti=0,j=0;   printf("100到200以内的所有素数为:");   for(i=100;i<=200;i++)   {         for(j=2;j<i;j++)  ......
  • 多线程的案例
    目录1.单例模式1.1饿汉模式1.2懒汉模式-单线程版1.3懒汉模式-多线程版1.3懒汉模式-多线程版(改进)2.阻塞队列2.1阻塞队列是什么2.2生产者消费模型2.3标准库中的阻塞队列2.4阻塞队列实现3.定时器3.1定时器是什么3.2标准库中的定时器3.3实现定时器4.线程池4.1线......
  • 2024 CleanMyMac X 4.15.2的功能介绍及如何使用
    CleanMyMacX4.15.2:释放Mac空间的强大工具随着我们使用Mac进行工作、学习和娱乐,我们的硬盘空间可能会逐渐被各种文件、应用程序和缓存数据填满。为了保持Mac的性能和效率,定期清理和优化硬盘空间变得至关重要。而CleanMyMacX4.15.2正是一款强大的Mac清理工具,它可以帮助我们......
  • Python解压序列
    一.普遍情况:x,y,z=1,2,3print("x:",x)#x:1print("y:",y)#y:2print("z:",z)#z:3二.针对元祖:name=("qiaobushi","wanglihong","leibushi")x,y,z=nameprint(name)print("x:",x)print(......
  • 展锐平台sensorhub架构(SC9863A)
    安卓架构图: Sensorhub架构 SensorHub 是Sensor 软件运行环境,分为Sensor manager:管理sensordriver 采样和上报数据给AP, 接收AP 下发的命令;AP: 应用程序执行环境,HAL:sensorhal 层接口实现,SensorHubDriver: 接收HAL 层的命令并发给sensorhub,反馈sensorhub ......
  • Odoo中的Map
    在Odoo源代码中,常常可以看到使用ORM的map。Model.mapped(func)Parameters参数:func (callable or str)–afunctionoradot-separatedsequenceoffieldnamesReturns返回:selfiffuncisfalsy,resultoffuncappliedtoall self records.Returntype返回类型:lis......
  • go在处理批量下载时候出现fatal error: runtime: out of memory
    状况,测试环境8g内存程序运行之后还剩1g多空闲内存测试环境下载二十集MP4文件就会抛出oom 同时检测不到任何panic貌似是被liunx直接给干掉了本地环境16g内存同样的请求能够正常请求并且返回。postman也因为运行内存不够而闪退。使用powershell执行请求能正常返回二进制......
  • Python单双引号转义符输出
    一、单引号输出#单引号print('Hello,world')结果:Hello,world二、双引号输出#双引号print("Hello,world")结果:Hello,world三、单双混搭#单双混搭print("'Hello,world'")print('"Hello,world"')结果:'Hello,world'......
  • 任务通知
    FreeRTOS从V8.2.0版本开始提供任务通知这个功能,每个任务都有一个32位的通知值,在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组,也可以替代长度为1的队列(可以保存一个32位整数或指针值)。简单版和复杂版使用的函数不一样,简单版可以替代一个二值信号量,复杂......