shell脚本1.0

一、简介

shell两种命令执行方式:

1.交互式:单条命令执行

2.批处理:脚本(Script)

Shell脚本是解释执行的,不需要编译

tips:尽量使用普通用户账号

二、解释器

作用:用来执行脚本

1.  bash

bash是Linux标准默认的shell,由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40个。

2.   sh

sh 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。

3.  ash

占用资源少,包含24个命令,使用不便

4.  csh  

csh 是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说,csh其实就是tcsh。

5.  ksh

ksh 是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。

tips:bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。

三、特点

使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象;缺点是它们的效率通常不如编译型语言。不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成的简单脚本,同样的功能用C或C++来编写实现,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题。脚本编程语言的例子有awk、Perl、Python、Ruby与Shell。

考虑到Shell脚本的命令限制和效率问题,下列情况一般不使用Shell:

  1. 资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)。
  2. 需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理)。
  3. 有跨平台(操作系统)移植需求(一般使用C 或Java)。
  4. 复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)。
  5. 对于影响系统全局性的关键任务应用。
  6. 对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵、破解、恶意破坏等等。
  7. 项目由连串的依赖的各个部分组成。
  8. 需要大规模的文件操作。
  9. 需要多维数组的支持。
  10. 需要数据结构的支持,比如链表或数等数据结构。
  11. 需要产生或操作图形化界面 GUI。
  12. 需要直接操作系统硬件。
  13. 需要 I/O 或socket 接口。
  14. 需要使用库或者遗留下来的老代码的接口。
  15. 私人的、闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)。

四、脚本

1.  作为可执行程序

#!/bin/bash

#!约定解释器

扩展名为.sh

用./或者source执行

2.  作为解释器参数

这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:

$ /bin/sh test.sh

$ /bin/php test.php

五、shell变量

1.  定义变量:

定义变量时,变量名不加美元符号($),如:

  variableName="value"

注意,变量名和等号之间不能有空格

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

2.  使用变量

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:

  your_name="mozhiyan"

  echo $your_name

  echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界.

3.  重定义变量

已定义的变量,可以被重新定义,如:

  myUrl="http://see.xidian.edu.cn/cpp/linux/"

  echo ${myUrl}

  myUrl="http://see.xidian.edu.cn/cpp/shell/"

  echo ${myUrl}

4.  只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

5.  删除变量

使用 unset 命令可以删除变量。

  1. unset variable_name

变量被删除后不能再次使用;unset 命令不能删除只读变量。

6.  变量类型

运行shell时,会同时存在三种变量:

1) 局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行.

7.  特殊变量

Shell $0, $#, $*, [email protected], $?, $$和命令行参数

特殊变量列表
变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
[email protected] 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

$* 和 [email protected] 的区别

$* 和 [email protected] 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"[email protected]" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

六、shell变量替换

Shell变量替换,命令替换,转义字符

下面的转义字符都可以用在 echo 中:

转义字符 含义
\\ 反斜杠
\a 警报,响铃
\b 退格(删除键)
\f 换页(FF),将当前位置移到下页开头
\n 换行
\r 回车
\t 水平制表符(tab键) 
\v 垂直制表符

可以使用 echo 命令的 -E 选项禁止转义,默认也是不转义的;使用 -n 选项可以禁止插入换行符。

时间: 2024-11-05 11:54:15

shell脚本1.0的相关文章

Shell脚本中$0、$?、$!等的意义

变量说明$$ Shell本身的PID(ProcessID)$! Shell最后运行的后台Process的PID$? 最后运行的命令的结束代码(返回值)$- 使用Set命令设定的Flag一览$* 所有参数列表.如"$*"用「"」括起来的情况.以"$1 $2 … $n"的形式输出所有参数.[email protected] 所有参数列表.如"[email protected]"用「"」括起来的情况.以"$1"

Apache Hadoop 3.0.0-alpha1,重写 Shell 脚本

Apache Hadoop 3.0.0-alpha1发布了. 部分更新内容: Hadoop 3.0.0-alpha1在Java 8下编译,使用Java 7以及以下版本需更新到Java 8 重写了shell脚本,支持超过两个NameNode 详情请参照发行说明: Hadoop 3.0.0-alpha1 Release Notes 主页:http://hadoop.apache.org/docs/r3.0.0-alpha1/index.html 下载:http://hadoop.apache.org

运行shell脚本提示“syntax error near unexpected token for((i=0;i<$length;i++))”

sh脚本如下: #!/usr/bin/env bash county="3 4 5 6 7 8 9 10 11 12 16 29 39 44 53 62 72 84 97 115 128 151 168 187 199 218 230 10079 10239 32478" array=($county) length=${#array[@]} for((i=0;i<$length;i++)) do $HIVE_HOME/bin/hive -e "select * fro

在CentOS7.2安装Jdk1.8和resin4.0.45的步骤及shell脚本

1.java的安装 jdk下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 1.1.安装jdk-1.8 [[email protected] ~]# ls anaconda-ks.cfg  Desktop  jdk-8u77-linux-x64.rpm  [[email protected] ~]# rpm -ivh jdk-8u77-linux-x64.rpm  [[

查看linux server网络I/0流量的shell脚本

查看linux server网络流量的shell脚本 上传下载大量文件的时候,可以使用这个脚本来实现监控! #!/bin/sh   ###统计5s内的平均流量,以Mb为单位 if [ "$1" = "" ];then    echo -e "\n      use interface_name after the script,like \"$0 eth0\"...\n"    exit -1 fi   echo -e &qu

自定义shell脚本快速搭建LNMP环境(Ubuntu16.04 LTS / PHP7.0)

循环shell脚本模拟 apt install app, 把需要的app写在apps.txt即可. 一.lnmp_install.sh (需要有可执行权限) #!/bin/bash #Program function : Lnmp基础环境搭建,基于PHP7.0/MySQL5.7,并安装自定义软件 for app in $(cat apps.txt) do comment=${app:0:1} if [ -n ${app} ] then if [[ ${comment} == "#" ]

shell脚本中的$# $0 [email&#160;protected] $* $$ $! $?的意义

转载自:http://www.cnblogs.com/davygeek/p/5670212.html 今天学写脚本遇到一些变量不认识,在此做下记录. 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2 $# 传递给脚本或函数的参数个数 $* 传递给脚本或函数的所有参数 [email protected] 传递给脚本或函数的所有参数.被双引号(" ")包含时,与 $* 稍有不同 $? 上个命令的退出状

【Shell脚本学习8】Shell特殊变量:Shell $0, $#, $*, [email&#160;protected], $?, $$和命令行参数

前面已经讲到,变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即pid,看下面的代码: $echo $$ 运行结果 29949 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* 传递给脚本或函数的所有参数. [email protected] 传递给脚本或函数

shell脚本真假判断(0为真,非0为假?或0为假,非0为真?)

在网络上,总有人说shell脚本的真假判断,有说0位真的,非0为假,但真的是这样吗? 做个实验,写个0的判断语句 执行结果是0 is true,那么我们想当然1是false了,做下测试: 然而执行的结果却大相径庭,0是ture,1也是ture 也就是说其他语言中(0为真,非0为假?或0为假,非0为真?)的理论均不成立. 那么linux是以什么来作为判断的呢 答案就是以命令执行后的状态,状态可用$?查看(echo $?显示0,表示执行成功,1表示执行失败) shell脚本真假判断(0为真,非0为假