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可以0到3个八进制数字
\xhh取值为HH的8位字符(十六进制)。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脚本的官方文档:
- Bash:Bash是最常用的Shell,它是Linux和macOS系统默认的Shell。你可以在GNU官方网站上找到Bash的官方文档:GNU Bash官方文档
如何查找Linux是什么版本?
要查找Linux的版本,你可以使用以下命令之一:
-
lsb_release命令:lsb_release命令可以用于显示Linux发行版的信息,包括版本号。在终端中运行以下命令:
lsb_release -a
该命令将显示Linux发行版的详细信息,包括发行版名称、版本号和其他相关信息。 -
cat /etc/os-release命令:你还可以查看/etc/os-release文件来获取Linux发行版的信息。在终端中运行以下命令:
该命令将显示/etc/os-release文件的内容,其中包含了Linux发行版的信息,如发行版名称、版本号等。
cat /etc/os-release
以下是一些互联网上可以找到的常见的Shell脚本示例的网站:
-
Shell脚本教程:Shell脚本教程 - 菜鸟教程 - 这个教程提供了Shell脚本的基础知识和常见示例,适合初学者入门。
-
Shell脚本示例集合:Awesome Shell - 这个GitHub仓库收集了各种Shell脚本示例,包括文件操作、文本处理、系统管理等。
-
Shell脚本示例库:Shell Script Library - 这个网站提供了大量的Shell脚本示例,按照不同的主题分类,包括字符串处理、文件操作、网络管理等。
-
Shell脚本实例:Shell Script Examples - 这个网站提供了一系列Shell脚本示例,涵盖了各种常见的用例,如日志分析、备份脚本、系统监控等。
开源是一种精神,分享是一种美德!学到了就要教人,赚到了就要给人!