Shell 脚本实践

10 篇文章 0 订阅
2 篇文章 0 订阅

Shell 脚本实践


Shell 用 C 语言编写的程序,既是一种命令行语言,又是一种程序设计语言,用 shell 编写的称为脚本程序(Shell Script)

两种运行方法:

1、作为可执行程序

chmod +x ./test.sh
./test.sh

2、作为解释器参数

sh test.sh

Shell 变量

  • 变量名不加 $ ,且变量名与等号间不能有空格

  • 变量名不能有空格,不能用标点,不能用 bash 关键字

  • 可以用语句给变量赋值

    for file in `ls /etc`
    

    遍历 etc 中的文件

  • 使用变量,只需要在变量名前添加 $ ,加花括号可以帮助解释器识别变量名

    echo "Hello, ${name}!"
    
  • 已经定义的变量可以被重新赋值

    myUrl="http://www.baidu.com"
    myUrl="http://www.google.com"
    
  • 可以声明只读变量

    readonly myUrl
    
  • 删除变量

    unset myUrl
    

Shell 字符串

  • 单引号字符串:任何单引号内的字符串都会原样输出,变量无效

  • 双引号字符串:可以在双引号字符串中输出变量,同时也可以存在转义字符

  • 拼接字符串

    echo $a $b
    # hello loch hello cgg
    echo $a$b
    # hello lochhello cgg
    echo $a + $b
    # hello loch + hello cgg
    
  • 获取字符串长度

    echo ${#a}
    # 10 ("hello loch").length
    
  • 提取字符串

    echo ${a:1:4}
    # 从第二个字符开始提取四个字符
    
  • 查找字符

    echo `expr index "a" is`
    # error: expr syntax error
    

Shell 数组

  • 只支持一维数组

    array_name=(value0 value1 value2 value3)
    
    # or
    
    array_name=(
    value0
    value1
    value2
    )
    
    # or
    
    arra_name[0]=value0
    
  • 读取数组

    $(array_name[0])
    
  • 获取数组长度

    echo ${#array_name[@]}
    # 3
    echo ${#array_name[*]}
    

脚本传参

我们可以在执行脚本时,传递参数,脚本内获取参数的格式为:

$n
# n 为脚本参数的顺序,从1开始
# $0 为当前执行的文件名
特殊参数说明
$#传递的参数个数
$*将所有参数输出为一个字符串
$$输出脚本当前运行的进程 ID
$!后台运行的最后一个进程的 ID,测试失败,返回空
$@所有参数的数组引用
$-显示 Shell 使用的当前选项,与set命令功能相同
$?显示最后的命令退出状态,0表示没错误

# @ 的区别
for i in “ ;doecho i
done

# 1 2 3

for i in "$@"; do 
    echo $i
done 
# 循环体执行了3次

Shell 运算符

  • 算数运算符

    原生 bash 不支持简单的数学运算,需要借助 expr

    expr 是一款表达式计算工具,可以完成表达式的求值

    val=`expr 2 + 2`
    

    注意:表达式和运算符之间要有空格,2+2不会执行加法运算,而是作为字符串存在;只能进行整数运算

    运算符举例
    +,-,*,/,%`expr a+ b`
    =b=$a
    ==if[ a== b]
    !=if[ a!= b]

    注意:*前必须添加反斜杠 \ 才能进行乘法运算

  • 关系运算符

    注意:关系运算只支持数字,或者值为数字的字符串,空格很必要

    运算符说明举例
    -eq是否相等[ aeq b ]
    -ne是否不等[ ane b ]
    -gt是否左大于右[ agt b ]
    -lt是否左小于右[ alt b ]
    -ge是否左大于等于右[ age b ]
    -le是否左小于等于右[ ale b ]
  • 布尔运算符

    注意:布尔运算符的成员为布尔值或值为布尔类型的表达式

    运算符说明举例
    ![ !false ]
    !与false之间没有空格
    -o[ alt20o b -gt 100 ]
    -a类比上面的或
  • 逻辑运算符

    && 与
    || 或

    与布尔运算符有什么区别。。

  • 字符串运算符

    运算符说明举例
    =是否相等[ a= b ]
    !=是否不等[ a!= b ]
    -z是否长度为 0[ -z $a ]
    -n是否长度不为 0[ -n $a ]
    str是否不为空[ $a ]
  • 文件测试运算符

    操作符说明
    -b file是否为块设备文件
    Linux秉承一切都是文件的设计思想,将所有的块设备也看成文件,通常存放在/dev目录下,磁盘是常见块设备
    -c file是否是字符设备文件
    键盘和打印机是常见的字符设备
    -d file是否是目录
    -g file是否设置了 SGID 位
    chmod g+s filename
    -k file是否设置了 SBIT 位
    -p file是否是有名管道
    -u file是否设置了 SUID 位
    -r file是否可读
    -w file是否可写
    -x file是否可执行
    -s file是否为空
    -e file是否存在

Shell echo

echo "Hello World"
echo Hello World
echo "\"Hello World"\"
echo "Hello ${name}"
echo "Hello, \n"
# 显示结果定向到文件,覆盖原文件内容或者创建新文件
echo "Hello World" > myfile
# 显示命令执行结果
echo `date`

Shell printf

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

printf 没有自动换行,需要手动添加 \n

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 自超 男 90.1234
# 姓名    性别    体重kg
# 自超    男      90.12

%-10s 表示一个宽度为10个字符的左对齐的字符串,-表示左对齐,没有-表示默认右对齐,如果超过10个字符,也会显示,但是格式会被打乱

%-4.2f 表示浮点数,保留两个小数

%c 表示单个字符

%d 表示整数

转义序列说明
\a警告字符
\b后退
\f换页
\n换行
\r回车
\t水平制表符
\v垂直制表符
\反斜杠 \
\ddd表示1到3位的八进制字符
\0ddd表示1到3位的八进制字符

流程控制

shell 的流程控制分支不能为空

  • if 语句

    # 写法1
    if [condition]
    then 
        command1
        ...
    fi
    
    # 写法2
    if [condition]; then command1; fi
    
    # 写法3
    if [condition]
    then 
        command1
    else 
        command2
    fi
    
    # 写法4
    if [condition1] 
    then 
        command1
    elif [condition2]
    then 
        command2
    else 
        command3
    fi
    
  • for 循环

    for var in item1 item2 ... 
    do 
        command1
        ...
    done
    

    通过 $var 变量名来获取当前循环过程的值

  • while 循环

    while [condition]
    do
        command1
    done
    # while 可以读取键盘信息
    while read FILM
    do 
        echo $FILM
    done
    
  • until 循环

    until [condition]
    do
        command1
    done
    

    虽然 until 在前,但是每次判断在循环末尾,所以循环体至少会执行一次

  • case 多选语句

    case val in
    mode1)
        command1
        ;;
    mode2)
        command2
        ;;
    *)
        defaultCommand
        ;;
    esac
    

    *) 为 default 默认执行项

  • break 和 continue

    break 结束循环

    continue 提前结束当前循环,进入下一次循环


