1.shell简介

1.1 什么是shell

Shell 是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
交互的方式:从键盘输入命令,通过/bin/bash的解析,可以立即得到Shell的回应

[root@clsn ~]# ls
anaconda-ks.cfg
[root@clsn ~]# echo ls |bash
anaconda-ks.cfg

非交互的方式: 脚本

1.2 shell脚本

shell脚本就是一种专门使用shell编写的脚本程序,它虽然没有C++、Java、Python等一系列高级语言功能强大,但是在服务器运维领域以及嵌入式开发领域,shell脚本具有举足轻重的地位。

脚本语言定义:
为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。
特点:程序代码即是最终的执行文件,只是这个过程需要解释器的参与,所以说脚本语言与解释型语言有很大的联系。脚本语言通常是被解释执行的,而且程序是文本文件。
典型的脚本语言有,JavaScript,Python,shell等。

1.3 运行shell脚本

  • 方式1(输入脚本的绝对路径或相对路径)
    说明:首先要赋予helloworld.sh脚本的+x权限,再执行脚本
    比如./hello.sh 或者使用绝对路径 /root/shcode/hello.sh
  • 方式2(sh+脚本)
    说明:不用赋予脚本+x权限,直接执行即可。
    比如 sh hello.sh,也可以使用绝对路径

shell脚本编写如下,并将其保存为test.sh,进入存放此文件目录

#!/bin/bash
echo "Hello World"
  • 当作为可执行程序运行时候
chmod +x test.sh    # 赋予可执行权限
./test.sh           # 执行程序
  • 作为解释器参数运行
/bin/sh test.sh      # 执行命令
/bin/php test.php   # 执行命令

1.4 shell注释

  • 单行注释:和python注释相同,以#号开头作为单行注释
# 这是一个注释
# author:ohuohuoo
# date:`date`
  • 多行注释:可以将其定义为一个花括号的注释函数,也可以用多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF# EOF可以换成其他符号
:<<E!
注释内容...
注释内容...
注释内容...
!

1.5 shell编写的基本步骤

  • 建立shell文件
  • 赋予shell文件可执行程序权限(使用chmod命令修改权限)
  • 执行shell文件(直接运行赋予权限后的二进制文件)

2.shell变量

  • Linux Shell中的变量分为,系统变量和用户自定义变量。
  • 系统变量:$HOME$PWD$SHELL$USER等等,比如:echo $HOME等等.
  • 显示当前shell中所有变量: set

2.1 变量定义

  • 定义变量: 变量名=值
  • 撤销变量: unset变量
  • 声明静态变量: readonly变量,注意:不能unset
#!/bin/bash
#TASK1:define variable A
A=100
#Output A : $
echo A=$A
echo "A=$A"#TASK2: cancel A
unset A
echo "A=$A"#task3 define static variable B=2
readonly B=2
echo "B=$B"#unset B 不允许操作#将指令返回的结果赋给变量
C=date
D=`date`
E=$(date)
echo "C=$C"
echo "D=$D"
echo "E=$E"#使用环境变量TOMCAT_HOME
echo "tomcat_home=$TOMCAT_HOME"
"var.sh" 28L, 372C

结果:

shell中,英文符号"$"用于取变量值
如果在变量中使用系统命令,需要加上 " `"符号(ESC键下方)

DATE1=`date`
DATE2=$(date)

2.2 使用变量

使用变量的时,用英文符号"$"取变量值,对于较长的变量名,建议加上{ }花括号,帮助解释器识别变量的边界,如下

name="test_name"
echo "My name is ${name}and you"

2.3 环境变量

  1. export变量名=变量值(功能描述:将shell变量输出为环境变量/全局变量)
  2. source 配置文件(功能描述:让修改后的配置信息立即生效)
  3. echo $变量名 (功能描述:查询环境变量的值)

2.4 传递参数

  • 在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n
  • n 代表一个数字,$0为命令本身,$11为执行脚本的第一个参数,$2为执行脚本的第二个参数,以此类推……,10以上参数用大括号包含 ${10}
echo "传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

执行:

chmod +x test.sh
./test.sh 1 2 3

结果:

  • $* : 代表命令行中所有的参数,$*把所有的参数看成一个整体;
  • $@ : 代表命令行中所有的参数,不过$@把每个参数区分对待;
  • $# : 代表命令行中所有参数的个数;
  • $$ 脚本运行的当前进程ID号
  • $! 后台运行的最后一个进程的ID号

2.5 预定义变量

3.shell字符串

3.1 字符串类型

  • 使用单引号
    str='this is a string'

  • 使用双引号

name="ohouhuoo"
str="please input your \"$name"\"
echo -e $str
  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;可以在双引号中使用变量;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用;
  • 可以在双引号中使用转移字符;

3.2 字符串操作

获取字符串长度

使用" # "符号对字符串进行取值

