Linux shell 编程基础之一

运行脚本的4种方式

#!/bin/bash
echo "Hello World ,bash的全称是: Bourne Again Shell!"
echo 'shell 使用#作为注释,但是如果#后面紧跟! 说明是脚本开始的标记'
echo 'shell脚本永远以#!开头'
echo -e "使用-e参数启用转义,打印换行符:\n"
echo -e '使用反引号``或者$(),执行你要在命令行中执行的命令\n'
echo `bash --version`
echo 
echo "$(bash --version)"
echo  -e "bash所在位置为:\n$(whereis bash)"
echo  -e "运行脚本的几种方式:\n第一种:直接使用bash命令 bash xxx.sh"
echo  '第二种,赋予文件执行权限【chmod +x aaa.sh】后, 在sh文件所在目录下执行 ./aaa.sh'
echo  '第三种,执行:先输入点号然后空格输入文件名 【. ./aaa.sh】'
echo  '点号具有至高无上的执行权限,即使用户没有执行权限也不会报错'
echo  '第四种, 使用【source ./aaa.sh】,source 命令用于在脚本中加载其它脚本'

变量

  • shell和javascript 一样,是一种弱类型的脚本语言,所以shell变量也是弱类型的,即不需要指定其变量类型
    如:定义金额为2,并显示;shell变量严格区分大小写
    在这里插入图片描述

  • 局部变量:在同一个shell窗口中有效,不同shell窗口相互独立

  • 全局变量:即环境变量,在shell脚本中,即在xxx.sh文件中,变量默认是全局变量,全局变量可以传递给子孙shell
    将一个局部变量变成一个全局变量用法:export 变量名=值
    在这里插入图片描述
    使用export 创建全局变量 money ,使用echo 打印变量值,使用 或 或 {} 引用变量
    键入bash 进入子shell ,执行相同命令,打印出3
    使用exit 退出子shell,回到父shell,全局变量只能父传子,子不能传父

  • echo命令:
    在这里插入图片描述

echo [-neE] [arg…]
将参数写入标准输出。
在标准输出中使用换行符显示参数。
选项:
-n不添加换行符
-e启用以下反斜杠转义
-E明确禁止反斜杠转义
\a 发出警报声
\b 删除前一个字符
\f 换行但光标任然停在原来的位置上
\e转义字符
\n新行
\r回车
\t水平制表符
\v垂直制表符
\\反斜杠
\0nnn ASCII码为NNN(八进制)的字符。NNN可以03个八进制数字
\xhh取值为HH8位字符(十六进制)HH可以是一个或两个十六进制数字

在这里插入图片描述

  • echo 将内容写入文件,将内容追加到文件
    在这里插入图片描述

  • 系统内建变量:

[root@192 code]# echo -e "bash shell 的全路径是:#$BASH"
bash shell 的全路径是:#/bin/bash
[root@192 code]# echo -e "bash shell 的全路径是:$BASH"
bash shell 的全路径是:/bin/bash
[root@192 code]# clear
[root@192 code]# echo -e "bash shell 的全路径是:$BASH"
bash shell 的全路径是:/bin/bash
[root@192 code]# echo -e "bash shell 的版本号是:$BASH_VERSION"
bash shell 的版本号是:4.2.46(2)-release
[root@192 code]# echo -e "主机型号是:\r\n $HOSTTYPE \r\n主机名称是:$HOSTNAME \r\n GNU标识是:$MACHTYPE "
主机型号是:
 x86_64 
主机名称是:192.168.169.128 
 GNU标识是:x86_64-redhat-linux-gnu 
[root@192 code]# echo " 语言环境是: $LANG"
 语言环境是: en_US.UTF-8
