Linux体系中的shell编程在实现系统管理与维护、系统使用、用户环境定制等方面作用突出。

使用shell写的程序通常也称为脚本。

在用户主目录中,在/etc目录中,随处可见脚本文件。

脚本是由各种变量、表达式、命令等通过一定的逻辑组装而成的,具有顺序解释执行的特性。

文章目录

  • 1、Shell脚本基本结构
    • 1.1、Shell脚本的运行过程
    • 1.2、Shell脚本及运行
  • 2、Shell变量及表达式
    • 2.1、变量类型
    • 2.2、注意问题
    • 2.3、常用的Shell预定义变量
    • 2.4、位置参数(程序的参数)
    • 2.5、缺省参数(位置替换)
  • 3、Shell脚本流程控制
    • 3.1、分支语句
    • 3.2、循环控制
    • 3.3、函数
    • 3.4、数组
    • 3.5、序列函数
    • 3.6、补充:细节问题

1、Shell脚本基本结构

#!/bin/bash  # 脚本必须以#! 开始
#! 表示:/bin/bash将执行该脚本文件中的程序
# 表示此后的字符串为注释

脚本支持:变量、表达式、流程控制、函数、注释、各种外部命令和程序调用、命令行参数、系统变量等等。

脚本就是将上述各种元素通过一定的逻辑关系进行组装已完成特定任务的程序。


1.1、Shell脚本的运行过程

1.创建文件
2.设置可执行权限
3.执行Shell程序 ./
4.使用bash命令执行程序 sh


1.2、Shell脚本及运行

step1.利用vi编辑如下脚本并保存成 first.sh

#!/bin/bash
echo “Hello,welcome to Linux world”
echo “Today is: $(date)”

Step2. 设置执行权限:

chmod u+x first.sh

Step3. 执行脚本:

./first.sh   或  sh  first.sh   或  bash first.sh

2、Shell变量及表达式

2.1、变量类型

A.环境变量(系统工作环境需要的全局变量)

     $PATH, $BASH, $HOME, $PWD ,$TERM, $PWD

B.自定义变量(仅在脚本中使用局部变量)

 语法格式:变量名=变量值    #变量名约定大写

例如:

A=10;  echo $A
SA=“hello Linux”; echo $SA

C. 只读变量 readonly 变量名