string="abcd"
echo ${#string} # 输出 4
提取子字符串

使用字符串的截取命令,用于提取部分字符串

string="this is a test"
echo ${string:2:6} # 表示从第3个字符开始截取
查找字符串

用于查找字符的位置,输出结果为字符在字符串中所占的数据位置,如果查找多个字符,那哪个字母先出现就计算哪个;

string="this is a test"
echo `expr index "$string" it`  # 输出 1
查找it中i和t两个字符,t先出现,输出为1

4.shell数组

4.1 定义数组

# 一般定义
array_name=(value1 value2 value3 value4)# 多级定义
array_test=(
value1
value2
value3
value4
)#
array_text[0]=value0
array_text[1]=value1
array_text[3]=value3
...

4.2 数组操作

读取数组

和读取变量名相同,使用$符号,需要加上下标名

valuen=${array_name[n]}
echo ${array_name[@]} # 读取所有
获取数组长度

获取数组长度的方法与获取字符串长度的方法相同

# 取得数组元素的个数
length=${#array_name[@]}  # 从头到尾取
# 或者
length=${#array_name[*]}   # 取所有
# 取得数组单个元素的长度
lengthn=${#array_name[n]}  # 取特定

5.shell运算符

shell想要使用这些运算符,需要结合其他命令和工具来使用(因为shell中不支持简单的数学运算),如使用算符运算符就需要搭配的常用的工具有两种

  • awk
  • expr
#!/bin/bash
#计算(2+3)*4
#1)
RES1=$(((2+3)*4))
echo "res1=$RES1"
#2)
RES2=$[(2+3)*4]
echo "res2=$RES2"
#3) expr
TEMP=`expr 2 + 3`
#打空格 否则输出字符串
#乘法 \*
RES3=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES3"#计算命令行两个参数的和
SUM=$[$2+$1]
echo "sum=$SUM"

算数运算符

运算符 说明 例子
+ expr $a + $b
- expr $a - $b
\* expr $a \* $b
/ expr $a / $b
% 取余 expr $a % $b
= 赋值 a = $b
== 相等则返回 true [ $a != $b ]
!= 不相等返回 true [ $a != $b ]
  • 符号左右打空格 否则输出字符串

关系运算符

指定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。

布尔运算符

逻辑运算符

字符串运算符

文件测试运算符

6.shell编程中的命令

6.1 echo命令
6.2 printf命令
6.3 test命令

7.shell流程控制

7.1 if else条件

格式

if condition
thencommand1 command2...commandN
fi
# 写成单行
if condition;then command1; command2;fi
#存在不满足的条件
if condition
thencommand1 command2...commandN
elsecommand
fi

举例:

#!/bin/bash
#1)"ok"是否等于"ok"
#判断语句:使用=
if [ "ok" = "ok" ]
thenecho "equal"
fi#2)23是否大于22
#判断语句:使用 -ge
if [ 23 -ge 22 ]
thenecho "大于"
fi#3):/root/shcode/ifdemo.txt 目录中文件是否存在
#判断语句:使用 -f
if [ -f /root/shcode/ifdemo.txt ]
thenecho "存在"
fi#4)
if [ ppp ]
thenecho "output evyth"
fi

7.2 case条件

格式:

case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;
esac
  • 取值后面需要加上in
  • 每一模式必须以右括号结束
  • 每个模式结束后使用;;符号结尾
  • 如果没有找到对应的模式。以*结尾,并跳出case
  • case需要搭配esac结尾,与C语言中的switch … case语句类似

举例:

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read num
case $num in1)  echo '你选择了 1';;2)  echo '你选择了 2';;3)  echo '你选择了 3';;4)  echo '你选择了 4';;*)  echo '你没有输入 1 到 4 之间的数字';;
esac

执行脚本,运行如下:

输入 1 到 5 之间的数字:4
你输入的数字为 4!
输入 1 到 5 之间的数字:8
你输入的数字不是 1 到 5 之间的! 游戏结束

case中想要跳出循环有两个命令:breakcontinue

7.3 for循环

格式:

for var in item1 item2 ... itemN
docommand1command2...commandN
done# 写成一行同样使用分号将语句分开 
  • in列表中可以包含替换、字符串和文件名等
  • in列表是可选的,如果默认不适用,将会循环使用命令行中的位置参数

举例:

for num in 1 2 3 4 5
doecho "The value is: $num"
done

结果:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

7.4 while循环

格式:

while condition
docommand
done

输入值跳出循环举例:

echo '按下 <Q> 退出'
echo -n '输入你最喜欢的歌名: '
while read SONG
doecho "啊!$SONG 真是一首好歌"
done

7.5 until循环

8.shell函数

8.1 定义函数

[ function ] funname [()]
{action;[return int;]
}
  • function fun () 表示有返回参数的函数(如同C语言中的有返回类型的函数(int,char等))
  • fun() 表示无返回参数的函数(类似于C语言中的void类型函数)
  • 使用return可以返回参数值(一般为数值n),如果不使用,将默认以最后一条命令运行的结果作为返回值

8.2 参数定义

此外想要使用shell函数传递参数时,需要在函数体的内部,通过 $n 的形式来获取参数的值,与其他语言不同的是,这不是在定义函数的时候就给定参数,而是在函数体中获取到的参数,例如,$1表示第一个参数,$2表示第二个参数,参数调用列表如下

参数处理 说明
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

举例:

#!/bin/bash
FunParam(){echo "输入第一个参数 $1 !"echo "输入第二个参数 $2 !"echo "输入第十个个参数 $10 !"echo "参数总数共 $# 个!"echo "作为一个字符串输出所有参数 $* !"
}
FunParam 1 2 3 4 5 6 7 8 9 10

结果

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
参数总数有 10 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 10!

shell脚本编程 学习笔记相关推荐

  1. shell脚本编程学习笔记6(xdl)——字符串截取命令

    shell脚本编程学习笔记6--字符串截取命令 1,cut命令 [root@localhost ~]# cut [选项] 文件名-f 列号,表示提取第几列-d 分隔符,按照指定的分隔符分割列注意:默认 ...

  2. shell脚本编程学习笔记8(XDL)——流程控制和循环

    shell脚本编程学习笔记8--流程控制和循环 1,if语句 1,框架 1,单分支:if [条件判断式] ;thenprogramfiif [条件判断式]thenprogramfi注意:if语句使用f ...

  3. shell脚本编程学习笔记1(xdl)——shell基础与Bash基本功能()

    shell脚本编程学习笔记1--shell基础与Bash基本功能 1,简介: 1,Shell就是一个命令行解释器,用以连接输入设别和内核. 2,Shell是解 释执行的脚本语言,在Shell中可以直接 ...

  4. shell脚本编程学习笔记5(xdl)——正则表达式

    shell脚本编程学习笔记5--正则表达式 1,简介 正则表达式,用来在文件中匹配符合条件的字符串,包含匹配.注意是文件中选择字符串,和通配符是 不同的.grep,awk,sed等命令可以支持正则表达 ...

  5. shell脚本编程学习笔记2(xdl)——Bash变量

    shell脚本编程学习笔记2--Bash变量 1,变量简介 1,计算机内存单元2,设置规则字母数组下划线组成,不能以数字开头Bash中,默认类型字符串型,变量类型可修改 2,Bash变量规则 1,变量 ...

  6. shell脚本编程学习笔记4(xdl)——Bash常见环境变量

    shell脚本编程学习笔记4--Bash常见环境变量 非专业运维,例如开发人员,环境变量熟悉常见的,了解不常见的即可. 1,简介 环境变量配置文件中主要是定义对系统的 操作环境生效的系统默认环境变量, ...

  7. shell脚本编程学习笔记7(XDL)——字符处理命令和条件判断

    shell编程学习笔记--字符处理命令和条件判断 1,字符处理 [root@localhost ~]# sort [选项] 文件名 选项: -f: 忽略大小写 -n: 以数值型进行排序,默认使用字符串 ...

  8. Linux Shell脚本编程学习笔记和实战

    http://www.1987.name/141.html shell基础 终端打印.算术运算.经常使用变量 Linux下搜索指定文件夹下特定字符串并高亮显示匹配关键词 从键盘或文件里获取标准输入 [ ...

  9. shell脚本编程学习笔记(四)shell操作数据库

    一.数据库基本操作 1)登录mysql服务器:mysql -u root -p 密码 2)查看数据库:show databases 3)查看表:show tales from db; 4)查看表结构: ...

最新文章

  1. C#中用schema验证xml的合法性
  2. python基础-字典
  3. Django使用心得(四)
  4. linux(1)- 简单的 shell 解释器
  5. VScode使用python的yapf库
  6. OpenCV—矩阵数据类型转换cv::convertTo
  7. mysql 12142_php连接mysql的类mysql.class.php
  8. 寒冷的高纬度——我的梦开始的地方
  9. Django(part2)--创建项目与Django目录结构
  10. java运行时读取注解_Java自定义注解和运行时靠反射获取注解
  11. android setimageresource取list的,Java ImageView.setImageTintList方法代码示例
  12. LeetCode 1324. 竖直打印单词
  13. 微信公众开放平台开发07---java servlet 实现微信开发第一步:微信服务器验证
  14. React Native Fetch封装那点事...
  15. html标签种类很多,为什么不都用div?
  16. antd table动态表头_jQuery的datatable动态列处理,轻松重绘表格
  17. phpcms图库_love.php
  18. 关闭防火墙linux出错,linux关闭防火墙【应对办法】
  19. 前端开发:Vue项目中解决Emitted value instead of an instance of Error问题
  20. MSA多序列比对(multiple sequence alignment)

热门文章

  1. Ubuntu 开机黑屏两大原因解决办法
  2. 性能测试loadrunner之Analysis、WIN服务资源监控、nomon工具介绍、性能测试报告
  3. 政府信息化建设之——微门户和政务微信
  4. android 类似金山词霸 每日一句源代码 csdn,个人作业2——英语学习APP案例分析(示例代码)...
  5. Jenkins在tomcat中启动配置nginx
  6. 规模划分电子计算机,电子计算机按规模划分,可以分为_____。
  7. android电视查看百度网盘,百度网盘如何投屏到电视?百度网盘投屏到电视的方法...
  8. Unity打包Android的apk文件时有关Json的注意事项
  9. Remoting安全设置
  10. 广发催收流程全解,你还敢欠钱不还吗