最全Linux环境开发——shell编程

本文介绍了Linux下的Shell编程,包括什么是Shell、Shell的基本概念如Bash,以及如何编写和执行Shell脚本。还详细讲解了Shell的基础知识,如文件命名规范、变量定义和操作、字符串、数组、注释、参数传递、运算符和流程控制结构,为初学者提供了全面的入门指导。
摘要由CSDN通过智能技术生成

Linux下shell编程

————————————————————————————————
现开通针对在校生嵌入式学习咨询服务,学习路线可见下文:
拉依达的嵌入式学习和秋招经验-CSDN博客
咨询详情请加vx:songwei4615,加vx请备注CSDN咨询

————————————————————————————————

一、什么是shell

shell是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁Shell 既是一种命令语言,又是一种程序设计语言

shell 本质上是 linux 命令,一条一条命令组合在一起,实现某一个目的,就变成了shell脚本。它从一定程度上 减轻了工作量,提高了工作效率。简单来说Shell就是一个用户跟操作系统之间的一个命令解释器

在这里插入图片描述

  • 最常用的shell是Bash,也就是Bourne Again Shell。Bash由于易用和免费,在日常工作中被广泛使用,也是大多数Linux操作系统默认的Shell环境。

二、shell 基础

shell 编写规范

#!/bin/bash				[指定告知系统当前这个脚本要使用的shell解释器]
Shell相关指令

文件命名规范:

文件名.sh .sh是linux下bash shell 的默认后缀

shell 的执行

hello.sh 文件

#! /bin/bash
echo hello world
  1. 输入脚本的绝对路径或相对路径
    执行的必须是一个可执行文件

    songwei@songwei-virtual-machine:~/shell_test$ ./hello.sh 
    hello world
    
  2. bash或sh +脚本
    当脚本没有x权限时,root和文件所有者通过该方式可以正常执行

    songwei@songwei-virtual-machine:~/shell_test$ sh hello.sh 
    hello world
    songwei@songwei-virtual-machine:~/shell_test$ bash hello.sh 
    hello world
    
  3. source
    第一种和第二种会新开一个bash,不同bash中的变量无法共享。
    第三种 是在同一个shell里面执行的

    songwei@songwei-virtual-machine:~/shell_test$ source hello.sh 
    hello world
    

Bash 常用快捷键

在这里插入图片描述

输出输入重定向

