首页 > 代码库 > 6,bash入门,for 循环, 编写最简单的脚本

6,bash入门,for 循环, 编写最简单的脚本

    shell 是 一种 控制系统的脚本语言, bash 是 shell语言 的 解释器 中 的 一种,也是 Linux 上 最流行的 的 一种, 不过 shell解释器 有 很多种, 而且 每一种 都有 自己 的 特色, 不 是 完全 一样 的。。,   

    常见shell:

        sh、csh、tcsh、bash、ksh、dash、zsh


bash 常用快捷键:

    Ctrl+a:    跳转命令行首

    Ctrl+e:    跳转命令行尾

    Ctrl+u:    删除命令行首至当前光标所在处的内容

    Ctrl+k:     删除当前光标所有处至命令行尾的内容

    Ctrl+l:     清屏,相当于clear命令

    Ctrl+c:     取消或终止

    Ctrl+z:     将当前命令送至后台执行

bash 命令补全

    按 "tab" 键 可 进行 命令 补全, 连按 两下 可 显示 命令 补全 列表, 这个 还是 很方便 的


编写脚本,执行脚本:

    bash 脚本 是 以 “#! /bin/bash” 开头 的,  因为 bash 脚本 是 一种 解释型 语言, 脚本 运行 时 需要 调用 解释器 来 执行 代码, "#!" 是 告诉 内核 这是 一个 脚本 文件, 后面 跟着 的 是 脚本 解释器 的 路径, 内核 会 调用 这个 解释器 去 执行 脚本。


练习 : 写 第一个 脚本 并 运行, 输出 一句 Hello word!

这里 习惯 使用 vim 编辑器, 所以 就 用 vim 的 了, 不会的 也 可以 用 nano, 脚本文件 应该 以 ‘ .sh ’ 作为 结尾, 这个 说明 他 是一个 脚本。。,  其实 以 普通 文件 写 脚本 一样 也是 可以 运行 的, 不过 可以运行 的 普通文件 一般会是 编译好了的二进制程序,所以 还是 以 ‘ .sh ’ 结尾 把, 这个 是 大家 默认 的。

wKiom1RSQD_QfiU2AABYiF_aeoU553.jpg

大概 就这样 了, 简单 把, 这里 的 ‘#’号 是 代表 注释 的 意思, ‘#’ 号 后面 的 一句话 是 不会被 执行 的, 只有 ‘#!’ 和在一起 才表示 这是一个 脚本, 会被 内核 调用 bash解释器 执行 的。


wKiom1RSQbWweIGKAAA5uRrl-Bs155.jpg

这个就是我编写的脚本 a.sh ,首先检查一下脚本有没有语法错误


wKioL1RSQnSQQNP4AAAvO-baTK0368.jpg

ok, 没有 显示 任何 信息, 说明 脚本 没有 错误, 执行 脚本, 这里 有 两种 方法可以 执行


方法1:    直接调用 bash解释器 去 解释 脚本

wKioL1RSQxvAhC7kAAA0BrNkUiI102.jpg


方法2:    给脚本添加一个可执行权限, 就可以直接执行脚本了, 不过 这里 需要 给出 脚本 的 准确 路径, 不过 可以 通过修改 PATH 文件, 这样 脚本 就可以 像 命令 一样 执行 了。

wKioL1RSRATASdQ7AAFn3t0u22E909.jpg

这里 我 自己 添加 了 一个 ‘./‘ 目录, 这样 就 可以 直接 执行 这个 脚本 了。。


bash 变量:      有几种: 本地变量,局部变量,环境变量,特殊变量,位置变量

1、本地变量:只对当前 shell 进程 有效,对其 子 shell 以及 其他 shell 都 无效

        定义变量: [set]Var_Name="Value" ,set 是 定义 本地变量 的 关键字, 可省略 的默认定义 的 变两个 就是 本地变量

        引用变量: ${Var_Name}, 这里的 大括号 大多数情况 可以 省略

        撤销变量: unset Var_Name

        显示变量: 直接执行 set 可以 显示 所有 本地变量

2、局部变量:   这个 应该 和 函数 有关 把, 这里 先不管 他。

        定义变量:   local Var_Name="Value"

3、环境变量:

        定义变量:   export Var_Name="Value"

        显示环境变量:     export, env, printenv 这三个 命令 都 可以 显示 环境变量,

4、位置变量

        $1, ... , $n

        这个 是 脚本 输入 的 参数, 各个 参数 之间 是 以 空格 分隔 的, $1 就 表示 脚本 的 第一个 参数

5、特殊变量

        $0    脚本名称, 这个和变量位置差不多吧。

        $?    上一条命令的执行状态, 

                    0表示 成功

                    1-255 失败。。

        $#    查看命令之后有几个参数

 后面 三个 不知道。。, 老师 没讲, 用到的 时候 再说 把。

        $$      

        $!

        $*   

wKioL1RSTN2SPG8kAABOMOVZEWE716.jpg

wKiom1RSTITi0lvRAABU7dAFVPU423.jpg

ok, 写了个 脚本 测试 一下 特殊变量 和 位置 变量, 大概 就 这样 了。。


