1. Shell简介

1.1 Shell出现背景

Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件。

对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。

由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell

1.2 Shell作用

Shell 除了能解释用户输入的命令,将它传递给内核,还可以:

  • 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果;
  • 在多个程序之间传递数据,把一个程序的输出作为另一个程序的输入;
  • Shell 本身也可以被其他程序调用。

由此可见,Shell 是将内核、程序和用户连接了起来。
Shell 本身支持的命令并不多,但是它可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。

常见的 Shell 有 sh、bash、csh、tcsh、ash 等。这里使用Linux默认的bash shell (兼容sh),对其他Shell不加探究。

2. Shell语法

2.1 helloWorld及授权

编写shell脚本,输出hello world

[root@centoszang testShell]# vim myShell.sh 

#!/bin/bash
echo "hello world!!!"

通过上面代码,可以看出:“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令用于向窗口输出文本。

编写之后,运行该文件会提示权限不够

[root@centoszang testShell]# ./myShell.sh
-bash: ./myShell.sh: 权限不够

授给该文件x(执行)权限

[root@centoszang testShell]# chmod  ./myShell.sh
[root@centoszang testShell]# ls -l
总用量
-rwxr--r--. root root 6月 : myShell.sh

输入该脚本文件的相对路径和绝对路径都可以执行该脚本

[root@centoszang testShell]# ./myShell.sh
hello world!!!
[root@centoszang testShell]# /home/testShell/myShell.sh
hello world!!!

2.2 Shell变量

2.2.1 Shell变量分类

Shell变量分为环境变量和用户自定义变量(局部变量)。

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量;环境变量是所有的程序,包括shell启动的程序都能访问的变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

2.2.2 变量定义

在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

v1=hello
v2='hello' #如果 value 包含了空白符,那么就必须使用引号包围起来
v3="hello" #解析变量的话需要加双引号

赋值号的周围不能有空格。

2.2.3 变量使用

address="中关村"
echo $address
echo ${address}
echo "海淀${address}百度大厦"

变量的使用是通过 "$var",“${var}”的方式来调用,推荐给所有变量加上花括号{ },这是个良好的编程习惯。

2.2.4 单引号和双引号的区别

name=" world!!!"
v1='hello ${name}'
v2="hello ${name}" #解析变量的话需要加双引号
echo "v1 is ${v1}"
echo "v2 is ${v2}"

执行上面代码,通过输出可以看出单引号和双引号的区别

[root@centoszang testShell]# ./myShell.sh
v1 is hello ${name}
v2 is hello world!!!

2.2.5 将命令的结果赋值给变量

variable=`ls`   #`非'
echo ${variable}
variable=$(ls)
echo ${variable}

第一种方式把命令用反引号包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

2.2.6 删除变量

name="world"
unset name
echo ${name} #无输出

2.2.7 只读变量

readonly name="world"    #声明方式一:直接声明

address="中关村"
readonly address #声明方式二:定义之后再声明 echo "name is ${name} and address is ${address}" name="hello" #修改变量值
unset address #删除变量

通过执行输出可以看到,只读变量不能修改和删除。

[root@centoszang testShell]# ./myShell.sh
name is world and address is 中关村
./myShell.sh: line : name: readonly variable
./myShell.sh: line : unset: address: cannot unset: readonly variable

2.3 特殊变量

通常来讲,变量名只能包含数字、字母和下划线,某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。

2.3.1 $* 和 $@ 的区别

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@" echo "print each param from \$*"
for var in $*
do
echo "$var"
done
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done

输出

[root@centoszang testShell]# ./tsbl.sh a b c
$*= a b c
"$*"= a b c
$@= a b c
"$@"= a b c
print each param from $*
a
b
c
print each param from $@
a
b
c
print each param from "$*"
a b c
print each param from "$@"
a
b
c

2.3.2 退出状态

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

2.4 Shell替换

2.4.1 转义字符

如果表达式中包含特殊字符,Shell 将会进行替换。例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。

a=
echo -e "Value of a is $a \n"
echo "Value of a is $a \n"

输出

[root@centoszang testShell]# ./myShell.sh
Value of a is Value of a is \n

常用转义字符如下

2.4.2 变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。

echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}" echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}" unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var" var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var" echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"

结果

[root@centoszang testShell]# ./myShell.sh
Variable is not set
- Value of var is
Variable is not set
- Value of var is Variable is not set - Value of var is
This is default value
- Value of var is Prefix
Prefix
- Value of var is Prefix

2.5 Shell字符串

2.5.1 单双引号

Shell中最常用的数据类型就是字符串了,字符串可以用单引号,也可以用双引号,也可以不用引号。学过拍黄片的会发现,单双引号的区别跟PHP类似。

my_name='Richard'
hello_word="Hello, I know your are \"$my_name\"! \n"

之前已介绍过了,这里再整理一下

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