Shell 函数

函数定义通用格式

[ function ] funname [()]
{
    action;
    [return int;]
}
# []中为可选项

demoFun(){
    echo 'test func'
}
demoFun
echo $?
# $? == 0

注意:所有函数必须先定义后调用
$?为函数返回值的调用

获取函数参数, 1, 2,,,,当 n>=10 时,${n}来获取参数

特殊参数说明
$#传递到函数的参数个数
$*以单字符串显示连接显示所有参数
$@使用时用引号包裹,返回可遍历的参数列表

输入输出重定向

输入重定向

read FILM < hello
echo $FILM
# 获取 hello 文件中的内容,并输出到终端

输出重定向

echo 'test' > hello
# 将本要输出到终端的 'test' 输出到 hello 文件中,覆盖 hello 中原有的内容
定向符说明
command > file重定向输出覆盖
command < file重定向从文件获取输入
command >> file重定向输出追加
n > file将文件描述符为 n 的文件重定向到 file
n >> file追加
n >& m将输出文件 m n 合并
n <& m将输入文件 m n 合并

文件描述符 0 表示标准输入 STDIN
1 表示标准输出 STDOUT
2 表示标准错误输出 STDERR


文件引用

#!/bin/bash
#
. ./CONFIG.sh

# 引入了 CONFIG.sh 后,可以使用在 CONFIG 中定义的变量和函数

**

前行的路上,感谢您的鼓励!!