[root@192 code]# echo "当前目录是 $PWD"
当前目录是 /data/code
[root@192 code]# echo "上一个操作的目录是: $OLDPWD"
上一个操作的目录是: /
[root@192 code]# echo "环境变量的值是: $PATH"
环境变量的值是: /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@192 code]# export PATH=/data/code:$PATH
[root@192 code]# echo "环境变量的值是: $PATH"
环境变量的值是: /data/code:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@192 code]# echo $PS1
[\u@\h \W]\$
[root@192 code]# echo $BASH_VERSINFO
4
[root@192 code]# echo $RANDOM #生成一个0~32767的随机数
4997
[root@192 code]# echo $RANDOM #生成一个0~32767的随机数
16464
[root@192 code]# echo $RANDOM #生成一个0~32767的随机数
7960
[root@192 code]# echo $RANDOM #生成一个0~32767的随机数
3667
[root@192 code]# echo $RANDOM #生成一个0~32767的随机数
4984
  • 查看命令手册:man bash
    在这里插入图片描述

变量命名

 1. 命名规则和java一样,同时严格区分大小写
 2. 变量赋值和取值
     变量名=变量值,等号前后不能有空格,变量值有空格要用引号引起来
     变量的取值使用 $varName 或者${varName}
     如果变量值引用的是其它变量,必须用双引号引起来,应为单引号会阻止shell解释特殊字符$,!等
 
 3. 取消变量:unset 变量名
 4. 特殊变量:位置参数
 	 $0:表示脚本本身,$1是第一个参数,$9是第九个参数,当参数大于9个时,必须用${number}的形式
 	 $#表示参数总个数,$*或者$@表示脚本的所有参数集合

local 声明局部变量,只在函数内生效

转义:笔记本电话键盘第二排左上角的字符都是元字符,需要使用\转义

引用:

      引用是指将字符串使用某种符号括起来,以防止特殊字符被解析成其他意思。shell中一共有4中引用符
               1. 双引号:弱引用,可以引用除了$,反引号,转义符之外的所有字符,即$,反引号,转义符在双引号中不失效
               2. 单引号:强引用,全部当做普通字符串处理
               3. 反引号:会将引号中的内容解释为系统命令,即命令替换,类似于JavaScript中的eval()函数
               4. 转义符

脚本或命令的返回值 $?

Linux中规定正常退出的命令和脚本应该以0作为其返回值,任何非0的值都表示异常
这时可以用$?来获取上一条命令的返回值

提示命令不存在,使用yum install 命令名称
在这里插入图片描述

命令替换

