Linux高级编程_26_shell

文章目录

shell

概述:

既是一种应用程序,又是一种程序设计语言

从应用程序角度理解:

交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能

​ 称为 shell 命令解析器

作用:

​ shell 是用户 与 Linux 内核之间的 接口程序


用户在提示符下输入的命令[如 cd pwd ls ...]都由 shell 先解释然后传给 Linux 核心

它调用了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行

Linux 系统中提供了好几种不同的shell命令解释器,如 sh、ash、bash等。

一般默认使用 bash 作为默认的解释器。

后面编写的shell脚本,都是由上述shell命令解释器解释执行的。

查看默认 shell 命令解释器

shell 复制代码
echo $SHELL

从程序设计语言角度理解:

概念:

​ 它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括

循环和分支

​ 完成类似于windows下批处理操作,简化我们对系统的管理与应用程序的部署称

之为shell脚本

学过的c/c++等语言,属于编译性语言(编写完成后需要使用编译器完成编译、汇编、链接等过程变为二进制代码方可执行)

shell脚本是一种脚本语言 ,我们只需使用任意文本编辑器,按照语法编写相应程
序,增加可执行权限,即可在安装shell命令解释器的环境下执行

​ 增加可执行权限命令:

chmod +x 文件名 注意文件名路径

分类:

  • 系统调用

    bash 复制代码
    这类脚本无需用户调用,系统会在合适的时候调用,如:/etc/profile、 ~/.bashrc 等
    	/etc/profile:  
    		启动时调用
    	 ~/.bashrc:
         用户登录时调用
  • 用户编写手动调用

    • 示例:控制台打印hello shell 不需要编译器 只要有命令解析器就行

      shell 复制代码
      代码:
      #!/bin/bash
      echo "hello shell"
      增加可执行权限
      运行

语法:

1、#!

定义以开头:#!/bin/bash

​ #! 用来声明脚本由什么shell 解释,否则使用默认shell

2、#

单个"#"号代表注释当前行

3、执行:

方式1:
bash 复制代码
./shell 文件名
这种方式先检测执行的文件中是否存在指定的shel命令解析器,如果存在使用指定的,如果不存在 使用默认的
开启子shell 由shell执行
方式2:
bash 复制代码
shell命令解析器名称  shell文件名
这种方式不会检测文件中是否存在指定的shell命令解析器,使用执行命令前指定的shell解析器
开启子shell 由子shell执行
方式3:
bash 复制代码
source shell文件名
或
. shell文件名
这种方式不会开启 子(新的)shell,直接由当前的shell去解释执行脚本

注意:

不要在window下使用最好

bash 复制代码
创建文件时:
		如果是在windows中创建编写的shell脚本文件,拖拽到Liunx下无法运行,因为windows与Liunx下\表示的含义不同,所以导致程序无法被识别
		解决方案1:
				在Liunx中使用vim编辑器,在最后一行模式输入Setff=unix
		解决方案2:
				在Linux中安装dos2unix,使用dos2unix转换
			步骤:
				1,命令行输入:sudo apt-age instal1 dos2unix
				2,命令行输入:dos2unix文件地址

第一个shell脚本

步骤:

  • 1 创建一个文件
  • 2 指定解析器
    • #!/bin/bash
  • 3 编写命令
    • linux命令
  • 4 保存
  • 5 增加权限
    • chmod +x 文件名
  • 6 执行

变量

作用:临时记录一个值或可以被改变的数据

分类:

  • 系统变量
    • 使用 env 查看 注意 =号左边为变量名 =右边为变量值
  • 自定义变量

变量的定义:

变量的定义与初始化:

  • 变量名=值
    • 注意:等号两边不能有空格
    • 此时所有的值都是字符串

变量的修改

  • 变量名=值
    • 注意:
      • 此时变量已经被定义

变量的取值

  • $变量名

撤销变量

  • unset 变量名

示例:

文件名 00_shell

bash 复制代码
#!/bin/bash
data=100   #定义变量
echo $data  #取值
unset data    #撤销变量
chmod -x 00_shell # 提升权限

./00shell  #执行

声明只读变量

  • readonly 变量名=值
    • 注意:
      • 只读变量 不能撤销 不能改值

导出变量:

  • export 变量名
    • 作用: 导出变量,导出给父 shell
      • 1 2 会导给 父shell 3 因为不会开启子shell 所以会导出到系统变量

declare -i 将变量强制转换为数字

  • declare -i 变量名

示例:

bash 复制代码
#!/bin/bash
declare -i xxz=100
xxz=&xxz*2
echo $xxz    #结果 是200 

注意:

  • 子shell 可以访问父shell的变量
  • 父shell 不能访问子shell的变量

预设变量

  • $#:传给shell脚本参数的数量
  • $*:传给shell脚本参数的内容
  • $1、$2、$3、、、、$9:运行脚本时传递给其的参数,用空格隔开
  • $?:命令执行后返回的状态
    • 用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)。
  • $0:当前执行的进程名
  • :当前进程的进程号 * $$:变量最见的用途是用作临时文件的名字以保证临时文件不会重复

bash 复制代码
"": 包含的变量会被解释
'':包含的变量会作为字符串处理
``:反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量
\:  同c语言\n \t \r \a 等echo命令需加-e转义(bash解析器需求)
	echo -e "123\n456"  #这样才会换行
(命令):由子she11来完成,不影响当前she11中的变量,命令前后必须有空格
{命令}: 在当前shell中执行,会影响当前变量,命令前后必须有空格

键盘录入

语法

  • read 变量名
  • read -p 提示内容 变量名

示例:

bash 复制代码
#!/bin/bash
num=0
# echo "请输入一个数:"
# read num
# 或
read -p "请输入一个数:" num
echo "num=$num"

条件测试语句

语法:

语法1: test 条件

语法2:[ 条件 ] 注意:条件前后必须有空格

文件测试

bash 复制代码
文件测试:测试文件状态的条件表达式
-e 	是否存在
-d	是否为目录
-f	是否为文件
-r	是否可读
-W	是否可写
-x	是否可执行
-L	是否连接
-c	是否字符设备
-b	是否为块设备
-S	是否文件非空

示例:

bash 复制代码
test -e kkk
echo $?    #   $? 返回执行状态

返回0 为真 非0 为假
bash 复制代码
[ -e kkk ]
echo $?

字符串测试

bash 复制代码
=  两个字符串相等
!= 两个字符串不相等
-Z 空串
-n 非空串
		#注意:=! =前后要有空格

数值测试

bash 复制代码
-eq		数值相等
-ne		数值不相等
-gt		数 1 大于数 2
-ge		数 1 大于等于数 2
-le		数 1 小于等于数 2
-1t		数 1 小于数 2

扩展:

bash 复制代码
#${num:-Va]}如果num存在,返回num,否则返回va]
echo ${x:-10}
#${num:=Va]}如果hum存在,返回num,否则返回va1,并将va1赋值给num
echo ${y:=10}
echo $y

复合测试:

bash 复制代码
&&
command1 && command2
&&左边命令(commandl)执行成功(即返回0)shell 才执行&&右边的命令(command2)
||
command1 1l command2
丨左边的命令(command1)未执行成功(即返回非0)shel]才执行丨|右边的命令(command2)

多重条件:

bash 复制代码
-a:与
-o: 或
!: 非

示例:

bash 复制代码
#!/bin/bash
#输入文件路径判断文件是否可读可写可执行
echo 请输入文件路径
read filename
[ -r $filename -a -w $filename -a -x $filename ]
echo $filename 是否可读可写可执行:$?
[! -x $filename ]
echo $filename 是否不可执行:$?

if 语句

bash 复制代码
if [ 条件1 ];then
	执行第1段程序
