Shell即是一种命令语言,又是一种程序设计语言,使用者可以通过Shell访问操作系统的内核服务。

Shell编程和java、python、C一样,只要一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了,Linux的Shell种类众多,我们只关注与Bash(Bourne Again Shell  (/bin/bath))

#! /bin/sh#! /bin/bash没多大区别,#!告诉系统需要什么解释器来执行该Shell脚本程序。

shell的打印输出函数 echo

从键盘获取输入信息---- read

read  name                   //从键盘数据保存在name变量中
echo "从键盘获取的信息是 $name"

1、read命令提供了-p参数,-p后面的字符串会显示出来

read -p "输入第一个数字:" a    #获取键盘输入的 a 变量数字
read -p "输入第二个数字:" b #获取键盘输入的 b 变量数字
r=$[a+b] #计算a+b的结果 赋值给r 不能有空格
echo "sum = ${r}" #输出显示结果 r

输出结果

输入第一个数字:
输入第二个数字:
sum =

2、计时输入

使用read命令存在着潜在危险。脚本会阻塞下来等待用户的输入。如果无论是否输入数据脚本都必须继续执行,可以使用-t选项指定一个计时器。

if read -t  -p "please enter your name:" name
then
echo "hello $name ,welcome to my script"
else
echo "sorry,too slow"
fi

3、设置read命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。

read -n1 -p "Do you want to continue [Y/N]?" answer
case $answer in
Y | y)
echo "fine ,continue";;
N | n)
echo "ok,good bye";;
*)
echo "error choice";;
esac

使用了-n选项,后接数值1,指示read命令只要接受到一个字符就退出

4、读文件

还可以使用read命令读取Linux系统上的文件。每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。读取文件的关键是将文本中的数据传送给read命令,最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令

count=    //赋值语句,不加空格
cat test | while read line //cat 命令的输出作为read命令的输入,read读到的值放在line中
do
echo "Line $count:$line"
count=$[ $count + ] //注意中括号中的空格。
done
echo "finish"
exit

Shell单行注释 注释内容

多行注释

:<<EOF

注释内容...

注释内容...

EOF

EOF也可以使用其他字符,只要前后保持一致就行。

运行 Shell 脚本有两种方法:

1、作为可执行程序

将上面的代码保存为 test.sh,并 cd 到相应目录:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh #在当前目录执行脚本test.sh

2、作为解释器参数

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

/bin/sh test.sh

3、在Git Bash命令行中运行.sh文件

 $ sh test.sh

Shell变量

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

you_name="LXP-Never"

变量名和等号之间不能有空格, 这和我们熟悉的python编程语言不一样,但是变量名的命名规则是一样的。

使用变量

使用一个定义过的变量,只需在变量名前面加美元符号即可

name="LXP"
echo $name
echo ${name}

变量名外面的花括号是可选的,加不加都行,如果加了花括号更加方便的识别变量的边界。推荐给所有的变脸加上花括号,这是一个好的编程习惯。

只读变量  readonly name,只读变量的值不能被改变,不能被unset删除

删除变量  unset name

Shell字符串,字符串可以用单引号,也可以用双引号,也可以不用。但是使用双引号可以用$符号使用变量,还可以使用转义字符\

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1 # hello, runoob ! hello, runoob !
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3 # hello, runoob ! hello, ${your_name} !

获取字符串长度

