Bash语法非常的简单,Bash是一个命令解释程序,单使用Bash做不了什么,但是Bash结合Linux命令就很强大了,几乎可以完成Linux所有的事情,早年第一个接触Bash的时候,可以追溯到2010年了,当时在一家互联网虚产品的公司,那是个时候WEB虚机还很流行的,底层WEB虚机的创建,开户都用Shell脚本实现。当时我作为Java开发人员,但有幸参与到shell脚本开发中,当时对Shell并不是很熟,从那个时候算是对Shell第一次试水,并没有进行深入的学习,之后工作重点后来又转向Java开发,但从那个时候就起就感觉shell这个东西很好玩,最近想重新把这块东西捡起来,一点一滴的记录下来,学习shell一定要把学习Linux命令分开,要不然一开始学可能会一头雾水,这是我的一点建议,随着对Linux命令的掌握,再加上shell脚本的威力,就可以在Linux的高手。   

1 标准输入、输出与标准错误输出

系统为这三个文件分配了文件标识符fd(file descripter),在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。它们的文件标识符,分别为0,1,2,关系如下表:

文件描述符 名称 通用缩写 默认值
0 标准输入 stdin 键盘
1 标准输出 stdout 屏幕
2 标准错误 stderr 屏幕

1.1 输出重定向 
语法 说明
> 把标准输出重定向到一个新文件,”>” 会覆盖原有的内容。
>> 把标准输出重定向到一个文件中,不覆盖原有的内容(追加)。
2 > 把标准错误重定向到一个文件中
2 >> 把标准错误重定向到一个文件中(追加)
2 > &1 把标准输出和错误重定向到一个文件(追加)

1.2 输入重定向

语法 说明
< filename文件作为标准输入
<< delimiter 从标准输入中读入,知道遇到delimiter分界符

1.3 绑定重定向

语法 说明
> &m 把标准输出重定向到文件描述符m中
< &- 关闭标准输入
> &- 关闭标准输出

2 变量

2.1 环境变量

通过使用printenv可以显示当前的环境变量

[root@IDC-D-1699 ~]# printenv
HOSTNAME=IDC-D-1699
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=111.200.23.36 31752 22
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/3
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/java/jdk1.8.0_101/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
JAVA_HOME=/usr/local/java/jdk1.8.0_101
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root

2.2 本地变量

Shell不需要明确定义类型,事实上Shell变量的值都是字符串,比如我们定义var=45,其实var的值是字符串而非整数,shell变量不需要事先定义就可以使用,如果使用没有定义的变量,这字符串取值为空字符串。

变量名称=”变量Value”,“=”的两边不能有空格,否则shell解释成名称和命令参数。

获取变量使用 $变量名称

a="ywq"
echo $a

2.2.1 文件名代换

可以使用*、?、[]对文件名代换

匹配符 说明
* 匹配0个多个任意字符
? 匹配一个任意字符
[] 匹配方括号中任意一个字符的一次出现

2.2.2 命令代换

将命令替换为命令输出,所有的shell支持使用反引号的方式进行命令替换,命令替换可以嵌套,需要注意的是如果使用反引号的形式,在内部反引用前必须使用反斜杠转移

匹配符 说明
`` 例如 echo ${pwd}
$() 例如 echo `pwd`

2.2.3 算术代换

匹配符 说明
$(()) 例如 echo $((4 + 6))

3 符号

3.1 转义字符

‘\’用作转义字符。

3.2 单引号

单引号内的所有字符都保持它本身字符的意思,而不会被bash进行解释。

3.3 双引号

除了$、``、/外,双引号内所有的字符保持字符本身的含义。

4 逻辑判断

4.1 if

在shell中用if,then,elif,else,fi这几条命令实现分支控制,这种流程控制语句本质上也是由若干个逻辑判断组成,需要注意的是。

  • if/then结束都离不开fi
  • if和[]注意用空格隔开,]后面紧跟;
  • []内的条件与都有一个空格隔开

例如:

    if [ -f $a ];then
echo "hello world!"
fi

4.2 case

case结构用于多种情况的条件判断,类似于其它语言的switch/case,但从语法结构上有很大的不同,常用格式。

case 字符串 in
模式)
语句
;;
模式2 | 模式3)
语句
;;
*)
默认执行的 语句
;;
esac

例如

#!/bin/bash
read -p "请输入要查查询的区号:" num
case $num in *)echo -n "中国";;&
03*)echo -n "河南省";;&
??71)echo "郑州市";;
??72)echo "安阳市";;
??73)echo "新乡市";;
??73)echo "许昌市";;
07*)echo -n "江西省";;&
??91)echo "南昌市";;
??92)echo "九江市";;
??97)echo "赣州市";;
esac

注意

当程序指定到条件语句;;&时,不会停止,直到执行到;;esac

不管是if还是case,他们的结尾都很有意思,if的结尾是fi,而case的结尾是easc,首位和尾部正好相反。

5. 循环

5.1 for

例如:

打印目录下所有的文件

#!/bin/bash
for i in $( ls ); do
echo item: $i
done

打印序列

#!/bin/bash
for n in $(seq 1 10);
do
echo $n
done

5.2 while

例如:

#!/bin/bash
counter=$1
while [ $counter -lt 10 ];
do
echo the counter is $counter
counter=$(($counter+1))
done

5.3 until

例如:

#!/bin/bash
counter=$1
until [ $counter -lt 10 ];
do
echo the counter:$counter
let counter=counter-1
done

6 比较运算

6.1 比较符

比较符 说明 举例
-e filename 如果filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果filename常规文件,则为真 [  -f /usr/bin/grep ]
-L filename 如果filename为符号链接,则为真 [ –L /usr/bin/grep ]
-r filename 如果filename可读,则为真 [ –r /var/log/syslog ]
-w filename 如果filename可写,则为真 [ –w /varmytmp.txt ]
-x filename 如果filename可执行,则为真 [ –x /usr/bin/grep ]
-s filename 如果filename不是空白文件,则为真  
-u filename 如果filename有SUID属性,则为真  
-g filename 如果filename有SGID属性,则为真  
-k filename 如果filename有stickybit属性,则为真  
file1 –nt file2 如果file1比file2新,则为真  
file1 –ot file2 如果file1比file2旧,则为真  

6.2 字符串比较运算符

比较符 说明 举例
-z string 如果string长度为零,则为真  
-n string 如果string长度不为零,则为真  
str1 = str2 如果str1与str2相同,则为真  
str1 != str2 如果str1与str2不相同,则为真  

6.3 算数比较符

比较符 说明 举例
-eq 等于  
-ne 不等于  
-lt 小于  
-le 小于或等于  
-gt 大于  
-ge 大于或等于  

Bash基本语法的更多相关文章

  1. Bash 脚本语法

    每次学了忘,忘了学,怎么记不住,因为长时间不用了 Bash 流程控制 循环 for循环 for item in $list do echo $item done 另一种与C语言类似的写法 ; i< ...

  2. sh与bash执行语法严谨问题

    在Linux中,我们知道有几种方式可以运行.sh脚本 通过sh或者bash命令来运行 通过source来运行 通过./xxx.sh来运行(这种方式要求对脚本文件有r和x权限才行) 今天在写脚本的过程中 ...

  3. 转:bash shell 语法1

    1 Shell介绍 Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batc ...

  4. bash编程语法自我总结

    脚本2种执行方式: 1 直接执行,等于bash衍生一个子程序,当该子程序完成后,子程序内各项变量活动作不会传回父程序 2 利用source执行,直接在父程序中执行 X=/bin/xdo cmd 执行c ...

  5. BASH 基本语法

    本节内容 1.  什么是shell script 2.  变量 3.  运算符 4.  流程控制 5.  函数 6.  计划任务 crontab 一  什么是shell script 将OS命令堆积到 ...

  6. linux下bash脚本语法

    1.shell中的变量定义和引用(1)变量定义和初始化.shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言:变量没有明确类型就是弱类型语言),和C语言不同.在shell编程中定义变量 ...

  7. 怎样用 Bash 编程:语法和工具

    让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇. Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的.每当用户或者系统管理员 ...

  8. Bash 脚本编程语言中的美学与哲学

    我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨 Bash 脚本语言中的美学与哲学. 这不是一篇 Bash 脚本编程的教程,但是却能让人更加深入地了解 Bash ...

  9. Ubuntu下shell脚本运行异常:bash和dash的区别

    Ubuntu下我用bash到语法写了一个shell脚本(准确的说是把书上的脚本敲进电脑),在ubuntu下,用sh test.sh来运行,但是出现了意料之外到结果,比如echo -e "\n ...

随机推荐

  1. A quick tour of JSON libraries in Scala

    A quick tour of JSON libraries in Scala Update (18.11.2015): added spray-json-shapeless libraryUpdat ...

  2. c#语句 随堂练习2

    1.方程ax²+bx+c=0是一元二次方程,求根. 2.输入一个年份 ,判断是不是闰年.(能被4整除但不能被100整除的年份是闰年,有的世纪年也是闰年) 3.标准体重:男士体重=身高-100±3:女士 ...

  3. 利用background-attachment做视差滚动效果

    视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验.作为今年网页设计的热点趋势,越来越多的网站应用了这项技术. 不明白的可以先看 ...

  4. SQL 语句调用这个存储过程,生成顺序编码

    一直很讨厌存储过程,没想到今天帮了我大忙啊,或许会因为今天让我慢慢喜欢上存储过程吧,不多说了,切入正题 在使用数据库的时候,难免要在使用过程中进行删除的操作,如果是使用int类型的字段,令其自增长,这 ...

  5. Struts和SpringMVC两种MVC框架比较

    基于Web的MVC framework在J2EE的世界内已是空前繁荣.TTS网站上几乎每隔一两个星期就会有新的MVC框架发布.目前比较好的MVC,老牌的有Struts.Webwork.新兴的MVC框架 ...

  6. C++静态成员和静态成员函数

    一:静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则 ...

  7. android之简单图形绘制

    首先编写MyView类 代码如下: package com.example.myhello; import android.content.Context; import android.graphi ...

  8. JS验证只允许输入数字

    1.文本框只能输入数字代码(小数点也不能输入)<input onkeyup="this.value=this.value.replace(/\D/g,'')" onafter ...

  9. 50分钟学会Laravel 50个小技巧

    50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45  Yuansir-web菜鸟 原文  http://www.yuansir-web.com/2015/12/09 ...

  10. css before&after 特殊用途

    平常仅仅需要将这两个伪元素用于添加一些自定义字符 p:before  {content:"hello"} 但我们还可以使用before&after这两个伪类做一些特殊效果 ...