D. 导出局部变量 export 变量名(或者 export 变量名=变量值

E. 函数中的同名局部变量: local 变量名=变量值


2.2、注意问题

几个注意问题

A. 变量指向一个字符串(含有空格),则变量值必须使用双引号括起来。
例如:

SA=“Hello Linux”

B. 引用时变量前加$,单引号和双引号的区别
例子:

SA=“hello Linux”; echo $SA
echo '$SA';   echo "$SA"-----------------
结果:
hello Linux   #都不加
$SA           #加单引号
hello Linux   #加双引号

C.清除不需要的变量:unset 变量名
如:unset SA


2.3、常用的Shell预定义变量

$#:位置参数的数量。

$*:所有位置参数的内容。

$?:命令执行后返回的状态。

$$:当前进程的进程号。

$!:后台运行的最后一个进程号。

$0:当前执行的进程名。


2.4、位置参数(程序的参数)

一个关于命令位置参数的脚本文件 arg.sh

#!/bin/bash
echo “完整的命令行:$0$*”
echo “程序是:$0”
echo “所有的参数:$*”
echo “参数个数:$#”
echo “第1个参数: $1”

2.5、缺省参数(位置替换)

VAR=${参数-word}   :有则用参数,否则用word
VAR=${参数=word}  :有则用参数, 否则两个用word
VAR=${参数? word} :有则用参数,否则报错退出
VAR=${参数+word}  :有则用word,否则不做

注意:上述四条经常用在位置参数的使用上。
示例:

#!/bin/bash
LEFT=${1-100}      #第一个参数缺省为100
RIGHT=${2-100}     #第二个参数缺省为100
RE='expr $LEFT + $RIGHT'    #进行相加echo "$LEFT + $RIGHT = $RE"------------------------
执行结果:
100 + 100 = expr $LEFT + $RIGHT

1、Shell中的变量表达式主要利用各种测试语句、条件来获得字符串、文件、数字等所处的状态。
表达式的操作符主要包括:

字符操作符: =, !=, -n , -z
数字操作符:-eq, -ne, -ge, -gt, -le, -lt ==,  !=,  >=,  >,   <=,   <
逻辑操作符:!, -a, -o
文件操作符:-d, -f, -L,-r, -w, -x, -s, -e, -z,-c, -b,-o
可以使用 test 命令来测试上述各种表达式状态。

2、test是Shell程序中的一个表达式,通过和Shell提供的if等条件语句相结合可以方便地测试字符串、文件状态和数字。其语法如下:

test [表达式]

3、表达式所代表的操作符有字符串操作符、数字操作符、逻辑操作符以及文件操作符,测试字符串是否相等,长度是否为零,字符串是否为NULL。
常用的字符串比较符号如下:

=:比较两个字符串是否相同,相同则为“是”。
!=:比较两个字符串是否相同,不同则为“是”。
-n:比较字符串的长度是否大于0,如果大于0则为“是”。
-z:比较字符串的长度是否等于0,如果等于0则为“是”。

示例:(字符串)

A=abcd; test $A = abcd; echo $?
A="  "; test –z $A; echo $?
test –n $A; echo $?
test –z “$A”; echo $?------------------------
执行结果:
0
1
0
1

3、test语句不使用“>?”类似的符号来表达大小的比较,而是用整数来表示,常用的数字比较符号如下。

-eq:相等。
-ge:大于等于。
-le:小于等于。
-ne:不等于。
-gt:大于。
-lt:小于。

示例:(数字比较)

A=1234; test $A –eq 1234; echo $?
test  $A –gt  1000; echo $?------------------------
执行结果:
0
0

4、常用的逻辑测试符号如下:

!:与一个逻辑值相反的逻辑值。
-a与(and):两个逻辑值都为“是”返回值才为“是”,反之为“否”。
-o或(or):两个逻辑值有一个为“是”,返回值就为“是”。

5、文件测试表达式通常是为了测试文件的文件操作逻辑,测试符号如下:

-d:对象存在且为目录,则返回值为“是”。
-f:对象存在且为文件,则返回值为“是”。
-L:对象存在且为符号连接,则返回值为“是”。
-r:对象存在且可读,则返回值为“是”。
-s:对象存在且长度非0,则返回值为“是”。
-w:对象存在且可写,则返回值为“是”。
-x:对象存在且可执行,则返回值为“是”

示例:(逻辑比较)

test  -f /etc/passwd –a –s /etc/passwd;echo $?
test  -f /etc/passwd –a –d /etc/passwd;echo $?
test  -d /root; echo $?
test ! –z /etc/passwd;  echo $?------------------------
执行结果:
0
1
0
0

3、Shell脚本流程控制

Shell支持的流程控制语句主要有:

分支语句:if   elif  else fi,  case …  esac
循环语句:for, while, until
函数定义:function  funname()

3.1、分支语句

3.1.1、if

①单分支(常见)

if [ 条件 ]
then语句
fi 或者
if ((条件))
then语句
fi 或者(常见)
if [ 条件 ]; then语句
fi  或者
if ((条件)); then语句
fi

②双分支

if [ 条件 ]
then语句
else语句
fi

③多分支

if [ 条件 ];then语句
elif [ 条件 ];then语句
else语句
fi

注意[ 条件 ]中,条件前后必须留有一个空格[];then连在一起写,必须加上分号;


3.1.2、case

case  表达式 in
expr-1)  命令1;;
expr-2)  命令2;;
…
*) 其他命令
esac

示例 1:

echo  -n "Input A="
read A
case  $A in
1)echo "select 11";;
2)echo "seelct 22";;
*)echo "select else";;
esac------------------------
执行结果:
Input A=1
select 11     # 输入的值为1结果Input A=2
seelct 22   # 输入的值为2结果

示例 2:

echo  -n "Input A="
read A
case  $A in
"fu zhou")echo "select 11";;
"xia men")echo "seelct 22";;
*)echo "select else";;
esac------------------------
执行结果:
Input A=fu zhou
select 11      # 输入的值为fuzhou结果Input A=xia men
seelct 22   # 输入的值为xiamen结果

注意:如果是字符串变量且含有空格,则必须在匹配位置加上引号,如"fu zhou"。


3.1.3、菜单式

示例:

OPTIONS="fuzhou  xiamen"
select  opt in $OPTIONS; do
case "$opt" in
fuzhou)  echo "select fuzhou";;
xiamen)  echo "select xiamen";;
*)  exit;;
esac
done-------------------
执行结果:
1) fuzhou
2) xiamen

注意:可能没有循环执行!


3.2、循环控制

3.2.1、for

for  变量 [ in 数值列表]     # for i in 1 2 3 4
do        #省略 [ ]  则表示取编所有位置参数命令
done

