Shell 编程

shell基础说明

shell是什么?

shell是Linux下的命令解析器,用来操作和沟通Unix/Linux的桥梁!简单的脚本语言,用于执行常用的且重复的业务逻辑,配合crontab定时任务来完成具体事项,比如:定时备份,日志分割等

为什么学习shell?

个人理解用于解决重复性的工作

第一个shell脚本程序!

helloWorld.sh
#!/bin/bash
echo "Hello World!"

语法规则

注释

 单行注释 #
 多行注释 :<<!
            注释内容
            !

固定的开头

常见的开头有 首行代表的是将要用什么shell执行脚本文件
*  /bin/bash  最常见的 推荐
*  /bin/sh
*  /usr/bin/env bash 通过env命令将bash执行环境设置为bash
*  /usr/bin/bash

shell 执行方式

hello.sh
* . hello.sh  
* bash hello.sh  bash 就是shell脚本中指定的运行环境
* chmod +x hello.sh 
    ./hello.sh
三种方式执行

shell变量

分为环境变量和用户自定义变量
查看已有的变量 
set  查看所有的系统变量包括函数
env  查看所有的变量
export 查看所有变量并显示定义方式,并可以将自定义变量转成系环境变量
declare 查看所有变量和函数

定义变量

变量名=值  `=`等号两边不允许有空格
删除变量 使用 `unset 变量名` unset无法删除 通过`readonly` 定义的变量
访问变量 
1 $变量名  如:$HOME
2 ${变量名} 如:${HOME} 推荐使用

将命令的返回值赋值给变量

1. result=`cat /etc/profile` 通过``反引号将命令cat的结果赋值给result 
2. result=$(cat /etc/profile) 推荐

Positional Parameters 位置参数

1. 即我们希望在执行shell脚本时可以通过外部传入参数供脚本内部使用
2. 基本语法
    2.1 ${n} n为数字,$0代表命令本身,$1 代表传入的第一个参数 n>9时使用花括号的方式访问参数 ${10}
    2.2 
        $* 将所有的参数当成一个整体,在双引号中当成字符串处理
        $@ 将每一个参数区别对待
        $# 所有参数的个数

预定义变量

$$ 当前进程的进程号pid
$! 以守护进程方式运行的最后一个进程号
$? 判断上一个进程是否执行成功 成功返回 0

运算符

1 $((m+n)) 加号`+`两边不允许有空格
2 $[m+n] 推荐使用
3 expr m + n 加号`+`两边必须有空格

条件表达式

[ condition ] condition 两边必须有空格, 正确返回true
常用的判断
    = 字符串判断是否相等
    == 字符串判断是否相等
    -lt 小于 less than
    -le 小于等于 less than equal
    -eq 等于 equal
    -gt 大于 greater than
    -ge 大于等于 greater than equal
    -ne 不等于 not equal
    != 字符不等于
    -r 判断文件或目录 读权限
    -w 判断文件或目录 写权限
    -x 判断文件或目录 执行权限
    -a file  如果 file 存在则为真。
    -b file  如果 file 存在且为块设备则为真。
    -c file  如果 file 存在且为字符设备则为真。
    -d file  如果 file 存在且是一个目录则为真。
    -e file  如果 file 存在则为真。
    -f file  如果 file 存在且为普通文件则为真。
    -g file  如果 file 存在且是设置组ID的 (sgid) 则为真。
    -h file  如果 file 存在且为符号链接则为真。
    -k file  如果 file 存在且设置了 ``sticky'' 位 (粘滞位) 则为真。
    -p file  如果 file 存在且是一个命名管道 (FIFO) 则为真。
    -r file  如果 file 存在且可读则为真。
    -s file  如果 file 存在且大小大于零则为真。
    -t fd  如果文件描述符 fd 是打开的且对应一个终端则为真。
    -u file  如果 file 存在且是设置用户ID的 (suid) 则为真。
    -w file  如果 file 存在且可写则为真。
    -x file  如果 file 存在且可执行则为真。
    -O file  如果 file 存在且为有效用户ID所拥有则为真。
    -G file  如果 file 存在且为有效组ID所拥有则为真。
    -L file  如果 file 存在且为符号链接则为真。
    -S file  如果 file 存在且为套接字则为真。
    -N file  如果 file 存在且上次读取后被修改过则为真。
    file1 -nt file2  如果 file1 比 file2 要新 (根据修改日期),或者 如果 file1 存在而 file2 不存在,则为真。
    file1 -ot file2  如果 file1 比 file2 更旧,或者 如果 file1 不存在而 file2 存在,则为真。
    file1 -ef file2 如果 file1 和 file2 指的是相同的设备和 inode 号则为真。
    -o optname 如果启用了 shell 选项 optname 则为真。参见下面对内建命令 set 的 -o 选项的描述中的选项列表。
    -z string 如果 string 的长度为 0 则为真。
    -n string  string 如果 string 的长度非 0 则为真。
    string1 == string2  如果字符串相等则为真。= 可以用于使用 == 的场合来兼容 POSIX 规范。
    string1 != string2 如果字符串不相等则为真。
    string1 < string2  如果 string1 在当前语言环境的字典顺序中排在 string2 之前则为真。
    string1 > string2  如果 string1 在当前语言环境的字典顺序中排在 string2 之后则为真。
    arg1 OP arg2
        OP 是 -eq, -ne, -lt, -le, -gt, 或 -ge 之一。这些算术二进制操作返回真,如果 arg1 与 arg2 分别是 相等,不等,小于,小于或等于,大于,大于或等于关系。 Arg1 和 arg2 可以是正/负整数。

