文章标题

来源:互联网 发布:unity3d vuforia 编辑:程序博客网 时间:2024/05/23 17:17

注:清空日志的两种方式
1. cat /dev/null > test.log
2. > test.log

什么是shell?
shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统输出结果,输出到屏幕返回给用户。

什么是shell脚本?
当命令或语句不在命令行执行,而是通过一个程序文件执行时,该程序就被称为一个shell脚本或者shell程序。shell程序很类似DOS系统下的批处理程序(*.bat)。用户可以在shell脚本中敲入一系列的命令或命令语句。这些命令、变量和流程控制语句等有机的结合起来就形成了一个功能强大的shell脚本

shell中 && 和 || 的使用方法:
&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”
||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。

Shell脚本语言的种类
在Unix/Linux中主要有两大类的shell:
*Bourne shell(包括sh,ksh and bash)
*C shell(包括 csh and tcsh)
Shell脚本是弱类型语言,而其中Bourne shell(sh) 已经被bash shell 取代

1.1 Shell脚本的建立
shell 脚本 (bash shell)程序通常是在编辑器(如vi/vim)中编写,由Unix/Linux命令、bash shell命令、程序结构控制语句和注释等内容组成
脚本开头(第一行)
一个规范的shell脚本第一行会指出由哪个程序(解释器)来执行脚本中的内容,在linux bash编程一般为:

!/bin/bash

!/bin/sh

“#!”又称为幻数,在执行bash脚本的时候,内核会根据它来确定该用哪个程序来解释脚本中的内容。这一行必须在脚本顶端的第一行,如果不是第一行则为注释。
如果脚本的开头不指定解释器,那么,就要用对应的解释器来执行脚本,例如:
bash test.sh
python test.py

1.2 Shell脚本的执行
当shell脚本以非交互的方式运行时,它会先查找环境变量ENV,该变量指定了一个环境文件(通常是.bashrc),然后从该环境变量文件开始执行,读取了ENV文件后,SHELL才开始执行shell脚本中的内容。
Shell脚本的执行通常可以采用以下三种方式:
(1).bash srcipt-name 或 sh script-name(推荐使用)
(2).path/script-name 或 ./script-name(当前路径下执行脚本)
(3).source script-name 或 .script-name #–>注意“.”号
执行说明:
第一种方法是当脚本文件本身没有可执行权限(即文件x位为 - 号)时常使用的方法里推荐用bash执行,或者文件开头没有指定解释器,比较推荐的方法
第二种方法需要先将脚本文件的权限改为可执行(即文件加x位),具体方法 chmod o+x script-name 或 chmod 755 script-name.然后通过脚本路径就可以直接执行脚本了
第三种方法通常是使用source或者“ . ”号读入或加载指定的shell脚本文件 ,然后依次执行指定shell脚本文件son.sh(子shell)中的所有语句。这些语句将作为父shell脚本father.sh进程的一部分运行。
1.3 Shell脚本开发基本规范及习惯
(1). 开头指定脚本解释器

!/bin/sh 或 #!/bin/bash

(2). 开头加版本版权等信息

Date : 21:45 2017-04-11

Author : Created by dingwei

Mail : dwlovelife@126.com

Function : This scripts function is ……

提示: 可配置vim 编辑文件时,自动加上以上信息,方法是修改~./vimrc配置文件。  (3).  脚本中不用中文注释

尽量使用英文注释,防止本机或者切换系统环境后中文乱码的困扰

1.4 Shell变量
变量类型:
变量可分为两类: 环境变量(全局变量) 和 局部变量
环境变量也可称为全局变量,可以在创建他们的shell及其派生出来的任意子进程shell中使用。局部变量只能在创建他们的shell函数或脚本中使用。

环境变量:
环境变量用于定义Shell的运行环境,所有的环境变量都是系统全局变量,可用于所有子进程中,包括编辑器、shell脚本和各类应用
环境变量可以在命令行中设置,但用户退出时这些变量值也会丢失,因此最好在用户家目录下的.bash_profile 文件中或全局配置/etc/bashrc , /etc/profile 文件或者 /etc/profile.d/中定义,将环境变量放入profile文件中,每次用户登录时这些变量值都将被初始化
传统上,所有环境变量均为大写,环境变量应用于用户进程前,必须用export命令导出。
有一些环境变量,比如HOME , PATH , SHELL , UID , USER等,在用户登录之前就已经被/bin/login 程序设置好了。 通常环境变量定义并保存在用户家目录下的 .bash_profile文件中
常用设置的环境变量: TMOUT=3600 (退出前等待超时的秒数) HISTSIZE=50 (记录在命令行历史文件中的命令行数)

