一:Hello World

新建一个文件,命名时以 .sh 为后缀。每个bash文件开头第一行表名文件类型: #!/bin/bash

然后在下面输入代码。

比如输出hello world:

#!/bin/bash
echo "hello world"

运行bash文件: ./文件名.sh

(在终端创建的文件用vim编辑保存,ubuntu可以在图形化界面new一个空白文档,通过后缀名识别为bash文件)

二:变量

shell中定义变量,有以下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字
  • 变量名和等号之间不能有空格;

使用对象:使用 ${变量名} 获取变量,如同EL表达式一样。如:${name}

只读变量:在赋值后可以用readonly修饰变量成为只读,相当于final常量

#!/bin/bash
name=“ygj”
readonly name

变量类型:

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

字符串:用 “”或‘’括起来

字符串拼接:不需要运算符,直接连着写或者用 ${name} 把要拼接的内容直接写到新定义的字符串里。如:

#!/bin/bash
str1="i am str1"
str2="you are str2,and"str1
str3="she is str3,${str2}"

获取字符串长度: #strname 即可,如:

#!/bin/bash
str1="i am str1"
echo ${#str1}

截取字符串: strname:beginindex:endindex,如:

#!/bin/bash
str1="i am str1"
str2=${str1::}

字符串中查找子串或字符下标: `expr index "${strname}" 查找内容` (注意:前后两个反引号。在键盘的Esc下面按钮)

#!/bin/bash
str1="i am str1"
echo `expr index "${str1}" am`

Shell数组:

定义数组:arrname=(value0 value1。。。)(注意:元素之间通过空格隔开,不是逗号!)也可以逐个赋值 arrname[i]=value_i。

Shell数组没有范围限制,访问时只通过下标访问,下标从0开始。

访问数组元素:${arrname[index]}

访问全部元素:${arrname[@]}

获得数组长:用 # 运算符:${#arrname[@]}

获取单个元素内容的长:用 # 运算符:${#arrname[index]}

Shell注释:用#开头的行都是注释

三:向bash文件传递参数

在终端启动bash文件时,可以在文件名后增加传入的参数值,如:

./test.sh ygj  

在bash文件中获取参数: $n ,n指传进来的第几个参数,从1开始。如:

#!/bin/bash
echo “No. parameter is:$”

统计参数个数:$#

把所有参数以一个字符串形式返回:$*

把所有参数单独逐个返回:$@

显示运行当前脚本的进程ID:$$

四:运算符

运算符主要有以下几种:

算术运算符:+-*/%,==,!=

bash的运算表达式不能直接计算出数学运算的结果,需要用 `expr 表达式`(反引号)  命令解析表达式才可获取结果。另外,表达书写时要求数字、变量与运算符之间有空格,否则只是简单的字符串而已。如:

#!/bin/bash
echo `expr 1 + 1`

下面的运算符使用不需要expr,但需要放在 [] 中,并且两边留空格,运算符与操作数之间也留空格。如:[ num1 op num2 ]

关系运算符(关系运算符只支持数字,不支持字符串):

-eq 检测两个数是否相等,相等返回 true。

-ne 检测两个数是否相等,不相等返回 true。

-gt 检测左边的数是否大于右边的,如果是,则返回 true。

-lt 检测左边的数是否小于右边的,如果是,则返回 true。

-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。

-le 检测左边的数是否小于等于右边的,如果是,则返回 true。

布尔运算符:

-o 或运算,有一个表达式为 true 则返回 true。

-a 与运算,两个表达式都为 true 才返回 true。

! 非运算,表达式为 true 则返回 false,否则返回 true。

逻辑运算符:

&& 逻辑与

|| 逻辑或

字符串操作运算符:

= 检测两个字符串是否相等,相等返回 true。

!= 检测两个字符串是否相等,不相等返回 true。

-z 检测字符串长度是否为0,为0返回 true。

-n 检测字符串长度是否为0,不为0返回 true。

文件操作运算符:

-b file 检测文件是否是块设备文件,如果是,则返回 true。

-c file 检测文件是否是字符设备文件,如果是,则返回 true。

-d file 检测文件是否是目录,如果是,则返回 true。

-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。

-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。

-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。

-p file 检测文件是否是有名管道,如果是,则返回 true。

-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。

-r file 检测文件是否可读,如果是,则返回 true。

-w file 检测文件是否可写,如果是,则返回 true。

-x file 检测文件是否可执行,如果是,则返回 true。

-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。

-e file 检测文件(包括目录)是否存在,如果是,则返回 true。

Shell中可以test命令测试上述运算符组成的表达式是否成立,如:

num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi

五:输出

1:echo:类似于C++中的cin。

echo 内容

2:printf:与C语音的printf类似,以 printf 格式 参数值  的形式格式化输出。

printf "%-10s %-8s %-4.2f\n"张三  男 60.97

格式里面的替代符与C语言中一样,用   %-数位限制 数据类型 来表示一个数据,后面参数值列表按顺序给前面的替代符赋值。

六:流程控制

1:if语句:结尾 fi  表示endif的意思

if condition
then
command1
command2
...
commandN
fi

2:if-else

if condition
then
command1
command2
...
commandN
else
command
fi

3:if-elif-else

if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

4:for-each语句

for var in item1 item2 ... itemN//遍历的内容:可为数组,可为字符串
do
command1
command2
...
commandN
done

5:while

while condition
do
command
done

5:until:相当于dowhile-until

until condition
do
command
done

6:case:相当于switch-case

case $变量 in
模式1) //变量的一种取值情况
command1
command2
...
commandN
;;//每个case结尾用两个 ;; 表示结束
模式2)
command1
command2
...
commandN
;;
esac

