这几天博主刻苦研究了下 Shell 编程,感觉 Shell 编程是一门非常强大的语言。

下面就Shell 编程的几个点进行下讲解:

一.Shell 编程的基本含义 (一个最简单的Shell 程序 /   Shell 编程的注意点)

二.Shell 的变量 与 变量的赋值 /  变量的作用域

三.Shell 的内置变量 与 参数 (Shell脚本 参数、Shell函数 参数)

四.Shell 的数组

五.Shell 的函数

六. Shell 的 条件控制 if /  if elif / if  elif  else / case in casc

七. Shell 的 循环控制  while do / until / for / for in /

八. Shell 的数字运算


一.Shell 编程的基本含义:

我理解的Shell 编程可以理解为一堆Shell 命令的集合

No.0 一个最简单的Shell 程序

#!/bin/bash
a="123456789123456789"
b=$((a+13))
echo $b

上面就是一个简单的Shell 程序,主要功能是进行大数加法。

我知道如果有一些编程的经验的程序猿肯定对这个程序不屑一顾,下面给出一个稍微复杂一点的程序。

No.1 稍微复杂一点的Shell程序

#!/bin/bashsour="data.txt"
out="data_new.txt"ct=$(wc -l $sour | awk '{print $1}')
echo "source file lines : $ct"
lines=$(( ($RANDOM%10+90)*ct/100 ))
echo "should be change lines : $lines"awk -v num=$lines  -F'&' '
BEGIN{srand();
}
{if(NR<=num){   split($2,a,"=");ct=int(rand()*100%9);a[2]=a[2]+ct;gsub(/cid=[0-9]*/,"cid="a[2],$0);#$2=a[1]"="a[2];}print $0;
}
' $sour > $outold=$(wc -l $sour | awk '{print $1}')
new=$(wc -l $out | awk '{print $1}')echo "old file has $old lines"
echo "new file has $new lines"

通过这个Shell 程序,我们可以看到Shell 程序的一些基本特征, 也就是一些值得注意到的地方

值得注意的点  (如果没有写过Shell,大家一定要阅读以下几点)

1.bash 程序的典型特征

第一行 #! /bin/bash 表示该程序由 /bin/bash 进行执行解析。

2.bash 程序的注释

Shell 程序的注释用 # 进行表示, # 表示单行注释,

3.Shell 的数字运算

Shell 程序如果要进行数学运算,需要把计算表达式用 $(( )) 括起来, 如 lines=$(( ($RANDOM%10+90)*ct/100 ))

二.Shell 的变量 与 变量的赋值 /  变量的作用域

一. 基本的变量的赋值

Shell 中的变量赋值不需要预先定义再使用,可以直接使用。(默认为空)

a=3

b="A String"

这种方式即可。

不过有些需要注意的地方:

1.变量与变量内容以一个等号“=”来连接

2.等号两边不能接空格符

正确 a=3   错误 a = "3"

3.变量名称只能是英文字母与数字,但是开头字符不能是数字。

4.变量内容若有空格符可用双引号“”  或者 单引号 ‘’ 将变量内容结合起来

若 var=lang is $LANG, 则 echo $var 可得 lang is en_us

5.单引号内的特殊字符仅为一般字符(纯文本)

若 ar='lang is $LANG'    则 echo $ar,  可得 lang is $LANG

6.可用转义字符“ \ ”(反引号) 将特殊符号变成一般字符

7.如果需要其他命令的执行结果再进行赋值

可以使用 反引号 `命令`    或  $(命令)

8.若该变量为了增加变量内容时,可用 $变量名 或 ${变量名} 累加内容

如 PATH="$PATH":/home/bin

9.若该变量需要在其他子进程执行,需要 export 使变量变成环境变量

export PATH

10.通常大写字符为系统默认变量。自行设置变量可以使用小写字符,方便判断

11.取消变量的方法为使用 unset 变量名称,例如取消 myname 的设置

二. 对于获取命令执行后的结果 的 赋值

对于变量,经常我们要赋予摸一个命令的返回值,比如 a=(某文件的行数)   。。。。

这时候该怎么办呢?

有两种方法

方法一 ` 命令` (注意该符号为反引号,即 TAB 上面的那个按键 )

方法二   $(命令)

三.将变量内容交-》命令处理

主要是通过管道符进行接收

示例

echo sssss | grep (grep的正常处理)

三.Shell 的内置变量 与 参数 (Shell 参数、Shell函数 参数)

1) Shell 的内置变量