示例:(实现1加到100)

sum=0
len=101  #指定循环次数
for((i=1;i<"$len";i=i+1))
dolet sum=sum+$i
done
echo $sum----------------
执行结果:
5050

3.2.2、while

while 条件命令为真
do命令
done

示例:(实现1加到100)

k=1
sum=0
while [ $k –le 100 ]
dolet sum=$sum+$klet k++
done
echo $sum------------------
执行结果:
5050

注意:如果没有条件命令只有:代表无限循环

while :        #无限循环
do命令
done

3.2.3、until

until 条件命令为假
do命令
done

示例:(实现1加到100)

k=1
sum=0
until [ $k –gt 100 ]
dolet sum=$sum+$klet k++
done
echo $sum------------------
执行结果:
5050

注意:如果没有条件命令只有:代表无限循环

until :        #无限循环
do命令
done

3.3、函数

function  函数名()
{[return 整数]
}

注意:
[1]函数必须先声明,才能调用
[2]函数中的变量同全局变量名相同时,则使用 local val=value
定义局部变量
[3]无需(不能)定义参数
[4]如果没有return则最后一条命令的返回值就是函数的返回值。

示例 1:

#!/bin/bash
gsum=0
function sumn()
{  sum=0for((i=1;i<=$1;i++))dolet sum=$sum+$idonegsum=$sumreturn $sum
}
sumn 10
echo "sum=$?"-------------------
执行结果:
sum=55调用注意:
[1] 直接传递参数,如 sumn 10
[2] 函数就是命令,返回值只能通过 $?获取,如 echo “sum=$?”
[3] 如果需要返回变量值, 则通过全局变量带回值,如 gsum

示例 2:

#!/bin/bash
gsum=0
function sumn()
{  local gsum=0for((i=1;i<=$1;i++))dolet gsum=$gsum+$idonereturn $gsum
}
sumn 10
echo "sum=$?"
echo  $gsum------------------
执行结果:
sum=55
0调用注意:
[1] 全局变量和局部变量的使用区别,如gsum

3.4、数组