2.5.2 拼接字符串

your_name="Jenny"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"

2.5.3 获取字符串长度

string="abcd"
echo "the length of string is ${#string}" #输出

2.5.4 截取字符串

string="alibaba is a great company"
echo ${string::} #输出liba

2.5.6 查找子字符串

string="alibaba is a great company"
echo `expr index "$string" is` #输出3
echo `expr index "$string" 'is'` #输出3
echo `expr index "$string" "is"` #输出3

这里发现Shell该语法只截取第一个字符的位置。

2.6 数组

2.6.1 定义数组

定义数组有如下三种方法

my_array=(arr1 arr2 arr3)

your_array=(
arr1
arr2
arr3
) our_array[]=arr1
our_array[]=arr2
our_array[]=arr3

2.6.2 读取数组

echo "my_array[0] is ${my_array[0]}"  #读取单个元素
echo "all of your_array's elements are ${your_array[*]}" #读取所有元素
echo "all of our_array's elements are ${our_array[@]}" #读取所有元素

2.6.3 获取数组长度

# 取得数组元素的个数
length=${#our_array[@]} #
# 或者
length=${#our_array[*]} #
# 取得数组单个元素的长度
length=${#our_array[]} #

(一)Linux Shell编程——简介、变量、字符串、数组的更多相关文章

  1. Linux Shell编程、变量、控制语句

    为什么要学习Shell编程 1)Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理. 2)对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些 ...

  2. Linux —— Shell编程之变量赋值和引用

    Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量.有三种主要的变量类型:环境变量.内部变量和用户变量. 环境变量(environment variable)是系统环境的一部分, ...

  3. linux shell编程之变量和bash配置文件(第一篇)

    编程语言有两类 强类型:如C语言.数据具有其特定的类型,先声明定义后才能使用.数据运算时必须符合类型要求(如不能把字符串类型数据直接与整型数据做算数运算) 弱类型:如shell.数据默认为字符型,不用 ...

  4. Linux学习——shell编程之变量

    shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...

  5. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  6. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  7. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  8. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

  9. 一文学完Linux Shell编程,比书都好懂

    一. Shell 编程 1. 简介 Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务. Shell 既是一种命令语言,又是一种程序设计语言. Shell scr ...

随机推荐

  1. svn(subversion)版本控制系统学习与理解

    定义:Apache Subversion(简称SVN,svn),一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. 从这段话,我们可以得到四点信息: ...

  2. html实现带斜线的表头

    在html.jsp中经常用到table,但在table中如何实现标题表格中画斜线的操作呢?从网上查了很多资料,可以实现的方法有好几种,现在提供一种简单的操作方法,而且不用考虑分辨率的问题,如图: 方法 ...

  3. QT vs x64编译

    下载qt-everywhere-opensource-src-5.3.0 这个设置非常重要,不对的话,一大堆编译错误,已经折腾了好多回了 configure -mp -confirm-license ...

  4. 《OpenStack部署实践》

    <OpenStack部署实践> 基本信息 作者: 张子凡 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115346797 上架时间:2014-2-27 出版日期:2014 ...

  5. 【BZOJ】【2127】happiness

    网络流/最小割 Orz Hzwer. 这题他题解说的比较简略……我手画了个图才明白过来…… 嗯对于每个人选文or理的单独收益大家应该很好理解……连S->i 权值为选文的喜悦值,i->T权值 ...

  6. 使用Adt自带的工具进行Android自己主动化測试(三)

    在这个系列的上一篇文章中,我们介绍了MonkeyRunner,并提到假设依据坐标来编写自己主动化脚本的话存在着一定的局限性(点击文末"阅读原文"能够打开这篇文章查看).这篇文章将进 ...

  7. 第十九章 springboot + hystrix(1)

    hystrix是微服务中用于做熔断.降级的工具. 作用:防止因为一个服务的调用失败.调用延时导致多个请求的阻塞以及多个请求的调用失败. 1.pom.xml(引入hystrix-core包) <! ...

  8. C# 实现PNG文件的背景透明显示,解决动态显示闪烁问题 【转】

    http://blog.sina.com.cn/s/blog_402c071e0102x4rl.html    以下内容,对于想要使用C#实现PNG图片背景透明显示,同时动态显示时无闪烁问题的人来说, ...

  9. iOS开发-照片选择

    本来想做个注册登录的表单的,想想还是先做个简单的头像选择,一般情况下不管是内部管理系统还是面向公众的互联网公司,注册登录是免不了的,用户头像上传是免不了的,尤其是企业用户,上传了自己的图片才感觉自己买 ...

  10. IOS开发之地图导航

    一.问题描述 现在很多的APP 都开始引入了地图和定位功能,包括一些餐饮业,团购等.他们都过定位和地图来让用户更加方便的根据自己的位置找到合适的目标,也就是说,现在地图定位已经不再是导航工具类,地图工 ...