bash配置文件

    bash 启动 是 会 自动 执行 配置 文件 里面 的 一些 脚本, 用于 设置 一些 永久 的 属性信息

        1 profile类: 为交互式登录的用户提供配置,登录系统时只执行一次,一会再运行bash会执行 了

                /etc/profile  :  对所有用户有效,一般用于管理员修改一些最基本的信息

                /etc/profile.d/*.sh   : 对所有用户有效, 这个 文件夹 下 的 .sh 文件 都会                                     被 执行,用于 设置一些软件的配置 之类 的

                ~/.bash_profile   :个人家目录下也有 一个 这样 的 配置文件, 不过 是隐藏的

        bashrc类: 非交互式登录用户提供配置

       /etc/bashrc: 全局

~/.bashrc: 个人配置

通知shell重新读取配置文件: source FILE, 如 source .bashrc 之类 的。

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

系统启动时 配置文件读取顺序:

交互式登录用户:

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc


非交互式登录用户:

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh


变量的命名要求:

只能使用数字、字母和下划线组成;

不能以数字开头;

不能使用程序中的关键字;

见名知义;totalWeight 


for循环:

这个是shell脚本中最常用的循环结构, 其他 还有 两个循环结构, 分别是 while 和 until, 不过 这里 直说 for 循环。


语法:

for循环:

for var_Name in 列表; do

语句1

语句2

...

done


大概 语句结构 就是 这个 样子 了, 其中 var_Name 表示 变量, in 后面 跟着 的 是一个 列表, for循环 就是 遍历 这个 列表 的, 列表 后面 有 一个 ‘;‘, 这个 是 shell 中 的 语句分隔符, 后面 的 do 就是 另外 一个 语句 了, 也可 以 把 do 另起一行, 这样 就 可以 省略 ‘;‘ 了, 如:

例1:

        for I in 1 2 3 4 5 6 7 8 9

        do

                echo $I

        done

说下 这个 例子 把。 

第一行, for 关键字 代表 这 是一个 循环 语句, 之后 的 I 是 一个 变量, 然后 in 表示 这个 变量 的 范围, 后面 是 一个 列表, 意思 就是 I 变量 要 在 这个 列表 的 范围 内, 

第二行,  do 开始 执行 循环体 的 意思,

第三行, done 表示 循环 结束


wKiom1RZ7oWDKxb5AABjSql2DmI857.jpg

wKioL1RZ7uijxXG2AABbD6pSIOw527.jpg


ok, 下面 说 一下 怎样 生成 列表 把, 这样 手动 写 列表 也是 很不爽 的 哈。


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

生成列表:

1 、 {1..9}  花括号 生成, 这个 表示 生成 列表 1 到 9,继续改一下上个脚本把。

wKioL1RZ8LnxOMSXAABj4cLJKfY222.jpg

wKioL1RZ8LmT_V3bAABZcZ-kmuQ341.jpg

这样 看 上去 是不是 简单 多 了 啊。


2、 使用 关键字 seq 生成 列表,  语法 格式 为   seq 1 [步长] 9, 这里 也是 生成 1 到 9 , 中间 那个 步长 是 可以 省略 的, 步长 的 意思 是 每一步 的 长度,  

如 seq 1 2 9 表示 1 3 5 7 9, 每次 都是 上一次 生成 的 数字 加上 步长

wKiom1RZ8a6TiEwCAABU5mDoUN8439.jpg

wKioL1RZ8hCjWybbAABjhSYTS0c415.jpg


seq 还有 几个 选项, 不过 不太常用。。

        -s ‘字符‘, 这个 是 设定 分隔符, 默认 为 ‘\n‘ 的, 大概 能 用得着 的 就是 这个 了

                这里 注意, 要 用 单个 字符 哦, 用 字符串 会 出现 另外 一种 情况 的, 

        -f 这个 才是 可以 匹配 字符串 的 选项, 如图:

wKioL1RZ9WKSGXsqAAC18LTdYYg850.jpg

这个 第三个 语句 也 可以 执行, 但 他 是 以 字符串 来 分隔 数字 的, 可能 不是 我们 要 表达 的 意思 把。 seq 用法 还有 一些, 这里 就 不多说 了, 。。


3、 说一下 列表 除了 手写 之外, ls 之类 的 命令 也是 可以 生成 列表 的,不用 要用 `` 把 命令 引起来, 这个 都懂 把, 前面 有 说过 的。 

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

写 一个 小 脚本 把, 都 说 这么 多 了, ..

添加100个用户, user1 到 user 100, 将 用户 的 密码 设置 为 111111

wKiom1RZ96CCud8rAACNsevKfVk481.jpg

就 是 这个 了, passwd 命令 这个 都 没忘记 把, 反正 我 是 没有, 其实 马哥 领着 我们 练习 了好多 习题 的, 不过 这里 我 就 说了 几个, 练习 还是 少 啊, 多练 多敲 才是 王道, 没有 任何 捷径 的。。。。


本文出自 “宁静淡泊” 博客,请务必保留此出处http://vrgfff.blog.51cto.com/6682480/1572455

6,bash入门,for 循环, 编写最简单的脚本