Shell 脚本中有一些内置变量,举个例子

$RANDOM : $RANDOM用来获取随机数

$? :返回上一个命令执行的结果

2)Shell 参数  、 Shell 函数参数

Shell 脚本的参数 、Shell  函数的参数

我们编写Shell 脚本的时候,在运行shell 脚本经常使用各种各样的参数,

举个例子:

tar -zxv -f filename -C target    //解压 tar.gz / .tgz 到指定文件夹

那大家一定好奇,Shell 是如何得 filename target 这些参数的呢?

Shell 脚本 参数可以通过以下几个变量进行获取,

./script  opt1 opt2 opt3

$0 $1 $2 $3

$0 为脚本本身的名字 ./script

$1 为脚本后面的第一个参数

...

$#  :(常用)代表后面接的参数“个数”

$@ :(常用)代表 “$1” "$2" "$3" "$4"

$* : 代表 “$1c$2c$3c$4” 其中c为分割字符,默认为空格键,所以本例中代表 “$1 $2 $3 $4”

对于Shell 里面的函数也是一样的

$0 :Shell 脚本的名字 **这点注意***

$1 : Shell 函数的第一个参数

$2 : Shell 函数的第二个参数

下面以一个比较典型的例子进行举例

#!/bin/sh
echo "The first parameter is $0"
echo "The second parameter is $1"
echo "The whole parameters is $@"
echo "The parameters num is $#"
arr=("$@")
echo ${arr[0]}
echo ${arr[1]}function a(){echo "What's  this? $0;"echo "What's  this? $1;"echo "The whole function parameters are $@ "echo "The whole function parameters are $# "echo "The whole function parameters are $*"
}a 10 11;

上面的例子综合使用了变量,数组,函数,变量的作用域等知识点

通过以上例子,我们可以看出来几点

我总结一下,不对的地方希望读者指出

1.$@, $#, $* 变量可以用于提取参数,这三个变量是有作用域的,

对于整个脚本层次,

$@, $#, $*  可以得到脚本的一些运行参数

对于函数层次,

$@, $#, $* 可以的到函数的一些运行参数

2. $0, $1, $2 ... 基本也遵循以上的规律

唯一要注意的一点就是:$0 无论是在脚本层次  或者 函数层次 都是执行的脚本 的脚本名称。

四.Shell 的数组

shell 脚本中的数组使用十分简便:

1.定义数组

示例:

a=(1 2 3) /        arr=("$@")

即可定义一个数组,数组中有三个元素 1 ,2 ,3

2. 获取数组的元素  (数组的下标是从1开始的)

echo ${a[0]} //打印数组的第一个元素
echo ${a[1]} //打印数组的第二个元素

3.获取数组长度等

数组元素个数/长度     ${#array[@]}//即得到所有元素,利用 # 得到长度。 

同理:

字符串的长度:  ${#str}

五.Shell 的函数

函数的定义只要用 function 即可 ,

不过有一些值得注意的地方

1.Shell 函数的返回值一定要是整数,否则会报错

2.要得到函数的返回值,可以用 $?  来获取上一条命令执行的结果进行获取

示例如下:

function a(){echo "What's  this? $0;"echo "What's  this? $1;"echo "The whole function parameters are $@ "echo "The whole function parameters are $# "echo "The whole function parameters are $*"return 3;   #Shell 函数执行的结果必须为整数
}# re=`a 10 11`; #re 接收不到函数执行的结果
a 10 11
echo "result is $? "

五.Shell 的条件控制


首先讲一个东西,判别式 [ 判断内容 ]  外面为中括号[]

就是相当于 c/c++里面的 if ()

注意 Linux的判断式,两端需要有空格

一.if

(1)

if [ 条件判断式 ]; then

程序段

fi

(2)

if [[ 条件判断式 ]]; then

程序段

fi

尤其是在判断空字符串的时候,参考以下代码

if [[ ${1} == "" ]];thenecho "Please indicate the cassandra Address."echo "Use this cmd like this:"echo "./clear_data.sh 192.102.1.1"exit
fi;

stack-overflow 上的tips

http://stackoverflow.com/questions/19691082/why-am-i-getting-a-unary-operator-expected-error

二.if else

if [ 条件判断式 ]; then

程序段

else

程序段

fi

三.if elif else

if [条件判断式一]; then

程序段

elif [条件判断式二]; then

程序段

else

程序段

四.case esac

case $变量 in

"A变量")

程序段

;;

"B变量")