设置环境变量:
如果想设置环境变量,就要给变量赋值之后或设置变量时用export命令导出。
格式:
(1) export 变量名=value
(2) 变量名=value; export 变量名
例: export NAME=dingwei
或 NAME=dingwei;export NAME

    自定义环境变量生产环境 java环境配置实例: 

export JAVA_HOME=/application/jdk
export CLASSPATH=CLASSPATH:JAVA_HOME/lib:$JAVA_HOME/jre/lib
放在: /etc/profile

局部变量:
(1). 定义本地变量:
普通字符串变量定义
变量名=value
变量名=’value’
变量名=”value”

习惯: 数字不加引号,其他默认加双引号

定义变量单引号、双引号与不加引号
单引号:
可以说是所见即所得 : 即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么
双引号:
把双引号内的内容输出出来: 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来
无引号:

把内容输出出来,会将含有空格的字符串视为一个整体输出,如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号

全局变量和局部变量命名
a.脚本中的全局变量定义,如DINGWEI_HOME 或 DINGWEIHOME,在变量使用时,使用 { }
将变量括起或”${DINGWEI_HOME}”
b.脚本中局部变量定义: 存在于脚本函数中的变量成为局部变量,要以local方式进行声明,使之只在本函数作用域内有效,防止变量在函数中的命名与变量外部程序中变量重名造成程序异常。
注:参考系统自带的/etc/init.d/functions

将命令作为变量值传入
例:
cmd=date +%F (反引号)
echo $cmd 结果为:2017-04-11

cmd=$(date+%F)

echo $cmd 结果为:2017-04-11

Shell特殊变量
1、 位置变量
0shelln 获取当前执行的shell脚本的第n个参数值, n=1...9 , 当 n 为 0时表示脚本的文件名,如果n大于9,用大括号括起来 10# 获取当前shell命令行中参数的总个数
$$ 获取当前shell的进程号
$? 获取上一个指令的返回值(0为成功,非0为失败) *这个变量很常用

例:


变量子串的常用操作
{#string}    返回string的长度
string:positionstring中,从位置position{string:position:length} 在string中,从位置positionlength的子串
{string#substring} 从变量string开头开始删除最短匹配substring{string##substring} 从变量stringsubstring的子串
{string%substring}从变量string结尾开始删除最短匹配substring{string%%substring} 从变量stringsubstring子串
string/substring/replace使replace,来代替第一个匹配的$substring

${value:-word} 当变量未定义或者值为空时,返回值为word内容。否则返回变量的值

man bash 变量处理大全 《—– 学习尽量找一手资料

变量的数值计算
变量的数值计算常见的有如下几个命令:

(()) 、let 、expr 、bc 、$[]

1) (())用法 (此法很常用)
执行简单的整数运算,只需将特定的算数表达式用 “(())shell((” …… “))”的语法中

提示: **为幂运算


2) let 命令的用法
格式:
let 赋值表达式
【注】let 赋值表达式功能等同于: ((赋值表达式))
范例 1: 给自变量 i 加 8


3) expr ( evaluate expressions) 命令的用法:
expr命令一般用于整数值,但也可以用于字符串,用来求表达式变量的值,同时 expr 也是一个手工命令行计算器

【注】运算符左右都有空格,使用乘号时需转义

其他特殊用法:
expr 用法 ssh-copy-id 脚本 (less /usr/bin/ssh-copy-id)
if expr “$1” : “.*.pub” : then

技巧:判断文件或字符串的扩展名小案例:

STRING : REGEXP

技巧 : 通过expr 判断变量是否为整数

其中
read命令接收标准输入(键盘)的输入,或其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中

-p 在这里你输入的变量,会在你的命令提示符下面显示

4)bc命令的用法
bc 是UNIX下的计算器,它也可以用在命令行下面:
例: 给自变量 i 加 1
i=2
i=echo $i + 1|bc ———-效率低
bc 强大的地方是因为 bc 支持科学计算


