当前位置: 首页 > news >正文

shell基本指南

缘起

病毒肆掠 在家来无事,想着吧shell的知识整理一下

源码地址 github 求点个star ⭐️

shell环境

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

我们常见的操作系统如mac的OSX系统,打开终端就可以执行我们的shell(Bash shell)。windows系统中我们的cmd终端也可以执行,Linux系统一等公民的shell环境

无论什么开发者,或多或少都会运用到一些shell的知识,这篇文章旨在帮助你完整的整理shell的基本知识

话不多说让我们开始吧 !

start

作为一门脚本语言,和其他语言一样shell中也存在:

  • 变量
  • 数据结构
  • 运算符
  • 流程控制
  • 函数
  • 内置函数

变量

    my_var='new.ruoduan.cn'
  • 语句给变量赋值
for file in `ls /etc`
# 以上语句将 /etc 下目录的文件名循环出来
  • 只读变量
redVar="abc"
readonly redVar
redVar="213"

This variable is read only.

  • 删除变量
del_var='待会要删除'
unset del_var
echo $del_var

输出为空

  • 拼接字符串
name='ruoduan'
echo "my name is ${name} !"
echo 'my name is $name !'
引号里可以有变量,双引号里可以出现转义字符
  • 获取字符串长度
    echo ${#name}

  • 截取字符串 和python类似
    echo ${name:3:1}

  • 查找字符串
    echoexpr index “$name” r# 输出1

传递参数

arguments.sh

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

终端执行 bash arguments.sh 1 2 3

输出:

Shell 传递参数实例!
执行的文件名:arguments.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

转义符:

符号解释
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@“用「”」括起来的情况、以"$1" "$2" … "$n"的形式输出所有参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
  • 栗子🌰
echo -e "\n Shell 传递参数实例!";
echo "第一个参数为:$1";

echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

输出:

Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3

数组

比较容易理解,一个文本带过

arr.sh

my_array=(A B "C" D)

array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

echo $array_name[1]

# 获取数组中的所有元素
# 使用@ 或 * 可以获取数组中的所有元素

echo "数组中的所有元素为${array_name[*]} "

# 获取数组的长度å
echo "数组中的长度${#array_name[*]} "

输出:

value0[1]
数组中的所有元素为value0 value1 value2 
数组中的长度3 

运算符

shell 运算符分为如下几类

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

val=`expr 3 + 3`
echo "两数之和为 : $val"

两数之和为 : 6

算术运算

a=30
b=60

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"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

输出:

两数之和为 : 6
a + b : 90
a - b : -30
a * b : 1800
b / a : 2
b % a : 0
a 不等于 b

其他的运算符 就不给出实例了详情 源码

shell echo

echo '啦啦啦~ 哈哈哈'

# 显示转义字符
echo -e '啦啦啦~ \n 哈哈哈'

# 显示变量
# 有点类似于 python 中的 input
read name 
echo "$name It is a test"

# 显示结果定向至文件
echo -e "显示结果定向至文件的内容\n" > myfile.log

# 显示命令执行结果
echo `date`

比较简单

shell printf

语法:
printf format-string [arguments…]

  • format-string: 为格式控制字符串
  • arguments: 为参数列表。
echo "Hello, Shell"
printf "Hello, Shell\n"

# 格式化打印
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 小米 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 小红 男 48.6543 
printf "%-10s %-8s %-4.2f\n" 小康 女 47.9876 

输出:

Hello, Shell
Hello, Shell
姓名     性别   体重kg
小米     男      66.12
小红     男      48.65
小康     女      47.99
  • %s %c %d %f都是格式替代符

  • %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

  • %-4.2f 指格式化为小数,其中.2指保留2位小数。

流程控制

  • if elif
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

shell 中流程控制以if开始fi结尾

  • if else
    if else语句经常与test命令结合
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

# for 循环
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

输出:

The value is 1
The value is 2
The value is 3
The value is 4
The value is 5
  • while 语句
int=1
while(( $int<=6 ))
do
    echo $int
    let "int++"
done

输出:

1
2
3
4
5
6
  • 无限循环
while true
do
    command
done

or

for (( ; ; ))

  • until 循环
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done
  • case
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac
  • break continue
    continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循

  • case … esac

site="a"
case "$site" in
   "a") echo "is a"
   ;;
   "b") echo "is b"
   ;;
   "c") echo "is c"
   ;;
esac

函数

demoFun () {
    echo "函数执行"
}
demoFun
  • 函数返回值
returnFun () {
    echo '返回2数相加'
    echo '输入第一个数字'
    read aNum
    echo '输入第二个数字'
    read bNum
    echo "$aNum$bNum"
    return $(($aNum+$bNum))
}

returnFun
echo "输入的两个数字之和为 $? !"

函数返回值在调用该函数后通过 $? 来获得
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以

  • 函数参数

    和前面的传递参数大致相同

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

funWithParam 1 2 3 4 5 6 7 8 9 66 99

输出:

第一个参数为 1 !
第二个参数为 2 !
err:第十个参数为 10 !
第十个参数为 66 !
第十一个参数为 99 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 66 99 !

当n>=10时,需要使用${n}来获取参数

  • 参数符
符号说明
$#传递到脚本或函数的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

shell 文件模块

和JavaScript ECma5差不多

test1.sh

file_name='test1文件数据'

test2.sh

. ./test1.sh
# or
# source ./test1.sh

echo $file_name

输出: test1文件数据


到这里 shell 的基本知识也差不多了本指南源码

码字不易 求点个 star ⭐️

vim图

vim图

相关文章:

  • create-react-app 没有[src] 文件夹(记一次问题)
  • antdv4 升级指北
  • [助力job]React-mode[进阶] (React模式梳理 )
  • 记-vue vue.config.js 配置webpack全局变量
  • 浅谈前端架构自动化-cdn刷新预热自动化脚本
  • 了不起的certbot申请免费SSL证书
  • 记-react-connect中使用forwardRef 问题。
  • ES2020(ES11)新特性
  • 新版 Chrome浏览器在 http协议下无法获取到摄像头、麦克风权限
  • Monorepo[单一代码库] 与MicroService[微服务] 架构
  • 搭建私有npm构建JSSDK
  • Docker 部署 Flask
  • Informix 索引禁用期间数据变化,重启启用后索引的变化情况
  • informix数据库自动备份脚本
  • dbexport备份数据库
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • canvas 高仿 Apple Watch 表盘
  • Cookie 在前端中的实践
  • Debian下无root权限使用Python访问Oracle
  • github从入门到放弃(1)
  • Javascript Math对象和Date对象常用方法详解
  • Node项目之评分系统(二)- 数据库设计
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • v-if和v-for连用出现的问题
  • Vultr 教程目录
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 警报:线上事故之CountDownLatch的威力
  • 山寨一个 Promise
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 为视图添加丝滑的水波纹
  • 小程序开发之路(一)
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 原生js练习题---第五课
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (0)Nginx 功能特性
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (4)logging(日志模块)
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (算法)前K大的和
  • (一)为什么要选择C++
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 后台导出excel ,word
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET企业级应用架构设计系列之结尾篇
  • .net中生成excel后调整宽度
  • @Bean, @Component, @Configuration简析
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作