是指将命令的标准输出作为赋给某个变量,比如在某个目录中输入ls或者ll命令,可查看当前目录的所有文件,但是如何将输出存入磨某个变量呢?
答案就是使用【命令替换】,这也是shell编程中使用非常频繁的功能
shell中有两种方式可以完成命令替换,一种是`反引号,一种是$()

在这里插入图片描述
从中可以看出,当命令替换的结果有多行时,如果不通过引用的方式来输出变量,则输出的内容将会变成一行

变量扩展

变量表达式作用
${var}取出变量var的值
${var:-default}如果变量var没有定义,则以default作为其值
${var:=default}如果变量var没有定义,或者值为空,则以default作为其值
${var+value}如果定义了var,则其值为value,否则为空字符串
${var:+value}如果定义了var并且不为空值,则其值为value,否则为空字符串
${!prefix*}匹配所有以prefix开头的变量
${!prefix@}匹配所有以prefix开头的变量
字符串表达式作用
${#str}返回字符串str的长度,#后面也可是是数组
${str:index}从位置index处提取子串
${str:index:length}从位置index处提取长度为length的子串
${str#subStr}从变量str的开头处开始寻找,删除最短匹配的subStr子串
${str##subStr}从变量str的开头处开始寻找,删除最长匹配的subStr子串
${str%subStr}从变量str的结尾处开始寻找,删除最短匹配的subStr子串
${str%%subStr}从变量str的结尾处开始寻找,删除最长匹配的subStr子串
${str/subStr/replace}将str匹配的第一个subStr替换成replace
${str//subStr/replace}将str所有匹配subStr都替换成replace
${str/#subStr/replace}如果str以subStr开头,将str所有匹配subStr都替换成replace
${str/%subStr/replace}如果str以subStr结尾,将str所有匹配subStr都替换成replace

Bash中的通配符条件表达式

1.模式匹配== 判断字符串是否与指定模式匹配。

string="我 还是 爱你的"

# 使用通配符条件表达式来判断字符串是否包含子串
# 因为比较的子串有空格所以通配符*要放在双引号之外
if [[ "$string" == *" 还是 "* ]]; then
    echo "字符串包含 ' 还是 '"
else
    echo "字符串不包含 ' 还是 '"
fi
# 使用正则
if echo "$string" | grep -q '\s还是\s'; then
    echo "字符串包含 ' 还是 '"
else
    echo "字符串不包含 ' 还是 '"
fi

2.模式不匹配!= 判断字符串是否不与指定模式匹配

if [ "$var" != "prefix"* ]; then
    echo "变量不以指定的模式【前缀】开头"
fi

3.模式正则匹配=~ 使用正则表达式进行模式匹配

在Bash中,使用=~运算符来应用正则表达式进行模式匹配
而=~实际上是=~运算符的一种替代形式,用于在没有正则表达式匹配功能的情况下进行字符串比较。在较早的Bash版本中,可能不支持正则表达式匹配,因此使用=~作为替代。
在现代Bash版本中,通常支持正则表达式匹配,因此更常用的是=~条件表达式匹配。
=~条件表达式允许我们使用正则表达式对字符串进行模式匹配。他的左边是字符串,右边是正则表达式,用于匹配字符串是否符合指定的模式。如果匹配成功,条件为真,否则为假

#!/bin/bash

string="Hello, World!"
pattern='^[Hh][Ee][Ll][Ll][Oo], [Ww][Oo][Rr][Ll][Dd]!$'

if [[ "$string" =~ $pattern ]]; then
    echo "字符串匹配成功"
fi

string="我 还是 爱你的"
if [[ "$string" =~ " 还是 " ]]; then
    echo "字符串包含 ' 还是 '"
else
    echo "字符串不包含 ' 还是 '"
fi

以下是Shell脚本的官方文档:

  1. Bash:Bash是最常用的Shell,它是Linux和macOS系统默认的Shell。你可以在GNU官方网站上找到Bash的官方文档:GNU Bash官方文档

如何查找Linux是什么版本?

要查找Linux的版本,你可以使用以下命令之一:

  1. lsb_release命令:lsb_release命令可以用于显示Linux发行版的信息,包括版本号。在终端中运行以下命令:
    lsb_release -a
    该命令将显示Linux发行版的详细信息,包括发行版名称、版本号和其他相关信息。

  2. cat /etc/os-release命令:你还可以查看/etc/os-release文件来获取Linux发行版的信息。在终端中运行以下命令:

该命令将显示/etc/os-release文件的内容,其中包含了Linux发行版的信息,如发行版名称、版本号等。
cat /etc/os-release

以下是一些互联网上可以找到的常见的Shell脚本示例的网站:

  1. Shell脚本教程:Shell脚本教程 - 菜鸟教程 - 这个教程提供了Shell脚本的基础知识和常见示例,适合初学者入门。

  2. Shell脚本示例集合:Awesome Shell - 这个GitHub仓库收集了各种Shell脚本示例,包括文件操作、文本处理、系统管理等。

  3. Shell脚本示例库:Shell Script Library - 这个网站提供了大量的Shell脚本示例,按照不同的主题分类,包括字符串处理、文件操作、网络管理等。

  4. Shell脚本实例:Shell Script Examples - 这个网站提供了一系列Shell脚本示例,涵盖了各种常见的用例,如日志分析、备份脚本、系统监控等。

开源是一种精神,分享是一种美德!学到了就要教人,赚到了就要给人!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值