[1]定义:
A=(元素列表,空格隔开)
下标从0开始,如A=(a b c d)[2]数组长度 ${#A[*]}[3]引用第i个元素 ${A[$i]}[4]赋值 A[$i]=value[5]以字符串输出所有元素
echo  ${A[*]}[6] 循环输出所有元素
Len=${#A[*]}
for((i=0;i<“$Len”;i++))
doecho ${A[$i]}
done
或者
for value in ${A[*]}
doecho $value
done

3.5、序列函数

seq
生成一个序列(有点类似python中的range函数)

示例:

生成从1到100的100个元素的数组:
A=seq 100       # seq 1  to
B=seq 1 100    # seq from  to

3.6、补充:细节问题

3.6.1、整数的四则运算

示例:

A=10
B=20C='expr $A + $B';echo $C         --->expr $A + $B
C='expr $A \* $B';echo $C       --->expr $A \* $BD=$(($A+$B));echo $D        --->30
D=$(($A*$B));echo $D       --->200
D=$((A+B));echo $D    --->30
D=$[$A+$B];echo $D        --->30
D=$[A+B];echo $D     --->30let E=A+B;echo $E       --->30
((F=A+B));echo $F      --->30let E=A*B;echo $E        --->200
((F=A*B));echo $F       --->200let A++;echo $A     --->11
((A++));echo $A   --->12let A+=10;echo $A     --->22
((A+=10));echo $A      --->32
((A*=10));echo $A      --->320

3.6.2、字符串函数

字符串A="HELL:LINUX:WORLD"

1. 获得字符串长度   LEN=${#A}
2. 提取6-10字符       SUB1=${A:5:5}   结果 LINUX
3. 从第6个字符开始提取   SUB2=${A:5}  结果 LINUX:WORLD
4. 将符号:替换为符号/  REP=${A//:/\/}结果 HELL/LINUX/WORLD将符号:替换为cc      REP=${A//:/cc}

3.6.3、浮点数运算

主要工具使用bc,(默认为整数运算,可以通过scale=bits,精度小数点尾数,+,-,*,/,^,%)

1. 计算 5-2/3 保留4位小数   A=$(echo "scale=4; 5-2/3"|bc)echo $A     ---->结果:4.33342. bc –q      #进入bc计算器环境scale=4  #设置小数点4位5-2/3quit         #退出环境3. bc –q  file       #执行file文件中的代码,类C代码。

示例:

define is_prime(n)
{ auto prime,i; prime=1; for (i=2;i^2<=n;++i){  if (n%i==0){   prime=0;   break;  } } return prime;
}
print "\nPlease enter a positive integer n:\n";
n=read();
print "\n\n"
for (i=2;i<=n;++i)
{ if (is_prime(i)){  print i;  print "\n"; }
}
quit;

复习(一)—— Shell基本编程相关推荐

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

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

  2. 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)

    大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程. 目录 前言 一.Shell 脚本基础说明 1.1 什么是 Shell 脚本 1.2 Shell 脚本的 ...

  3. Linux命令行与shell脚本编程大全:第2版

    <Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...

  4. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---34

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...

  5. 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程

    Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/ 转载于:https://www.cnblogs.com/pegasu ...

  6. Linux命令行与shell脚本编程大全(第3版)

    作者:[美] 布鲁姆(Richard Blum),布雷斯纳汉(Christine Bresnahan) 著,门佳,武海峰 译 出版社:人民邮电出版社 品牌:iTuring 出版时间:2016-08-0 ...

  7. 黑客进阶必读书《Linux命令行与Shell脚本编程大全》(第2版)

    欢迎来到命令行和shell脚本编程的世界!厚厚的一本小样书,拿在手上,厚厚的一本,六百多页.不只是掂在手上的重量,更是一本优秀的初学者入门指南,又会是你的Linux书库中非常不错的参考书.如果你想从整 ...

  8. (shell脚本编程)linux如何利用脚本执行多条命令以及linux如何执行定时任务

    文章目录 shell脚本编程 条件语句 脚本执行多条命令 执行定时任务 本文着重于提高我们的生产力,所以将这几个作为了一个专题. shell脚本编程 脚本中不同语句用分号隔开,和c语言一样. for, ...

  9. Linux_《Linux命令行与shell脚本编程大全》第十八章学习总结

    时间:2017年12月04日星期一 说明:本文部分内容均摘取自书籍<Linux命令行与shell脚本编程大全>,版权归原作者所有.<Linux命令行与shell脚本编程大全>( ...

  10. (C#)Windows Shell 外壳编程系列6 - 执行

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列5 - 获取图标 执行 许多人都知道 ShellExecute ,用于执行 ...

最新文章

  1. 对python源码进行编译,加密python脚本
  2. 417 Pacific Atlantic Water Flow 太平洋大西洋水流
  3. mysql逻辑备份之mysqldump
  4. haskell 求列表最大值_Haskell和自然数之基础篇
  5. 分享:TreeFrog 1.1 发布,C++ Web 应用开发框架
  6. 【Flink】Flink 流处理 Sum操作 Table is not an append-only table. Use the toRetractStream() in order to hand
  7. acc 蓝牙_蓝牙耳机什么牌子好,哪个品牌的无线蓝牙耳机便宜好用
  8. Wildcard Matching
  9. mysql压测宕机_MySQL压测时Linux中断异常飚高,原来是因为...
  10. php manual 下载,PHP - Manual手册 - Download下载
  11. 图解机器学习:分类模型性能评估指标
  12. 计算机主机ppt课件,怎么用电脑制作ppt课件
  13. 阿里倡导成立“罗汉堂”, 6名诺贝尔奖得主加入
  14. 摄影构图学83年绝版_学手机摄影最好要知道的70条忠告!都是大实话
  15. 家用计算机手抄报,大学计算机作业手抄报
  16. c语言中shift f12组合建,C++学习1-(C语言基础、VS快捷键)
  17. 三、使用HM进行简单的视频隐写demo
  18. 软件测试python掌握到什么程度_软件测试学习到什么程度能顺利工作?
  19. Qt如何自适应4k这些高分辨率屏幕
  20. 【input 身份证号】星号 代替,input 切割成 多个 小格格(类似)

热门文章

  1. Python 面向对象(二)类的继承
  2. 25. Leetcode 143. 重排链表 (链表-基础操作类-重排链表)
  3. MATLAB应用实战系列(五十四)-MATLAB多维度绘图实战应用案例
  4. ORACLE数据库安装图文教程
  5. MapReduce编程实战之“高级特性”
  6. erp服务器型号,erp服务器硬件配置
  7. adobe仿宋std r常规_宜春MF4003-5-06-CV-R气体质量流量计
  8. 深度学习100例 - 卷积神经网络(Inception V3)识别手语 | 第13天
  9. Python编程基础:第二十五节 args参数*args
  10. 【LeetCode从零单排】No112 Path Sum