5) $[]的用法:


Shell变量的输入:
shell 变量除了可以直接赋值或脚本传参外,还可以使用 read 命令从标准输入获得。
【语法格式】
read [参数] [变量名]
【常用参数】
-p prompt:设置提示信息
-t timeout:设置输入等待时间 单位默认为秒


1.5 条件测试
测试语句
条件测试语法
在 bash 的各种流程控制结构中通常要进行各种测试,然后根据测试结构执行不同的操作,有时也会通过与 if 等条件语句相结合,使我们可以方便的完成判断
【语法说明】
格式 1: test<测试表达式>
格式 2: [<测试表达式>]
格式 3:[[<测试表达式>]]
格式1 和格式 2 是等价的
格式3 为扩展的test命令
提示:
在[[ ]] 中可以使用通配符进行模式匹配, && 、|| 、> 、<等操作符可以应用于 [[ ]] 中,但不能应用于 [ ] 中。
对整数进行关系运算,也可以使用 Shell 的算术 运算符 (( ))。
【语法例子】
格式 1: test<测试表达式>
范例 : test 测试文件

格式 2: [<测试表达式>]
范例 :

格式 3: [[<测试表达式>]]
范例: [[ ]]


文件测试操作符
在书写表达式时, 可以使用下面的文件测试操作符,以下为常用文件测试操作符号
-f 文件 若文件存在且为普通文件则为真
-d 文件 若文件存在且为目录文件则为真
-s 文件 若文件存在且不为空 (文件大小非0)则真
-r 文件 若文件存在且可读则为真
-w 文件 若文件存在且可写则为真
-x 文件 若文件存在且可执行则为真
f1 -nt f2 若文件f1 比文件 f2 新则真 nt=”new than”

f1 -ot f2 若文件f1 比文件 f2 旧则真 ot=”old than”

字符串测试操作符
字符串测试操作符的作用: 比较两个字符串是否相同、字符串长度是否为0,字符串是否为NULL
“=” 比较两个字符串是否相同, 与==等价, 如 if[ “a"="b”] ,其中 a"",,,["{a}”= “${b}”], “!=” 比较两个字符串是否相同,不同则为 “是”。
在书写测试表达式时,可以使用下面的字符串测试操作符
-z “字符串” 若串长度为 0 则为真,-z 可以理解为 zero
-n “字符串” 若串长度不为0则为真,-n 可以理解为 no zero
“串 1”= “串 2” 若串1等于串2则为真,可以使用 “==” 代替 “=”
“串 1” != “串2” 若串1 不等于串 2 则为真
特别注意,以上表格中的字符串测试操作符务必要用 ” ” 引起来

注意:判断符号两边要有空格

整数二元比较操作符
在书写测试表达式时 , 可以使用下面的整数二元比较操作符

提示:
1)“<” 符号意思是小于, if[[ “a"<"b” ]],if[ “a"\<"b” ],在单 [ ] 中需要转义,因为
shell 也用 < 和 > 重定向
2) ” >” 符号意思是大于,if[[ “a">"b” ]],if[ “a>b],[],shell<>3)=,if[[a"="b]]if[a"="$b” ] 在单 [ ] 中不需要转义

参考: less /etc/init.d/nfs

范例 1 :多文件单中括号[] 与或非测试
可用与(-a 和 &&)、 或(-o 和||)、非(!)将多个条件表达式连接起来,接着上面的变量测试。

提醒:
1.”-a” 和“-o”逻辑操作符号用于[ ] 中使用
2.“&&” 和 “||”逻辑操作符号用户[[ ]] 中使用
3. 注意括号两端,必须要有空格
范例 2 :判断条件后如何执行多条命令语句
若使用,[ 判断 ] || 命令 1 && 命令 2 && 命令 3,现在是如果前面的条件成立了,也会执行命令2和命令3
若实现
if [条件]
then
do something
else
命令 1
命令 2
命令 3
fi 要怎么做呢?



1.6 分支与循环结构
if 条件句语法说明
单分支结构

语法:

if [ 条件 ]
then
指令
fi

if [ 条件 ];then
指令
fi
提示: 分号相当于命令换行,上面两种语法等同

0 0
原创粉丝点击