程序段

;;

*)

程序段

;;

esac

======================================================================

示例代码

if elif if

#!/bin/shread -p "Please input (Y/N) : " ynif [ "$yn" == "Y" ] || [ "$yn" == "y" ];thenecho "OK, contiue"
elif [ "$yn" == "N" ] || [ "$yn" == "n" ];thenecho "You choose no"
elseecho "Unknown choose"
fi

case esac

#!/bin/bash#read -p "Input your choice: " choice
case $1 in"one")echo "Your choice is ONE";;"two")echo "Your choice is TWO";;"three")echo "Your choice is THREE";;*)echo "Usage $0 (one|two|three)";;
esac


七. Shell 的 循环控制  while do / until / for / for in / 


一. while

while [ condition ]

do

程序段落

done

二.until

until [ condition ]

do

程序段

done

三.for in

for var in con1 con2 con3 ...

do

程序段

done

四.for

for (( 初始值; 限制值; 执行步长))

do

程序段

done


示例代码

until

#!/bin/bashuntil [ "$yn" == "yes" ] || [ "$yn" == "YES" ];doread -p "Please input yes/YES to stop this program: " yn
done
echo "OK! you input right selection"

while

#!/bin/bashs=0
i=0
while (($i != 100))
doi=$(($i+1))s=$(($s+$i))
done
echo "The sum of 1-100 is $s"

for in

#!/bin/bashanis=(dog cat ant)for ani in ${anis[@]}
doecho "There are ${ani}s"
done

Shell使用 break 和 continue 来跳出循环。

break命令

break命令允许跳出所有循环(终止执行后面的所有循环)。

下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,就要使用break命令。

  1. #!/bin/bash
  2. while :
  3. do
  4. echo -n "Input a number between 1 to 5: "
  5. read aNum
  6. case $aNum in
  7. 1|2|3|4|5) echo "Your number is $aNum!"
  8. ;;
  9. *) echo "You do not select a number between 1 to 5, game is over!"
  10. break
  11. ;;
  12. esac
  13. done

在嵌套循环中,break 命令后面还可以跟一个整数,表示跳出第几层循环。例如:

  1. break n

表示跳出第 n 层循环。

下面是一个嵌套循环的例子,如果 var1 等于 2,并且 var2 等于 0,就跳出循环:

  1. #!/bin/bash
  2. for var1 in 1 2 3
  3. do
  4. for var2 in 0 5
  5. do
  6. if [ $var1 -eq 2 -a $var2 -eq 0 ]
  7. then
  8. break 2
  9. else
  10. echo "$var1 $var2"
  11. fi
  12. done
  13. done

如上,break 2 表示直接跳出外层循环。运行结果:

1 0
1 5

continue命令

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

对上面的例子进行修改:

  1. #!/bin/bash
  2. while :
  3. do
  4. echo -n "Input a number between 1 to 5: "
  5. read aNum
  6. case $aNum in
  7. 1|2|3|4|5) echo "Your number is $aNum!"
  8. ;;
  9. *) echo "You do not select a number between 1 to 5!"
  10. continue
  11. echo "Game is over!"
  12. ;;
  13. esac
  14. done

运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句

  1. echo "Game is over!"

永远不会被执行。

同样,continue 后面也可以跟一个数字,表示跳出第几层循环。

再看一个 continue 的例子:

  1. #!/bin/bash
  2. NUMS="1 2 3 4 5 6 7"
  3. for NUM in $NUMS
  4. do
  5. Q=`expr $NUM % 2`
  6. if [ $Q -eq 0 ]
  7. then
  8. echo "Number is an even number!!"
  9. continue
  10. fi
  11. echo "Found odd number"
  12. done

运行结果:

Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number




八. Shell 的数字运算

Shell 程序如果要进行数学运算,需要把计算表达式用 $(( )) 括起来, 如 lines=$(( ($RANDOM%10+90)*ct/100 ))



九.一些额外的参考资料

Shell 变量

http://www.runoob.com/linux/linux-shell-variable.html

Shell 中变量比较

http://blog.csdn.net/weiyuweizhi/article/details/7488388

http://blog.sina.com.cn/s/blog_4b2117ea0100x1i1.html

Shell 数组

http://www.poluoluo.com/server/201004/82896.html

Shell函数

http://blog.csdn.net/ljianhui/article/details/9333443

http://www.jb51.net/article/33899.htm

函数定义,变量作用域范围

http://www.jb51.net/article/33899.htm


Bash 条件判断

