shell编程(特别概念五)

一、概述

1、解释:shell是一个命令行解释器,它为用户提供一个像Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止,甚至编写一些程序。

2、描述:用户使用Linux时是通过命令来完成所需要工作的。一个命令就是用户和shell之间对话的一个基本单位,它是由多个字符组成并以换行结束的字符串。shell解释用户输入的命令,就像DOS里的command.com所做的一样,所不同的是,在DOS中,command.com只有一个,而在Linux下比较流行的shell有好几个,每个shell都各有千秋。一般的Linux系统都将bash作为默认的shell。

2、几种流行的shell

1)目前流行的shell有ash、bash、ksh、csh、zsh等,查看shell类型

#echo $SHELL


 

2)$SHELL是环境变量,它记录用户所使用的shell类型。

#shell-name
可以用以下命令来转换到别的shell,这里shell-name是你想要尝试使用的shell的名称,如ash等。这个命令为用户又启动
了一个shell,这个shell在最初登录的那个shell之后,称为下级shell或子shell。

 

3)

$exit
可以退出这个子shell。


4)shell的不同:

A、ash:是Linux中占用系统资源最少的一个小shell,它只包含24个内部命令。

B、bash:是Linux系统默认的shell,内部有40个命令。

可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令

自动通过查找匹配的方式给出以某字符串开头的命令

包含了自身的帮助功能,在提示符下面键入help就可以得到相关的帮助。

C、ksh:有42个内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。

D、csh:是Linux比较强大的内核,共有52个内部命令。

E、zch:是Linux最大的shell之一,有84个内部命令。

 

 

二、基础部分

1、shell的基本语法

1)输入输出重定向

在Linux中,每一个进程都有三个特殊的文件描述指针:标准输入(文件描述指针为0)、标准输出(文件描述为1)、标准错误输出(文件描述为2)。

这三个特殊的文件描述指针使进程在一般情况下接受标准输入终端的输入,同时由标准终端来显示输出,Linux同时也向使用者提供可以使用普通的文件或管道来取代这些标准输入输出设备。

在shell中,使用者可以利用“>"和”<"来进行输入输出重定向。

command > file:将命令的输出结果重定向到一个文件


2)管道pipe

pipe同样可以在标准输入输出和标准错误输出间代替工作,这样一来,可以将某一个程序的输出送到另一个程序的输入

command1 |  command2[ | command3...]



也可以连同标准错误输出一起送入管道

command1 |  &command2 [ | & command3...]


3)前台和后台

在shell下面,一个新产生的进程可以通过用命令后面的符号“,”和“&”来分别以前台和后台的方式来执行,语法如下:

command


产生一个前台的进程,下一个命令须等该命令运行结束后才能输入。

command &


产生一个后台的进程,此进程在后台运行的同时,可以输入其他命令。


2、shell程序的变量和参数


1)shell定义的环境变量

shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,这些变量用户还可以重新定义,常用的shell环境变量有

HOME:用于保存注册目录的完全路劲名。

PATH:用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。

TERM:终端类型

UID:当前用户的标识符,取值是由数字构成的字符串。

PWD:当前工作的目录的绝对路径名,该变量的取值随cd命令的使用而变化。

PS1:主提示符,在特权用户下,默认的主提示符是#,在普通用户下,默认的主提示符是$。

PS2:在shell接受用户输入命令的过程中,如果用户在输入行的末尾输入\然后回车,或者当用户按回车键是shell判断出用户输入的命令没有结束时,显示这个辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是>。


2)用户定义的变量

变量名=变量值

在定义变量时,变量名前不应加符号$,在引用变量的内容时,则应在变量名前加$;

在给变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用双引号括起来;

在编写shell程序时,为了使变量名和命令名相区别,建议所有变量名都用大写字母来表示。


实现变量的只读性

readonly 变量名



在任何时候,建立的变量都只是当前shell的局部变量,所以不能被shell运行的其他命令或shell程序所利用,export命令可以将一局部变量提供给shell执行的其他命令使用。

export 变量名

也可以给在给变量赋值的同时使用export命令

export  变量名=变量值

使用export说明的变量,在shell以后运行的所有命令或程序中都可以访问到。


3)位置参数

位置参数是一种在调用shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数。位置参数之间用空格分隔,shell取第一个位置参数替换程序文件中的$1,第二个替换$2,依此类推。$0是一个特殊的变量,它的内容是当前这个shell程序的文件名,所以,$0不是一个位置参数,在显示当前所有的位置参数时是不包括$0的。


4)预定义变量

预定义变量和环境变量相类似,也是在shell一开始时就定义了的变量,所不同的是,用户只能根据shell的定义来使用这些变量,而不能重定义它。所有预定义变量都是由$符号和另一个符号组成的,常用的shell预定义变量有:

$#:位置参数的数量

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

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

$$:当前进程的进程号

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

$0:当前执行的进程名

其中,$? 用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错);

$$变量最常见的用途是用作临时文件的名字以保证临时文件不会重复。


5)参数置换变量

shell提供了参数置换能力以便用户可以根据不同的条件来给变量赋不同的值。参数置换变量有四种,这些变量通常与某个位置参数想联系,根据指定的位置参数是否已经设置类决定变量的取值

