已整理-shell脚本编程资料整理

  目录:

    1、变量的定义与类型

    2、配置用户环境

    3、shell的整数运算

    4、条件测试

    5、if条件分支

    6、循环

    7、case分支

    8、函数

    9、流程控制语句

    10、shell数组  

 

1、变量的定义与类型
变量:为了适应多变的环境需求,会变化的量,以不变的名称存储可以变化的值,类似容器

定义变量:a=100
提取变量值:echo $a
销毁变量:unset a

为了和户的体验,降低脚本的使用难度,产生交互,向脚本中传递命令行参数:
read -p 'please input your create username:' username
-p 输出屏幕提示信息
1)、产生交互;   2)、记录用户在键盘输入;   3)、将记录的信息赋值给一个变量储存;

1.1 变量的种类:
【环境变量】: 变量名一般都大写,用来设置用户/系统环境;
【位置变量】: bash内置,存储执行脚本时提供的命令参数;
【预定义变量】:bash内置,可直接调用的特殊值,不能直接修改;
【自定义变量】: 用户自主设置、修改及使用;

环境变量:由系统定义,并且赋值完成,一般变量名为大写;
常见的环境变量:
PWD / PATH / USER / LOGNAME / SHELL / HOME

USER=当前登陆有用户

env 显示所有环境变量
set 查看所有变量

自定义环境变量:
# export ada=100 #定义环境变量
# export -n ada #取消环境变量,恢复到普通变量


位置变量:由系统定义完成,在执行脚本时提供的命令行参数,表示为$n ,其中n为序号;
$1,$2,....${10},${11}....
$0 表示bash脚本文件名

预定义变量:用来保存脚本程序的执行信息,直接使用这些变量,不能直接为这些变量赋值;
$# ->已加载的位置变量的个数
$? ->程序退出后的状态值, 0表示正常,其它值表示异常

判断用户是否输入参数? 当$#的值为0的时候,说明没有输入参数;


自定义变量:根据变量的用途不同区分,用户自主设置、修改及使用;
a=100
unset a #取消自定义变量

以下是常用变量:

#! /bin/bash
echo $1     脚本后跟的第1个参数
echo $2     脚本后跟的第2个参数
echo $3     脚本后跟的第3个参数
echo $$     当前脚本的进程号
echo $#     位置变量的个数
echo $*     所有位置变量
echo $?     上一条指令的结果,0代表正常,非0是异常
echo $0     执行脚本的名字
echo $!     最后一条放入后台的程序进程号

 

stty -echo #关闭回显

stty echo #回显


1.2 取变量值
单引号:'' 取消原来的意义

反撇号:`` 与 $() 将命令的输出,当做参数直接参与下一个命令的运行


----------------------------------------------------------------------------------------------------------------------------------
2、配置用户环境
alias 别名
语法:
定义别名:alias 别名='程序路径'
取消别名:unalias 别名

~/.bashrc         指定用户每次开启bash 终端生效
/etc/bashrc        影响所有用户


# cat /etc/shells #查看系统拥用的解释器


---------------------------------------------------------------------------------------------------------------------------------
3、shell的整数运算
3.1、expr 1 + 3           #不支持小数,运算符前面都需要空格,否则运算不成功,如果是乘法需要用: \* 表示

# expr 1 + 3
4

 

3.2、echo $[]             #不支持小数,运算后,显示不了结果,需要配合echo

# echo $[100+20]

 

3.3、let               #不支持小数,也支持变量值的变化,不显示结果

# let a=a+100
# let a++
# let a+=2

 

3.4、echo "scale=3;10/3"|bc      #bc进行非交互式计算,支持小数


----------------------------------------------------------------------------------------------------------------
4、条件测试
4.1、字符串比较

==     是否相等
!=     是否不相等
-z     判断是否为空, 空为真,非空为假
-n      判断是否不为空,非空为真, 空为假

 

[ abc == abc ]
[ $USER == "root" ] && echo 'successful.'
[ $USER != "root" ] && echo 'successful.'

 

4.2、数字比较

-eq     等于
-ne     不等于
-gt     大于
-ge     大于等于
-lt     小于
-le      小于等于

 

4.3、文件状态判词

-e     判断文件是否存在,不区分文件种类,不管是文件还是目录
-f     判断文件是否存在,是文件为真
-d     判断文件目录是否存在,是目录为真

 