**

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言 10 场景说明 11 基础知识简介 14 Linux 14 Linux产生与发展 14 Linux特点和优势 15 Shell 16 Shell脚本语言与编译型语言的差异 17 Shell分类 18 Shell使用 19 项目一 初识Linux Shell 20 [学习目标] 20 任务1.1 构建开发环境 22 任务1.2 vi/vim编辑器 33 1.2.1 vim使用实例 34 1.2.2 vim按键说明 36 任务1.3 Shell常用命令 41 1.3.1 基础命令 41 1.3.2 文件、目录操作命令 42 1.3.3 系统管理命令 52 1.3.4 关机/重启/退出 53 1.3.5 安装操作命令 53 1.3.6 用户操作命令 54 1.3.7 网络下载命令 55 1.3.8 服务操作命令 57 任务1.4 Shell脚本 58 1.4.1 第一个shell脚本:Hello World 58 1.4.2 脚本介绍 59 1.4.3 shell程序结构 59 1.4.4 shell脚本运行 60 任务1.5 Shell案例:打印有色彩的文本 61 任务1.6 Shell案例:图案打印 62 练习(每题10分,共计100分) 66 项目二 Shell变量 67 [学习目标] 67 任务2.1 Linux环境变量 68 2.1.1 查看环境变量 69 任务2.2 Shell变量 70 2.2.1 定义变量 70 2.2.2 使用变量 70 2.2.3 只读变量 71 2.2.4 删除变量 72 任务2.3 特殊符号 72 任务2.4 Shell案例:显示系统信息: 78 练习(每题12.5分,共计100分) 80 项目三 Shell传递参数 81 [学习目标] 81 任务3.1 Shell传递参数 82 任务3.2 Shell案例:参数比较 85 任务3.3Shell案例:通过参数描述变量 86 练习(前两题每题30分,第三题40分,共计100分) 87 项目四 Shell数组 89 [学习目标] 89 任务4.1 定义数组 90 任务4.2 使用数组 90 任务4.3 Shell案例:数组的使用 92 练习(100分) 95 项目五 Shell运算符 96 [学习目标] 96 任务5.1 Shell基本运算符 97 5.1.1 运算符 97 5.1.2 算术运算符 97 5.1.3 关系运算符 99 5.1.4 布尔运算符 101 5.1.5 逻辑运算符 103 5.1.6 字符串运算符 104 5.1.7 文件测试运算符 106 任务5.2 Shell案例:计算器 109 练习(每题25分,共计100分) 111 项目六 Shell命令输出 112 [学习目标] 112 任务6.1 Shell echo命令 113 任务6.2 Shell printf命令 116 任务6.3 Shell test命令 119 任务6.4 Shell案例:查看系统资源使用情况 122 练习(每题20分,共计100分) 125 项目七 Shell流程控制 126 [学习目标] 126 任务7.1 Shell流程控制 127 7.1.1 if 判断语句 127 7.1.2 for 循环语句 130 7.1.3 while 循环语句 131 7.1.4 until 循环语句 134 7.1.5 case多选语句 135 7.1.6 跳出循环体 137 任务7.2 Shell案例:重复执行命令和简单计算器 139 任务7.3 Shell案例:使用三种循环结构打印九九乘法表 141 练习(前两题每题30分,第三题40分,共计100分) 144 项目八 Shell函数 146 [学习目标] 146 任务8.1 Shell函数 147 8.1.1 Shell中函数的定义 147 8.1.2 函数参数 150 任务8.2 Shell案例 151 8.2.1 指定多个文件的行数 151 8.2.2 当前目录的所有文件 153 练习(每题50分,共计100分) 156 项目九 Shell输入/输出重定向 158 [学习目标] 158 任务9.1 linux文件描述符 159 任务9.2 Shell输入/输出重定向 160 9.2.1 输出重定向 160 9.2.2 输入重定向 163 9.2.3 重定向深入讲解 164 任务9.2 Shell案例:通过重定向测试批量添加ip 166 练习(每题25分,共计100分) 169 项目十 Shell文件包含 171 [学习目标] 171 任务10.1 Shell文件包含 172 任务10.2 Shell案例:查找最大文件 172 练习(每题50分,共计100分) 174 项目十一 Shell文本处理命令 175 [学习目标] 175 任务11.1 学习和使用grep 176 任务11.2 学习和使用sed 179 任务11.3 学习和使用cut 183 任务11.4 学习和使用awk 185 练习(第一题10分,第2-7每题15分,共计100分) 188 项目十二 Shell的调试 189 [学习目标] 189 任务12.1 使用trap命令 190 任务12.2 使用tee命令 192 任务12.3 使用“调试钩子” 193 任务12.4 使用Shell的执行选项 194 练习(每题50分,共计100分) 196 项目十三 Shell综合案例一(lnmp+wordpress) 197 [学习目标] 197 任务13.1 手动安装Linux Nginx Mysql PHP和WordPress 198 13.1.1 准备工作 198 13.1.2 安装Mysql5.6.29 199 13.1.3 安装PHP5.5.12 202 13.1.4 安装Nginx1.10 205 13.1.5 安装WordPress 206 13.1.6 启动网页 207 任务13.2 脚本安装Linux Nginx Mysql PHP 和WordPress 207 13.2.1 初始化安装脚本编写 207 13.2.2 Mysql安装脚本的编写 209 13.2.3 PHP安装脚本的编写 211 13.2.4 Nginx安装脚本的编写 213 13.2.5 WordPress安装脚本的编写 214 13.2.6 验证wordpress 216 练习(每题50分,共计100分) 218 项目十四 shell综合案例二(安装Openstack) 219 [学习目标] 219 任务14.1 手动安装Openstack 220 什么是Openstack 220 14.1.1基本环境准备 222 14.1.2 安装mysql数据库服务 225 14.1.3 安装keystone认证服务 226 14.1.4 安装glance镜像服务 230 14.1.5 安装nova计算服务 233 14.1.6 安装neutron网络服务 238 14.1.7 安装dashboard服务 248 任务14.2 脚本安装openstack 250 14.2.1 基本环境脚本的编写 255 14.2.2 mysql脚本的编写 256 14.2.3 keystone脚本的编写 258 14.2.4 glance脚本的编写 263 14.2.5 nova脚本的编写 266 14.2.6 neutron脚本的编写 270 14.2.7 dashboard脚本的编写 279 14.2.8 验证登录,使用openstack 280 附录Shell编码规范说明 295 1. 什么时候使用shell 295 2.Shell文件和解释器调用 295 3.环境 296 4.注释 296 5.格式 298 6.特性及错误 304 7.命名转换 308 8.调用命令 311

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值