一: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. 犯罪心理第八季/全集Criminal Minds迅雷下载

    本季Criminal Minds Season 8(2012)看点:新季预告一名犯人突发急病,他被送上救护车,救护车在途中发生车祸.犯人对押送他的警官痛下毒手,BAU小组成员再次聚集起来.BAU开始分 ...

  2. ArrayBlockingQueue, LinkedBlockingQueue, ConcurrentLinkedQueue, RingBuffer

    1. ArrayBlockingQueue, LinkedBlockingQueue, ConcurrentLinkedQueue ArrayBlockingQueue, LinkedBlocking ...

  3. [转]分析MySQL数据类型的长度【mysql数据字段 中length和decimals的作用!熟悉mysql必看】

    转载自:http://blog.csdn.net/daydreamingboy/article/details/6310907 分析MySQL数据类型的长度 MySQL有几种数据类型可以限制类型的&q ...

  4. 【转】Redis 总结精讲 看一篇成高手系统-4

    https://www.cnblogs.com/rjzheng/p/9096228.html 本文围绕以下几点进行阐述 1.为什么使用redis2.使用redis有什么缺点3.单线程的redis为什么 ...

  5. 如何大幅优化solr的查询性能(转)

    提升软件性能,通常喜欢去调整各种启动参数,这没有多大意义,小伎俩. 性能优化要从架构和策略入手,才有可能得到较大的收益 Solr的查询是基于Field的,以Field为基本单元,例如一个文章站要索引 ...

  6. 解决ASP.NET中的各种乱码问题

    解决ASP.NET中的各种乱码问题 阅读目录 开始 页面显示乱码问题 AJAX提交的数据乱码问题 JavaScript中正确的URL编码方式 ASP.NET中正确的URL编码方式 正确的URL编码方式 ...

  7. 对象引用 方法传参 值传递 引用传递 易错点 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. android 巧用动画使您app风骚起来

    巧用Android的自定义动画,使你更加的有动感,是大多数Android开发人员的目标,那怎么做到这点.请听下文分解: 3.0以前,android支持两种动画模式,tween animation(幅间 ...

  9. Spring Boot集成MyBatis开发Web项目

    1.Maven构建Spring Boot 创建Maven Web工程,引入spring-boot-starter-parent依赖 <project xmlns="http://mav ...

  10. 前端开发必备 40款优秀CSS代码编写工具推荐

    摘要:CSS工具可以简化工作流,可以提高CSS编写速度,是开发者和设计者所不可缺少的.本文列举了40种CSS工具,功能涉及CSS菜单.动画.3D图形.响应式页面.图层.按钮等界面元素的设计与制作,你定 ...