http://codingstandards.iteye.com/blog/780156

Bash循环

http://blog.sina.com.cn/s/blog_9d074aae01012ytf.html

字符串

Bash字符串分割

http://www.cnblogs.com/FlyFive/p/3640243.html

Linux_Shell Shell编程简介相关推荐

  1. 【shell编程】1、shell编程简介

    Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释 ...

  2. centos7 shell编程

    Shell编程 简介 shell 是linux命令解释器,shell编程,就是Linux命令的组合: centos6启动走init,centos7启动走systemd 格式 vim a.sh 在lin ...

  3. [No000014A]Linux简介与shell编程

    Linux 介绍 内核 库: .so 共享对象,windows:dll 动态链接库 应用程序 Linux的基本原则: 1.由目的单一的小程序组成:组合小程序完成复杂任务: 2.一切皆文件: 3.尽量避 ...

  4. shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)

    一,Shell编程四剑客之Find 通过如上基础语法的学习,读者对Shell编程有了更近一步的理解,Shell编程不再是简单命令的堆积,而是演变成了各种特殊的语句.各种语法.编程工具.各种命令的集合. ...

  5. shell 语法简介(转载)

    一.基本语法 1.1.shell文件开头 shell文件必须以下面的行开始(必须方在文件的第一行):  #!/bin/sh  符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使 ...

  6. Shell编程(week4_day1)--技术流ken

    本节内容 1.shell简介 2. shell分类 3. 查看shell 4. 第一个shell脚本 5. shell编程常用命令   5.1 grep   5.2 cut   5.3 sort   ...

  7. Linux下的shell编程入门

    通常情况下,我们从命令行输入命令每输入一次就能够得到系统的一次响应.一旦需要我们一个接着一个的输入命令而最后才得到结果的时候,这样的做法显然就没有效率.要达到这样的目的,通常我们利用shell程序或者 ...

  8. Linux Shell 编程学习总结

    Shell 教程 Shell简介:什么是Shell,Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成 ...

  9. linux shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select 学习笔记

    SHELL编程一UNIX和Shell工具简介 什么是shell? shell只是一个程序,它在系统中没有特权.因此,有多个不同风格shell共同存在原因--Bourne Shell,Korn Shel ...

最新文章

  1. mysql主从复制延时性问题_MySQL主从同步延迟原因及解决办法
  2. java log4j mysql_java – 配置log4j属性文件以存储在mysql数据库中
  3. python可以用来做什么-Python 学会之后可以用来干嘛的?
  4. jQuery练习---- 超简单的表格悬停变色Demo
  5. 从表到里学习JVM实现
  6. 使用Nomad构建弹性基础架构:计划和自我修复
  7. 怎么判断ajax返回是否成功,如何判断jquery的ajax请求已经返回
  8. PyTorch入门v2.pptx
  9. python高维数据_t-SNE高维数据可视化(python)
  10. 4. linux调用文件计算阶乘前5项和_嵌入式Linux系统编程——文件读写访问、属性、描述符、API
  11. Leetcode每日一题:136.single-number(只出现一次的数字)
  12. 【笔试/面试】排列组合与概率计算(二)
  13. [ER/Studio]进行不同版本数据库结构的合并
  14. Springboot毕设项目会议预约系统设计与实现3if68(java+VUE+Mybatis+Maven+Mysql)
  15. 估计的商是什么意思_商_商是什么意思_商字怎么读_商的含义_商字组词-新东方在线字典...
  16. python2在线编译器_C/C++/Python在线编译器
  17. sql server返回是星期几的函数
  18. 训练第一步:python获取文件下图片
  19. MySQL- cluster集群----实现高可用
  20. 准备好春招了么?上科大小哥的面试题与复习资料祝你寒假无忧

热门文章

  1. HTML input去掉边框
  2. MongoDB添加索引
  3. 农村土地确权之例会纪要—— 新蔡县土地确权第十次例会及苍穹软件第二次培训纪要
  4. 什么样的人适合创业开公司(转贴)
  5. python有什么库可以 从fig文件中读取数据_Python之matplotlib库学习:实现数据可视化...
  6. 能实现报表打印功能的报表软件有哪些?
  7. python写的多线程 代理服务器 抓取,保存,验证程序【转】
  8. HEVC参考软件HM源码分析--帧间预测(1)--xCompressCU
  9. 7200套非标机械设计自动化设备运行工厂工作流水生产线视频实拍
  10. 4W家庭理财 V1.0