变量=${参数-word}:如果设置了参数,则用参数的值置换变量的值,否则用word置换。即这种变量的值等于某一个参数的值,如果参数没有设置,则变量就等于word值。

变量=${参数=word}:如果设置了参数,则用参数的值置换变量的值,否则吧变量设置成word,然后用word替换参数的值。注意,位置参数不行,不能为位置参数赋值。

变量=${参数?word}:如果设置了参数,则用参数的值置换变量的值,否则就显示word并从shell中退出;如省略了word,则显示标准信息。这种变量要求一定等于某个参数的值,如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。

变量=${参数+word}:如果设置了参数,则用word置换变量,否则不进行置换。

上述四种形式中的参数既可以是位置参数,也可以是另一个变量,只是用位置参数的情况比较多。



三、高级部分

1、test测试命令

1)数值测试

-eq:等于则为真

-ne:不等于则为真

-gt:大于则为真

-ge:大于等于则为真

-lt:小于则为真

-le:小于等于则为真

2、字符串测试

=:等于则为真

!=:不相等则为真

-z字符串:字符串长度伪则为真

-n字符串:字符串长度不伪则为真

3、文件测试

-e文件名:如果文件存在则为真

-r文件名:如果文件存在且可读则为真

-w文件名:如果文件存在且可写则为真

-x文件名:如果文件存在且可执行则为真

-s文件名:如果文件存在且至少有一个字符则为真

-d文件名:如果文件存在且为目录则为真

-f文件名:如果文件存在且为普通文件则为真

-c文件名:如果文件存在且为字符型特殊文件则为帧

-b文件名:如果文件存在且为特殊文件则为真


另外,Linux还提供了与(!)、或(-o)、非(-a)三个逻辑操作符用于将测试条件连接起来,其优先级为!最高,-a次之,-o最低

同时,bash也能完成简单的算术运算,格式如下:

var1=2
var2=$[var1*10+1]


则var2的值为21



2、if条件语句

shell程序中的条件分支是通过if条件语句来实现的,其一般格式为

if 条件命令串
then
       条件为真时的命令串
else
       条件为假时的命令串
fi

#!/bin/bash
if [ "$1" = "" ] || [ "$2" = ""]
then
      echo "Please enter file name"
      exit 1
fi
if [ -e $2 ]
then
      echo "The file already exists"
      until [ ! -f $2]
      do
           sleep 1
      done
fi
if   [ ! 'mv $1 $2 ]
then
      echo "mv successful"
else
      echo "mv error"
fi



 

3、for循环

for循环对一个变量的可能值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表形式提供,也可以在程序以外位置参数的形式提供。for循环的一般格式为:

for 变量名
【in 数值列表】
do 
 若干个命令行
done


#!/bin/bash
counter=0
for files in *
do 
    counter='expr $counter +1'
done
echo "There are $counter files in 'pwd' we need to process"


变量名可以是用户选择任何字符串,如果变量名是var,则在in之后给出的数值将顺序替换循环命令列表中的$var 。如果省略了in,则变量var 的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。


4、while和until循环

while和until命令都是用命令的返回状态值来控制循环的。while循环的一般格式为

while
若干个命令行1
do 
若干个命令行2
done


只要while的“若干个命令行1”中最后一个命令的返回状态为真,while循环就继续执行do..done之间的“若干个命令行2”

until命令是另一种循环结构,它和while命令相似,其格式为

until
若干个命令行1
do 
若干个命令行2
done


until循环和while循环的区别在于:while循环在条件为真是继续执行循环,而until则是在条件为假时继续执行循环。

shell还提供了true和false两条命令,用于建立无限循环结构,它们的返回状态分别是总为0或总为非0.

#!/bin/bash
echo -n "Please enter number :"
read n
sd=0
rev=""
on=$n
echo "$n"
while [$n -gt 0]
do 
   sd=$( ( $n % 10 ) ) # get Remainder
   n=$( ( $n / 10 ) ) #get next digit
   rev=$( echo $rev$sd)
done
echo "$on in a reverse order $rev"


until [! -f $2]
do
    sleep 1
done
fi
if [! 'mv $1 $2' ]
then
     echo "mv successful"
else
     echo "mv error"
fi



 

5、case条件选择

if条件语句用于在两个选项中选定一项,而case条件选择为用户提供了根据字符串或变量的值从多个选项中选择一项的方法,其格式为

#!/bin/bash
echo "Hit a key, then hit return."
read Keypress
case "$Keypress" in
[A-Z] ) echo "Uppercase letter";;
[a-z] ) echo "Lowercase letter";;
[0-9] ) echo "Digit";;
*) echo "Punctuation ,whitespace, or other“;;
esac



6、无条件控制语句break和continue

break用于立即终止当前循环的执行,而continue用于不执行循环中后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和done之间时才有效


7、函数定义

在shell中还可以定义函数。函数实际上也是由若干条shell命令组成的,因此它与shell程序形式上是相似的,不同的是它不是一个单独的进程,而是shell的程序的一部分。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值