elif [ 条件2 ];then
	执行第2段程序
elif[ 条件3 ];then
	执行第3段程序
....
else
	执行第n段程序
fi

示例:

bash 复制代码
#!/bin/bash
read -p 请输入年龄 age
elif [ $age -ge 18 ];then
echo 成年人
else
echo 未成年
fi

case语句

bash 复制代码
case $变量名 in
"值1") 
	语句1
;;
"值2")
	语句2
;;
"值2")
	语句3
;;
esac

	扩展  exit 1 #退出shell

示例

for语句

bash 复制代码
for((初始值;限制值;执行步阶))
do
程序段
done

示例:

bash 复制代码
#!/bin/bash
#计算100以内数之和
#declare-is强制将s作为int型数值,需要使用./运行
declare -i s=0
declare -i sum=0
for(( s=0; s<=100; s++ ))
do
sum=$sum+$s;
done
echo$sum

while语句

bash 复制代码
while [ 条件 ]
do
执行语句
done

示例:

注意 一定要注意 空格 的问题

bash 复制代码
#!/bin/bash
declare -i i=0
while [ $i -le 100 ]
do
echo $i
i=$i+1
done

扩展:

bash 复制代码
#!/bin/bash
# 变量名=$(( 值1 + 值2 ))
n01=10
n02=2
n03=$(( $n01 + $n02 ))
echo $n03
# 变量名=$(( 值1 - 值2 ))
n04=$(( $n01 - $n02 ))
echo $n04
# 变量名=$(( 值1 * 值2 ))
# 变量名=$(( 值1 / 值2 ))
# 变量名=$(( 值1 % 值2 ))
# 变量名=$(( 变量名-- ))
# n05=$(( n01-- ))
# echo $n05
# echo $n01
# 变量名=$(( --变量名 ))
n05=$(( --n01 ))
echo $n05
echo $n01
# 变量名=$(( 变量名++ ))
# 变量名=$(( ++变量名 ))
# 变量名=$(( -10 > 1 ? 10 : 1 ))
n06=$(( -10 > 1 ? 10 : 1 ))
echo $n06

until语句

语法:

bash 复制代码
until [ 条件 ]
do
	程序段
done
	注意:
			当条件表达式为假执行循环体中的代码,如果为真,结束循环

示例:

bash 复制代码
#!/bin/bash
i=0
until [ $i -ge 10 ]
do
i=$(( ++i ))
echo $i
done

函数

定义:

bash 复制代码
语法1

函数名(){
	程序段
}

语法2
function 函数名()
{
	程序段
}

调用

bash 复制代码
函数名 参数1 参数2....

示例:

bash 复制代码
#!/bin/bash
#函数的定义1
#函数名(){
#}
method()
{
	echo 自定义函数被执行
}
#函数的调用:函数名 参数1 参数2 ...
method

=
#函数的定义2
#function 函数名(){
#}
function method02()
{
	echo 自定义函数2被执行
}

method02

add()
{
	num=$(( $1+$2 ))
	return $num
}
add 2 21
echo $?
相关推荐
ccubee2 分钟前
docker 安装 ftp
运维·docker·容器
枫叶红花25 分钟前
【Linux系统编程】:信号(2)——信号的产生
linux·运维·服务器
yaosheng_VALVE32 分钟前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
_微风轻起35 分钟前
linux下网络编程socket&select&epoll的底层实现原理
linux·网络
dami_king40 分钟前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
启明真纳1 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
苹果醋31 小时前
SpringBoot快速入门
java·运维·spring boot·mysql·nginx
WANGWUSAN661 小时前
Python高频写法总结!
java·linux·开发语言·数据库·经验分享·python·编程
TsengOnce2 小时前
Docker 安装 禅道-21.2版本-外部数据库模式
运维·docker·容器
永卿0012 小时前
nginx学习总结(不包含安装过程)
运维·nginx·负载均衡