string="abcd"
echo ${#string} #
expr length "$string" #

提取子字符串

以下实例从字符串第2个字符开始截取4个字符,取不到开始索引

var="http://www.aaa.com/123.htm"
echo ${string::} # ttp:

从左边第几个字符开始,一直到结束,取不到开始索引

echo ${var:}    # is a great site

从右边第几个字符开始,的几个字符

echo ${var:-:}    # 

从右边第几个字符开始,一直到结束。

echo ${var:-}    # .htm

Shell数组

从0开始索引

定义数组,用空格分割不同的数组元素

array_name=(value1 value2 value3 ...valuen)

读取数组

读取数组元素值得一般格式是:

${数组名[下标]}

valuen=${array_name[n]}

使用 @ 符号可以获取数组中的所有元素

echo ${array_name[@]}

获取数组的长度

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

截取

###号截取,删除边的字符  ${var#*//}  # 删除var左边的字符,直到遇到第一个//

%%%号截取,删除边的字符  ${var%//*}  # 删除var左边的字符,直到遇到第一个//

var=http://www.aaa.com/123.htm
echo ${var#*//} # www.aaa.com/123.htm
echo ${var##*/} # 123.htm
echo ${var%/*} # http://www.aaa.com
echo ${var%%/*} # http:

关系运算符

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

a=10  b=20

运算符 说明 举例

-eq

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

[ $a -eq $b ] 返回 false。

-ne

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

[ $a -ne $b ] 返回 true。

-gt

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

[ $a -gt $b ] 返回 false。

-lt

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

[ $a -lt $b ] 返回 true。

-ge

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

[ $a -ge $b ] 返回 false。

-le

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

[ $a -le $b ] 返回 true。

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

操作符 说明 举例
-d file 检测文件是否是目录(在linux中目录就是文件夹的意思),如果是,则返回 true。 [ -d $file ] 返回 false。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。

布尔运算符

运算符 说明 举例

!

非运算

[ ! false ] 返回 true。

-o

或运算

[ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a

与运算

[ $a -lt 20 -a $b -gt 100 ] 返回 false。

逻辑运算符

运算符 说明 举例

&&

逻辑的 AND

[[ $a -lt 100 && $b -gt 100 ]] 返回 false

||

逻辑的 OR

[[ $a -lt 100 || $b -gt 100 ]] 返回 true

字符串运算符

运算符 说明 举例

=

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

[ $a = $b ] 返回 false。

!=

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

[ $a != $b ] 返回 true。

-z

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

[ -z $a ] 返回 false。

-n

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

[ -n "$a" ] 返回 true。

str

检测字符串是否为空,不为空返回 true。

[ $a ] 返回 true。

Shell流程控制

if else

if condition1

then

  command1

elif condition2

then

  command2

else

  command3

fi

for循环

for var in item1 item2 ... itemN
do
  command1
done

while语句

while condition
do
  command
done

case

Shell case语句为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case num in
  1) command1

  ;;

  2) command2

  ;;
esac

跳出循环

break、continue

Shell函数

funname(){

  echo "这是我的第一个Shell函数"

}

echo "调用函数"

funname

可以使用return返回函数

函数参数

在函数内部通过使用 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

funWithParam(){
echo "第一个参数为 $1 !"
echo "第十个参数为 ${10} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam

输出结果:

第一个参数为  !
第十个参数为 !
参数总数有 个!
作为一个字符串输出所有参数 !

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

$#  传递到脚本的参数个数

$*  以一个单字符串显示所有向脚本传递的参数

shell文件导入

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

如:

test1.sh文件内

url="作者的名字是:"

在test2.sh脚本文件内导入test1.sh脚本

. ./test1.sh
echo "${url}不告诉你"

添加可执行权限并执行,然后执行test2.sh脚本,

$ chmod +x test2.sh
$ ./test2.sh
作者的名字是:不告诉你

参考文献

linux菜鸟教程

从键盘获取输入read

Shell教程快速入门的更多相关文章

  1. Spring MVC 教程,快速入门,深入分析

    http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: ...

  2. Spring MVC 教程,快速入门,深入分析[1-11]

    资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar     作者:赵磊 博客:http://elf8848.iteye.com   ...

  3. [转]Spring MVC 教程,快速入门,深入分析

    原文地址:http://elf8848.iteye.com/blog/875830 目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mv ...

  4. Shell脚本快速入门

    最近看了下Shell脚本.曾经遇到很多现成的工具包里边就多次用到了Shell脚本.总之这东西的作用无非就是将一系列的操作进行整合. ·整合后使得一套工作更加模块化规范化. ·批量处理要比手动操作快得多 ...

  5. shell语法快速入门(1)

    #得到绝对路径 DIR=$(cd `dirname $0`;pwd) $DIR/file.txt #去掉#注释 egrep -v "(#|^$)" /etc/zabbix/zabb ...

  6. Spring MVC 教程,快速入门,深入分析(转载)

    作者:赵磊 博客:http://elf8848.iteye.com 下载: Spring的官方下载网址是:http://www.springsource.org/download    (本文使用是的 ...

  7. shell编程快速入门及实战

    shell编程:对于hadoop程序员,通常需要熟悉shell编程,因为shell可以非常方便的运行程序代码. 1.shell文件格式:xxx.sh #!/bin/sh ---shell文件第一行必须 ...

  8. Shell基础快速入门 了解shell运行原理

    Shell简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界 ...

  9. shell教程——bash入门

    创建shell文件 vim test.sh 写内容 #!/bin/bash echo "Hello World !" 使脚本具有执行权限 chmod +x ./test.sh 执行 ...

随机推荐

  1. weblogic、hibernate 包冲突

    解决办法: 在weblogic 配置  [paths]项中 添加antlr-2.7.7.jar,该jar包应该位于引用weblogic.jar之前,使启动时不再加载weblogic中的低版本的antl ...

  2. webpack 事件触发 按需加载

    比较易懂, 方法简单 var util_sync = require('./util-sync.js') alert(util_sync.data) document.getElementById(& ...

  3. times(NULL) Segmentation fault

    ****************************************************************************** * times(NULL) Segment ...

  4. opengl去除控制台黑窗口

    增加如下语句: #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\ ...

  5. Licp - 一个玩具解释器的实现

    纸上得来终觉浅,绝知此事要躬行. 最近看了 SICP,其第四章讲述了一个简单的 Scheme 解释器的实现.粗看了一遍后决定自己用 C 语言实现一个残疾的 Scheme 解释器,想来这样的学习效果应该 ...

  6. 二次剩余-Cipolla

    二次剩余 \(Cipolla\) 算法 概述 大概就是在模 \(p\) 意义下开根号,如求解方程\(x^2\equiv n(mod\ p)\). 这里只考虑 \(p\) 为素数的情况.若 \(p=2\ ...

  7. BZOJ4557 JLoi2016 侦察守卫 【树形DP】*

    BZOJ4557 JLoi2016 侦察守卫 Description 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是 ...

  8. BZOJ2038 2009国家集训队 小Z的袜子(hose) 【莫队】

    BZOJ2038 2009国家集训队 小Z的袜子(hose) Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼 ...

  9. Redis中关于Hash键的一些问题

    Hash键存在的意义: 1.Hash键可以将信息凝聚在一起,而不是直接分散的存储在整个Redis中,这不仅方便了数据管理,还可以尽量避免一定的误操作: 2.避免键名冲突: 3.减少内存占用.(最重要的 ...

  10. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...