一.Shell 编程的基本含义:

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

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

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

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

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

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

#!/bin/bash  
  
sour="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 > $out  
  
old=$(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 中的变量赋值不需要预先定义再使用,可以直接使用。(默认为空)

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 脚本 参数可以通过以下几个变量进行获取,

./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. 获取数组的元素

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 ()

一.if

(1)

if [ 条件判断式 ]; then

程序段

fi

(2)

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

程序段

fi

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

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

二.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/sh  
  
read -p "Please input (Y/N) : " yn  
  
if [ "$yn" == "Y" ] || [ "$yn" == "y" ];then  
    echo "OK, contiue"  
elif [ "$yn" == "N" ] || [ "$yn" == "n" ];then  
    echo "You choose no"  
else  
    echo "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/bash  
  
until [ "$yn" == "yes" ] || [ "$yn" == "YES" ];do  
    read -p "Please input yes/YES to stop this program: " yn  
done  
echo "OK! you input right selection"

while

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

for in

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

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

break命令

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

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

#!/bin/bash  
  
  
s=0  
i=0  
while (($i != 100))  
do  
    i=$(($i+1))  
    s=$(($s+$i))          
done  
echo "The sum of 1-100 is $s"  #!/bin/bash
while :
do
    echo -n "Input a number between 1 to 5: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "Your number is $aNum!"
        ;;
        *) echo "You do not select a number between 1 to 5, game is over!"
            break
        ;;
    esac
done

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

break n

表示跳出第 n 层循环。

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

#!/bin/bash
for var1 in 1 2 3
do
   for var2 in 0 5
   do
      if [ $var1 -eq 2 -a $var2 -eq 0 ]
      then
         break 2
      else
         echo "$var1 $var2"
      fi
   done
done

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

1 0
1 5

continue命令

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

对上面的例子进行修改:

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

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

echo "Game is over!"

永远不会被执行。

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

再看一个 continue 的例子:

#!/bin/bash
NUMS="1 2 3 4 5 6 7"
for NUM in $NUMS
do
   Q=`expr $NUM % 2`
   if [ $Q -eq 0 ]
   then
      echo "Number is an even number!!"
      continue
   fi
   echo "Found odd number"
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编程心得体会相关推荐

  1. c语言对编程对作用,c语言编程心得体会

    c语言编程心得体会 c语言是在国内外广泛使用的一种计算机语言.以下是小编整理的c语言编程心得体会,欢迎大家阅读! c语言编程心得体会1 说到我学习c语言时,真是用千言万语呀!记得刚开始学的时候,我的c ...

  2. linux系统编程心得体会范文大全,编程心得体会范文

    编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到相应结果的过程.下面是学习啦带来的编程的心得体会范文,欢迎欣赏. C语言是在国内外广泛使用的一种计算机语言.其语言功能丰富. ...

  3. 编程心得体会_生信编程语言的经验之谈

    对于生信狗来说,日常的数据分析任务大概可以分成三大类: 纯文本处理 数值计算 图表可视化 其中,对这几个任务的可选的解决方案,以及各自的最优解决方案分别为: 纯文本处理: Linux下的文本处理命令, ...

  4. 编程心得体会_CimatronE14高级五轴第三步,平行于曲线铣,会3轴编程更易理解

    总期第数:总第034期 本期话题:CimatronE14高级五轴第三步,平行于曲线铣,会3轴编程很好理解 话题意义:了解平行于曲线铣的基本用法 观点声明:本文观点仅代表无名之个人观点,只是基于个人认知 ...

  5. python编程心得体会800字_Python学习心得体会

    首先最开始,我们要明确一点,学习编程不是一日之功,需要每天投入时间学习,也不可纸上谈兵,需要自己亲自操作,不动手就不会发现问题,动了手印象才会深刻,记得更靠. 接下来我就稍微总结一下,我在学习中遇到的 ...

  6. Java编程心得体会

    初次学习Java编程的心得与体会 之前学习过c语言,python编程,对比Java编程首先感觉到的区别就是Java环境配置比较复杂,编程工具安装比较麻烦. 课堂上老师讲到首先下载安装jdk,然后安装e ...

  7. 测绘计算机编程心得体会,测绘心得体会

    <测绘心得体会>由会员分享,可在线阅读,更多相关<测绘心得体会(2页珍藏版)>请在人人文库网上搜索. 1.测绘的心得体会测绘是我们在大三上学期课程结束后进行的, 也是校内的教学 ...

  8. linux进程创建心得体会,Linux系统下计算机C语言编程心得体会

    摘    要:C语言编程是目前计算机领域中应用较为广泛的编程语言, 很多信息系统都基于C语言编程实现.Linux系统是免费且可以自由传播的操作系统, 支持多用户.多平台应用, 实际生活中应用也较为广泛 ...

  9. python编程心得体会-python核心编程____学习心得____part1

    字符编码的发展; 二进制: -->ASCII :只能存英文和拉丁字符,一个字符占一个字节,8位. ----->gb2312: 只能存6700多个中文,1980 ------------&g ...

最新文章

  1. linux 源码安装浏览器,vps+linux+安装浏览器
  2. python入门之函数调用内置函数_第九篇 python基础之函数,递归,内置函数
  3. 【Caffe实践】 多目标输出探究
  4. motan yar php,motan学习笔记 六 opentracing Brave+zipkin实现-Go语言中文社区
  5. linux 手动配置ip地址方法
  6. java-native方法,通过JNI实现c的动态库的加载,实现软硬件之间的交互,跨平台的基础之一
  7. 算法导论 pdf_学习数据结构和算法最好的书是什么?
  8. Bounding-box_regression详解
  9. H2O_Hyper_V-master网页端管理程序源码
  10. 【C语言】逗号运算符的使用举例
  11. mac电脑mysql终端_Mac上用终端管理MySQL
  12. 想用 Python3 破冰人工智能?首先你得懂这些数学方法!
  13. 接口和抽象类的区别(转载)
  14. Ribbon客户端负载均衡算法分析
  15. mnist数据集下载——mnist数据集提供百度网盘下载地址
  16. redis:CLUSTER cluster is down 解决方法
  17. 机器学习 K-Nearst-Neighbors算法
  18. 入门机器学习需要会哪些编程语言?
  19. 从头开始 windows 10 安装awscli,aws sam
  20. Warning:The `android.dexOptions.incremental` property is deprecated and it has no effect on the buil

热门文章

  1. 搜索全部MP3类型文件名
  2. 2014年江西省青年科学家名单
  3. 【吴刚】网页元素设计WUI初级入门视频教程-吴刚-专题视频课程
  4. 计量经济学复习笔记(一):一元线性回归(上)
  5. oppor15版本android,OPPOR15和R15梦境版区别详解
  6. 《论文写作》--心得体会
  7. 最长公共子序问题 ( LCS, Longest Commom Subsequence )
  8. 【蓝桥杯单片机第十二届国赛真题】
  9. 如何获得ESP32-WROOM-32技术规格书
  10. 哪个浏览器比较好用?