流程控制字和循环控制

    for name [ in word ] ; do list ; done
        in 之后的一系列词会被扩展,产生一个项目列表。变量 name 被依次赋以这个列表中的每个元素, 序列 list 每次都被执行。如果 in word 被忽略,那么 for 命令遍历 已设置的位置参数(positional parameter,参见下面的 PARAMETERS 参数), 为每一个执行一次序列 list。 返回值是最后一个命令的返回值。如果 in 之后的词扩展的结果是空列表,就不会执行任何命令,返回值是 0。
    for (( expr1 ; expr2 ; expr3 )) ; do list ; done
        首先,算术表达式 expr1 被根据下面 算术求值(ARITHMETICEVALUATION)“ 中的规则进行求值。 然后算术表达式 expr2 被循环求值,直到它等于 0。每次 expr2 结果非零时,序列 list 都被执行, 算术表达式 expr3 被求值。如果任何表达式被忽略,将被视为执行结果是 1。 返回值是序列 list 中被执行的最后一个命令的返回值;或者是 false,如果任何表达式非法的话。
    select name [ in word ] ; do list ; done
        in 之后的一系列词会被扩展,产生一个项目列表。这个扩展后的词集合被输出到标准错误上,每个前面 加上一个数字。如果 in word 被忽略,将输出位置参数 (参见下面的 PARAMETERS 参数 章节)。 PS3 提示符将被显示出来,等待从标准输入得到一行输入。如果 输入是一个数字且显示中有对应的词,那么变量 name 的值将设置为这个词。如果输入一个空行,那么词和提示符将再次显示出来。如果读入了一个 EOF,命令就结束。 任何其他值将设置变量 name 为空。读入的行保存为变量 REPLY. 序列 list 在每次选择之后都会执行,直到执行了一个 break 命令。 select 的退出状态是序列 list 中执行的最后一个命令的退出状态,如果没有执行命令就是 0。
    case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
        case 命令首先扩展 word, 然后依次试着用每个 pattern 来匹配它, 使用与路径扩展相同的匹配规则(参见下面的 Pathname Expansion 路径扩展 章节)。如果找到一个匹配,相应的序列将被执行。找到一个匹配之后,不会再尝试其后的匹配。 如果没有模式可以匹配,返回值是 0。否则,返回序列中最后执行的命令的返回值。
    if list; then list; [ elif list; then list; ] ... [ else list; ] fi
        序列 if list 被执行。如果退出状态是 0,then list 将被执行。否则,每个 elif 将被一次执行,如果退出状态是 0,相应的 then list 将被执行,命令结束。 否则,else list 将被执行,如果存在的话。 退出状态是最后执行的命令的退出状态,或者是 0,如果所有条件都不满足。
    while list; do list; done
    until list; do list; done
        while 命令不断地执行序列 do list,直到序列中最后一个命令返回 0。 until 命令和 while 命令等价,除了对条件的测试恰好相反;序列 do list 执行直到序列中最后一个命令返回非零状态值。 while 和 until 命令的退出状态是序列 do list 中最后一个命令的退出状态, 或者是 0,如果没有执行任何命令。
    [ function ] name () { list; }
        这样可以定义一个名为 name 的函数。函数体 body 是包含在 { 和 } 之间的命令序列 list。 在指定将 name 作为一个命令运行的场合,这个序列将被执行。 函数的退出状态是函数体最后执行的命令的退出状态(参见下面的 FUNCTIONS 函数 章节)。

转载于:https://my.oschina.net/u/3054299/blog/1941503

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值