输入重定向:是指不使用系统提供的标准输入端口,而进行重新的指定。换言之,输入重定向就是不使用标准输入端口输入文件,而是使用指定的文件作为标准输入设备。(重定向简单理解就是使用 “<”符来修改标准输入设备)
在这里插入图片描述
输出重定向:(通俗的讲,重定向输出就是把要输出的文件信息写入到一个文件中去,而不是将要输出的文件信息输出到控制台(显示屏),在linux中,默认的标准输出设备是控制台(或称为显示器),用户输出的信息默认情况下都会显示到控制台

在这里插入图片描述

三、shell变量

定义变量规则:

  1. 定义变量时,变量名不加美元符号
  2. 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  3. 中间不能有空格,可以使用下划线(_)。
  4. 不能使用标点符号。
  5. 不能使用bash里的关键字(可用help命令查看保留关键字)
# 定义变量
songwei@songwei-virtual-machine:~/shell_test$ name=songwei
# 调用变量
songwei@songwei-virtual-machine:~/shell_test$ echo $name
songwei
songwei@songwei-virtual-machine:~/shell_test$ echo ${name}
songwei
# 删除变量
songwei@songwei-virtual-machine:~/shell_test$ unset name
songwei@songwei-virtual-machine:~/shell_test$ echo ${name}


四、shell入门

shell字符串

  • 单引号
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单独一个的单引号,但可成对出现,作为字符串拼接使用。
  • 双引号
    • 双引号里可以有变量
    • 双引号里可以出现转义字符

测试hello.sh

#! /bin/bash
name=songwei4615
str1="test1"
str2='test2'
echo "name=$name"
# 双引号
echo "hello1 ,$name !"
echo "hello2 ,${name} !"
# 单引号
echo 'hello3 ,$name !'
echo 'hello4 ,${name} !'
# 字符串长度
echo ${#name}

测试结果

songwei@songwei-virtual-machine:~/shell_test$ ./hello.sh 
name=songwei4615
hello1 ,songwei4615 !
hello2 ,songwei4615 !
hello3 ,$name !
hello4 ,${name} !
11

shell 数组

  • bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
  • 数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
    测试vector.sh
#! /bin/bash
nums=("Aa" "Bb" "Cc" "Dd")

echo "nums[0] = ${nums[0]}"
echo "nums[1] = ${nums[1]}"
echo "nums[2] = ${nums[2]}"
echo "nums[3] = ${nums[3]}"

echo "nums all date ${nums[@]}"

echo "nums lenght = ${#nums[@]}"
echo "nums lenght = ${#nums[*]}"

测试结果

songwei@songwei-virtual-machine:~/shell_test$ ./vecter.sh 
nums[0] = Aa
nums[1] = Bb
nums[2] = Cc
nums[3] = Dd
nums all date Aa Bb Cc Dd
nums lenght = 4
nums lenght = 4

shell 注释

  • 以 # 开头的行就是注释,会被解释器忽略。
  • 多行注释,:<<EOF
#--------------------------------------------
# 这是一个注释
# author:
# site:
#--------------------------------------------

# 特殊的多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF

shell 参数传递

  • 执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字
    在这里插入图片描述

测试arg.sh

#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "传递的参数个数为:$#";
echo "显示所以参数为:$*";
echo "显示最后命令的退出状态为:$?";

测试结果

songwei@songwei-virtual-machine:~/shell_test$ ./arg.sh Aa Bb Cc 
Shell 传递参数实例!
执行的文件名:./arg.sh
第一个参数为:Aa
第二个参数为:Bb
第三个参数为:Cc
传递的参数个数为:3
显示所以参数为:Aa Bb Cc
显示最后命令的退出状态为:0

shell 运算符

测试comple.sh

#! /bin/bash

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
 echo 'a == b'
else
 echo 'a != b'
fi

测试结果

songwei@songwei-virtual-machine:~/shell_test$ ./comple.sh 
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a != b

关系运算符

在这里插入图片描述

测试文件

#!/bin/bash
a=10
b=20

if [ $a -eq $b ]
then
    echo "1:  $a -eq $b : a 等于 b"
else
    echo "1:  $a -eq $b: a 不等于 b"
fi

if [ $a -ne $b ]
then
    echo "2: $a -ne $b: a 不等于 b"
else
    echo "2: $a -ne $b : a 等于 b"
fi

if [ $a -gt $b ]
then
     echo "3: $a -gt $b: a 大于 b"
else
     echo "3: $a -gt $b: a 不大于 b"
fi

if [ $a -lt $b ]
then
     echo "4: $a -lt $b: a 小于 b"
else
     echo "4: $a -lt $b: a 不小于 b"
fi

if [ $a -ge $b ]
then
     echo "5: $a -ge $b: a 大于或等于 b"
else
     echo "5: $a -ge $b: a 小于 b"
fi

if [ $a -le $b ]
then
     echo "6: $a -le $b: a 小于或等于 b"
else
     echo "6: $a -le $b: a 大于 b"
fi

if

if condition1
then
 command1
elif condition2
then
 command2
else
 commandN
fi

例子

a=10
b=20
if [ $a == $b ]
then
 echo "a 等于 b"
elif [ $a -gt $b ]
then
 echo "a 大于 b"
elif [ $a -lt $b ]
then
 echo "a 小于 b"
else
 echo "没有符合的条件"
fi

for

for var in item1 item2 ... itemN
do
 command1
 command2
 ...
 commandN
done

例子

for loop in 1 2 3 4 5
do
  echo "The value is: $loop"
done
for str in 'This is a string','hello moto'
do
  echo $str
done

while

while condition
do
 command
done

例子

# Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
#!/bin/bash
int=1
while(( $int<=5 ))
do
  echo $int
 let "int++"
done
# 无限循环
while true
do
 command
done

break

#!/bin/bash
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

函数

#!/bin/bash
## 第一个函数------------------------------

demoFun(){
  echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

## 函数返回值------------------------------

funWithReturn(){
  echo "这个函数会对输入的两个数字进行相加运算..."
  echo "输入第一个数字: "
 read aNum
  echo "输入第二个数字: "
 read anotherNum
  echo "两个数字分别为 $aNum$anotherNum !"
 return $(($aNum+$anotherNum))

}
funWithReturn

# 函数返回值在调用该函数后通过 $? 来获得。
echo "输入的两个数字之和为 $? !"

## 函数参数------------------------------

funWithParam(){
  echo "第一个参数为 $1 !"
  echo "第二个参数为 $2 !"
#  echo "第十个参数为 $10 !"
#  echo "第十个参数为 ${10} !"
#  echo "第十一个参数为 ${11} !"
  echo "参数总数有 $# 个!"
  echo "作为一个字符串输出所有参数 $* !"

}
funWithParam $aNum $anotherNum
#funWithParam 1 2 3 4 5 6 7 8 9
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 chmod命令的其他例子 6 1.4.5 可以选择使用符号模式或绝对模式 7 1.5 目录 7 1.6 suid/guid 7 1.6.1 为什么要使用suid/guid 8 1.6.2 设置suid/guid的例子 8 1.7 chown和chgrp 9 1.7.1 chown举例 9 1.7.2 chgrp举例 9 1.7.3 找出你所属于的用户组 9 1.7.4 找出其他用户所属于的组 10 1.8 umask 10 1.8.1 如何计算umask值 10 1.8.2 常用的umask值 11 1.9 符号链接 12 1.9.1 使用软链接来保存文件的多个映像 12 1.9.2 符号链接举例 12 1.10 小结 13 第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 3.1.7 删除crontab文件 25 3.1.8 恢复丢失的crontab文件 25 3.2 at命令 25 3.2.1 使用at命令提交命令或脚本 26 3.2.2 列出所提交的作业 27 3.2.3 清除一个作业 27 3.3 &命令 27 3.3.1 向后台提交命令 28 3.3.2 用ps命令查看进程 28 3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准错误 43 5.9 合并标准输出和标准错误 43 5.10 exec 44 5.11 使用文件描述符 44 5.12 小结 45 ... ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拉依达的嵌入式小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值