7:跳出循环、case:break、continue。

七:函数

定义函数:

funname ()

{

    action;

    [return int;]//可选

}

函数参数:调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值。

funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 73 //调用参数时传参

八:输入/输出重定向(从文件输入,输出到文件)

命令 说明
command > file 将内容输出到file,会覆盖file原有内容。
command < file 从file获取输入。
command >> file 将输出以追加的方式输出到 file,不会覆盖file原有内容
n > file 将文件描述符为 n 的文件的内容赋值到 file,会覆盖file原有内容
n >> file 将文件描述符为 n 的文件以追加的方式复制到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

九:文件包含

相当于JSP中的include命令。我们可以在一个bash文件中导入已存在的bash文件,达到重用效果。

. filename   # 注意点号(.)和文件名中间有一空格

或

source filename

Shell编程初步的更多相关文章

  1. 第5天(半天)【shell编程初步、grep及正则表达式】

    第5天(半天)[shell编程初步.grep及正则表达式] shell编程初步(01)_recv shell脚本:文本文件 #!:/bin/bash #!:/usr/bin/python #!:/us ...

  2. Linux-awk和shell编程初步

    1 awk 格式: awk -选项 '处理' 输入 awk -F : '{print $1}' file -F指定分隔符, 默认是空格 $1 分割后的第一部分 $0 获得所有部分 NF 表示以分隔符分 ...

  3. Linux:Day5 shell编程初步、grep

    bash的基本特性(3) 1.提供了编程环境 程序编程风格: 过程式:以指令为中心,数据服务于指令: 对象式:以数据为中心,指令服务于数据: shell程序:提供了编程能力,解释执行:过程式.解释执行 ...

  4. linux之shell编程初步

    #################适用于CentOS6################## #!/bin/bash ########################################## ...

  5. 01 shell编程规范与变量

    前言: 大家对shell脚本应该都不算陌生了,如果突然问你什么是shell脚本?是干什么用的?由什么组成以及怎么使用?变量的概念是什么?作用范围是什么?变量间的算术运算怎么表示?你能很容易答出来吗 本 ...

  6. Shell编程-01-Shell脚本初步入门

    目录 什么是Shell 什么是Shell脚本 Shell脚本语言的种类 常用操作系统默认Shell Shell 脚本的建立和执行 脚本规范 什么是Shell     简单来说Shell其实就是一个命令 ...

  7. linux下shell编程示例-获取进程id

    今天初步学习了一下linux下的shell编程,简单记录一下测试用例 1.编辑shell脚本文件如下: #!/bin/bashecho "hello bash linux"echo ...

  8. shell编程企业级实战

    如何才能学好Shell编程 为什么要学习shell编程 Shell是Linux底层核心 Linux运维工作常用工具 自动化运维必备基础课程 学好shell编程所需Linux基础 熟练使用vim编辑器 ...

  9. shell编程其实真的很简单(一)

    如今,不会Linux的程序员都不意思说自己是程序员,而不会shell编程就不能说自己会Linux.说起来似乎shell编程很屌啊,然而不用担心,其实shell编程真的很简单. 背景 什么是shell编 ...