如果取反,前面加 ! -e 即可;

-r     判断文件是否有读权限 
-w      判断文件是否有写权限 
-x     判断文件是否有执行权限

 


4.4、逻辑判断

&&     前面任务成功,才执行后续任务
||     前面任务失败,才执行后续任务
;     前面任务执行完毕后,继续执行后面的命令

 

----------------------------------------------------------------------------------------------------------------
5、if条件分支
if双分支处理:
双分支,当条件满足/不满足时,分别xx/yy处理
如果软件包foo未装,则将其安装;
否则,放弃安装

语法:

if 条件测试; then
  命令序列xx
else 
  命令序列xx
fi

 

示例:
判断用户是否存在?

#! /bin/bash
id $1 &>/dev/null
if [ $? -eq 0 ]; then
  echo 'user is esxits'
else
  echo 'user is not esxits'
fi

 

if多分支
语法:

if 条件测试; then
  命令序列xx
elif 条件测试; then
  命令序列xx
else 
  命令序列xx
fi

 

示例:

#! /bin/bash

read -p 'please input your core:' core
if [ $core -ge 90 ]; then
  echo 'youxiu'
elif [ $core -ge 80 ]; then
  echo 'lianghao'
elif [ $core -ge 70 ]; then
  echo 'yiban'
elif [ $core -ge 60 ]; then
  echo 'jige'
else
  echo 'liangliang'
fi

 

-------------------------------------------------------------------------------------------------------------
6、循环
for循环:给定一批对象,反复执行类似的操作
语法:

for 变量名 in 值列表
do 
  命令序列
done

for i in {1..5}
do 
  echo $i
done

 

while 条件测试
do
  任务序列
done

while :            #永远执行任务
do
  任务序列
done

 

-----------------------------------------------------------------------------------------------------------
7、case分支
case分支,是简化版本的if,代码编写比if精简,但功能不如if强大;
语法:

case 变量 in
模式1)
  命令序列;;
模式2)
  命令序列;;
*)
  命令序列
esac

 

case $1 in
aa|a)
  echo aaaa;;
bb|b)
  echo bbbb;;
*)
  echo ccccc
esac

 

-----------------------------------------------------------------------------------------------------------
8、函数
函数可以定义公共的语句块,在脚本中反复调用,达到精简脚本的目的

函数定义语法:

function 函数名 {              #第1种定义语法

}

函数名(){                  #第2种定义语法

}

 

函数名 #调用

#!/bin/bash
start(){
  echo 'test'
  exit 100
}

start

 

----------------------------------------------------------------------------------------------------------
9、流程控制语句
wait        等待所有后台进程执行完毕,再执行后面的命令;

exit       终止脚本程序
break      跳出循环,执行循环后任务
continue     结束本次循环,继续下一次循环

 

------------------------------------------------------------------------------------------------------------------

10、shell 数组
shell数组特点:
  1)、数组中可以存放多个值;
  2)、Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似);
  3)、与大部分编程语言类似,数组元素的下标由 0 开始;
  4)、Shell 数组用括号来表示,元素用"空格"符号分割开;

定义数组语法格式如下:
array_name=(value1 value2 ... valuen)


定义数组实例:

my_array=(A B "C" D)

 

也可以使用数字下标来定义数组:

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

 

读取数组元素值的一般格式是:

${array_name[index]}

 

完整实例:

#!/bin/bash

my_array=(A B "C" D)

echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

 

获取数组中的所有元素:
使用 @ 或 * 可以获取数组中的所有元素,例如:

echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

 

获取数组的长度:
获取数组长度的方法与获取字符串长度的方法相同,例如:

echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"

 

关联数组
bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。
关联数组使用 declare 命令来声明,语法格式如下:

declare -A array_name

-A 选项就是用于声明一个关联数组。

关联数组的键是唯一的。
以下实例我们创建一个关联数组 site,并创建不同的键值:

declare -A site=(["google"]="www.google.com" ["runoob"]="www.runoob.com" ["taobao"]="www.taobao.com")

 

我们也可以先声明一个关联数组,然后再设置键和值:

declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

echo ${site["runoob"]}

 

posted on 2022-10-18 09:58  tengq  阅读(87)  评论(0编辑  收藏  举报

导航