day04-第一阶段

day04-第一阶段

Linux的shell编程

名词解释

  • Kernel
Linux内核主要是为了和硬件打交道
  • Shell
Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序语言设计。
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
  • Shell环境
只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了
Bourne Shell (/usr/bin/sh或/bin/sh)
Bourne Again Shell (/bin/bash) -- 默认
C Shell (/usr/bin/csh)
  • #!声明
告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序

执行Shell的方法

  • ./shxx.sh
执行的必须是一个可执行文件
chmod u+x shxxx.sh
  • sh shxxx.sh
执行的文件可以是一个普通文件
  • source shxxx.sh
直接在当前进程执行脚本
当我们执行bash的时候开启一个子进程,当脚本中出现ping的时候又开启了一个子进程

shell 语法

变量

定义变量

定义变量时,变量名不加美元符号:
your_name="name"

命名规则

- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头;
- 中间不能有空格,可以使用下划线_;
- 不能使用标点符号;
- 不能使用bash里的关键字

使用变量

使用一个定义过的变量,只要在变量名前加美元符号$即可
例:
	name="haha"
	echo $name
	echo ${name}
变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界
	echo "I am good at ${skill}Script"

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

格式:
	myName="haha"
	readonly myName

删除变量

unset 变量名

查看所有的变量

set

变量的类型

运行shell时,会同时存在三种变量
	局部变量:
		局部变量在脚本或命令中定义,仅在当前shell实力中有效,其他shell启动的程序不能访问局部变量
	环境变量
		所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行
	shell变量
		shell变量是由shell程序设置的特殊变量

Shell字符串

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

传递参数

往脚本文件中传递参数

执行shell脚本时,往脚本中传递参数,脚本内获取参数的格式为$n
$0 执行的文件名(包含文件的路径)
$1 第一个参数
$2 第二个参数
$3 第三个参数
....

处理参数的特殊字符

  • $#
传递到脚本的参数个数

shell脚本:

#!/bash/sh
echo "shell 传递参数实例"
echo "文件的名字: $0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "传递给脚本的参数的个数:$#"

运行结果:

  • $*
一个单字符串显示所有向脚本传递的参数

shell脚本:

for i in "$*"; do
   echo "$i"
done
echo "==========="
for i in "$@"; do
   echo "$i"
done

运行结果:

结果分析:
	同时传递三个参数1 2 3,得到两种不同的结果
	$* 等价于"1 2 3"传递了一个参数
	$@ 等价于"1" "2" "3" 传递了三个参数
  • $$
脚本运行的当前进程ID号

  • $!
后台运行的最后一个进程的ID号
  • $@
与$*相同,但是使用时加引号,并在引号中返回每个参数
  • $-
显示shell使用的当前选项,与set命令功能相同
  • $?
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

shell数组

创建数组

Base Shell 只支持一维数组,下标从0开始,元素使用空格分开
array_name=(value1 value2 value3 ...)

数组的使用

#!/bin/bash

# 创建一个数组
my_array=(1 "hello world" 3 4.4)
# 通过下标获取数组元素
echo "第一个元素为:${my_array[0]}"
echo "第二个元素为:${my_array[1]}"

# 获取数组中的所有的元素
echo "数组中的所有元素:${my_array[*]}"
echo "数组中的所有元素:${my_array[@]}"

# 获取数组的长度
echo "数组的长度为:${#my_array[*]}"
echo "数组的长度为:${#my_array[@]}"

运行结果:

1647868624330

获取数组的长度:${#arrayName[*]} 或 ${#arrayName[@]}
获取数组中的所有元素:${arrayName[*]} 或 ${arrayName[@]}

基本运算符

算数运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
注意:
	表达式和运算符之间要有空格,例如 2 + 2 是正确的,2+2是错误的。
	完整的表达式要写在 ``反引号内
+	加法	`expr $a + $b`
-	减法
*	乘法	`expr $a \* $b`
/	除法
%	求余
= 	赋值	a=$b
==	相等	[ $a == $b ] 
!=	不等	[ $a != $b ]

关系运算符

关系运算符只支持数字,不支持字符串
-eq	等于	[ $a -q $b ]
-ne 不等于
-gt	大于
-lt	小于
-ge	大于等于
-le 小于等于

布尔运算符

!	非
-o	或
-a	与

逻辑运算符

&&	逻辑and
||	逻辑or

字符串运算符

对字符串进行比较
=	等于	[ $a = $b ]
!=	不等于
-z	检测字符串的长度是否为0,为0返回true [ -z $a ]
-n	检测字符串的长度是否不为0,不为0返回true
$	检测字符串是否为空,不为空返回true [ $a ]

文件测试运算符

-b file	检测文件是否是块设备文件,如果是,则返回 true。	                      [ -b $file ]
-c file	检测文件是否是字符设备文件,如果是,则返回 true。	                     [ -c $file ]
-d file	检测文件是否是目录,如果是,则返回 true。	                             [ -d $file ]
-f file	检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true [ -f $file ]
-g file	检测文件是否设置了 SGID 位,如果是,则返回 true。	                    [ -g $file ] 
-k file	检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。         	  [ -k $file ] 
-p file	检测文件是否是有名管道,如果是,则返回 true。	                       [ -p $file ] 
-u file	检测文件是否设置了 SUID 位,如果是,则返回 true                        [ -u $file ] 
-r file	检测文件是否可读,如果是,则返回 true                                  [ -r $file ] 
-w file	检测文件是否可写,如果是,则返回 true                                  [ -w $file ] 
-x file	检测文件是否可执行,如果是,则返回 true                                [ -x $file ] 
-s file	检测文件是否为空(文件大小是否大于0),不为空返回 true                  [ -s $file ] 
-e file	检测文件(包括目录)是否存在,如果是,则返回 true                       [ -e $file ]

Shell的echo命令

1. 显示标准字符串

echo "hello world"

2. 显示转义字符

echo "\"hello world"\"

3. 显示不换行

echo "hello world \c"

4. 字符串原样输出

echo 'hello world $name\"'

5. 执行命令

echo `date`

Shell的printf命令

格式

printf format-string [arguments...]
format-stirng:格式控制字符串
arguments:参数列表

格式替换符

%s 输出一个字符串
%d 整型输出
%c 输出一个字符
%f 输出实数,以小数形式输出

Shell的test命令

test命令检查某个条件是否成立,可以进行数值、字符、和文件的测试
一般用于选择结构中
if test 条件表达式
then
	语句1
else
	语句2
fi

流程控制

if else

if condition
then
    command1 
    command2
else
    commandN 
fi

if else-if else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

case ... esac 多分支

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

for 循环

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

while 语句

while condition
do
    command
done

无限循环

方式1
while :
do
    command
done
方式2
while true
do
    command
done
方式3
for (( ; ; ))

跳出循环

break 跳出本层循环
continue 跳出本次循环

Shell 函数

函数的定义

[ function ] funname [()]{
    action;
    [return int;]
}
注意:
	参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 
	return后跟数值n(0-255)

函数的调用

方法名 参数列表

shell输入/输出重定向

command > file	将输出重定向到 file。
command < file	将输入重定向到 file。
command >> file	将输出以追加的方式重定向到 file。
n > file	    将文件描述符为 n 的文件重定向到 file。
n >> file	    将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m       	将输出文件 m 和 n 合并。
n <& m	        将输入文件 m 和 n 合并。
<< tag	        将开始标记 tag 和结束标记 tag 之间的内容作为输入。

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
posted @ 2022-03-21 22:26  黎白昼  阅读(20)  评论(0)    收藏  举报