随机推荐

  1. Android之针对WebView的全屏播放

    转载请标明转载处:http://bbs.csdn.net/topics/390839259 本人刚学android,菜鸟一个,第一次写帖子,最近因为项目要用webview加载html5的视频,开始不能 ...

  2. [Android Pro] 自己动手编译Android源码(超详细)

    cp from : https://www.jianshu.com/p/367f0886e62b 在Android Studio代码调试一文中,简单的介绍了代码调试的一些技巧.现在我们来谈谈andro ...

  3. TeXworks使用教程指南

    TeXworks是Windows版本的TeX Live默认提供的编辑器.值得注意的是,TeXworks 是XeTeX 作者 Jonathan Kew 开发的,其特点是界面简洁友好,集成了轻便的 PDF ...

  4. 虚拟机内存复用技术的比较(XEN系统)

    技术途径 业界就该问题定义为虚拟机内存复用(复用干嘛? 当然是为了跑更多的虚拟机呀!) :memory overcommit.围绕次问题主要有4种技术手段,下面简要介绍和分析: 1 气泡驱动(ball ...

  5. KOL:Key Opinion Leader

    什么是关键意见领袖 在营销学上,为各厂家宣传的专家或权威被称为“关键意见领袖(Key Opinion Leader),通常被定义为:拥有更多.更准确的产品信息,且为相关群体所接受或信任,并对该群体的购 ...

  6. [转]PHP资源列表

    转自:http://www.cnblogs.com/CraryPrimitiveMan/p/4437272.html 一个PHP资源列表,内容包括:库.框架.模板.安全.代码分析.日志.第三方库.配置 ...

  7. iOS:自定义导航栏,随着tableView滚动显示和隐藏

    自定义导航栏,随着tableView滚动显示和隐藏 一.介绍 自定义导航栏是APP中很常用的一个功能,通过自定义可以灵活的实现动画隐藏和显示效果.虽然处理系统的导航栏也可以实现,但是这个是有弊端的,因 ...

  8. maven-assembly-plugin 入门指南

    当你使用 Maven 对项目打包时,你需要了解以下 3 个打包 plugin,它们分别是 plugin function maven-jar-plugin maven 默认打包插件,用来创建 proj ...

  9. 第十一章 dubbo通信框架-netty4

    netty4是2.5.6引入的,2.5.6之前的netty用的是netty3.在dubbo源码中相较于netty3,添加netty4主要仅仅改了两个类:NettyServer,NettyClient. ...

  10. 用 .NET Memory Profiler 跟踪.net 应用内存使用情况--基本应用篇(转)

    .net 框架号称永远不会发生内存泄漏,原因是其引入了内存回收的机制.但实际应用中,往往我们分配了对象但没有释放指向该对象的引用,导致对象永远无法释放.最 常见的情况就是给对象添加了事件处理函数,但当 ...