(3) Linux ----- Shell编程基础 ---- ①

--------------------------------------
q什么是Shell程序
q本地变量
q环境变量
q位置参量
q
--------------------------------------

(1)什么是Shell程序

Shell作为UNIX的一个重要组成部分,是它的外壳.也是用户与UNIX系统的交互作用界面.
Shell是一个命令解释程序.除此,它还是一个高级程序设计语言.
用shell编写的程序称为shell程序


以文件形式存放批量的Linux命令集合,该文件能够被Shell解释执行,这种文件就是Shell脚本程序
通常由一段Linux命令、Shell命令、控制语句以及注释语句构成

Shell 脚本的编写
         Shell 脚本是纯文本文件,可以使用任何文本编辑器编写
         Shell 脚本通常是以 .sh 作为后缀名


--------------------------------------

Shell的解释执行功能

--------------------------------------
Shell程序编程主要内容

变量
本地变量、环境变量、位置参量
输入输出
read/echo或printf
条件测试
整数测试、逻辑测试、字符串测试
控制语句
条件/循环/分支/
函数

常用Shell程序内置指令
declare/export/eval/trap等


--------------------------------------
Shell程序的第一行

#!/bin/bash        #!/bin/sh        #!/bin/csh  ...

第一行:指定用哪个shell程序来编译和执行脚本。即 shell文件的首行的#!/bin/sh是告诉内核用哪一个shell解释器去解释你的脚本


延伸1:常见 Shell 的种类

Linux Shell的种类很多,目前流行的Shell包括ash、bash、ksh、csh、zsh等,用户可以通过查看/etc/shells 文件中的内容来查看自己主机中当前有哪些种类的Shell,命令如下(下面是在笔者Linux 主机中查看信息的结果):

  
  
  1. # cat /etc/shells  
  2. /bin/sh  
  3. /bin/bash  
  4. /sbin/nologin  
  5. /bin/bash2  
  6. /bin/ash  
  7. /bin/bsh  
  8. /bin/tcsh  
  9. /bin/csh 

使用下面的命令来查看Linux 当前正在使用的Shell 类型:

  
  
  1. # echo $SHELL 

$SHELL是一个环境变量,它记录了Linux 当前用户所使用的Shell类型。用户可以通过直接输入各种Shell的二进制文件名(因为这些二进制文件本身是可以被执行的),来进入到该Shell下,比如进入csh可以直接输入:

  
  
  1. # /bin/csh 

这个命令为用户又启动了一个Shell,这个Shell在最初登录的那个Shell之后,称为下级的Shell或子Shell。使用命令:

  
  
  1. # exit 

可以退出这个子Shell。

使用不同的Shell 的原因在于它们各自都有自己不同的特点,下面简单介绍Linux 下各种不同的Shell类型的特点。

1. ash

ash Shell是由Kenneth Almquist编写的,是Linux 中占用系统资源最少的一个小Shell,它只包含24个内部命令,因而使用起来很不方便。

2. bash

bash是Linux系统默认使用的Shell,它由Brian Fox 和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40 个。Linux 使用它作为默认的Shell是因为它具有以下特色:

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

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

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

3. ksh

ksh是Korn Shell的缩写,由Eric Gisin编写,共有42 条内部命令。该Shell最大的优点是几乎和商业发行版的ksh 完全相容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。

4. csh

csh 是Linux 比较大的内核,它由以William Joy 为代表的共计47 位作者编成,共有52个内部命令。该Shell其实是指向/bin/tcsh这样的一个Shell,也就是说,csh其实就是tcsh。

5. zch

zch是Linux 最大的Shell之一,由Paul Falstad完成,共有84 个内部命令。如果只是一般的用途,没有必要安装这样的Shell。

--------------------------------------
变量概述

变量命名
变量名必须以字母或下划线开头,后面可以跟字母、数字或下划线。任何其它字符都标志变量名的结束。
变量名关于大小写敏感。

变量类型
根据变量的作用域,变量可以分为本地变量(set)和环境变量(env)
本地变量只在创建它们的 shell 程序中可用。而环境变量则在Shell中的所有用户进程中可用,通常也称为全局变量

变量赋值   variable=value
等号两边不能有空格。如果要给变量赋空值,可以在等号后面跟一个换行符

变量常见操作
显示变量的值
echo $variable  或  echo ${variable}  
显示所有变量
set
清除变量
unset variable

[root@px ~]# var=pjm
[root@px ~]# echo $var
pjm
[root@px ~]# echo ${var}你好
pjm你好
[root@px ~]# set| grep "pjm"
[root@px ~]# unset var
[root@px ~]# set|grep "pjm"
[root@px ~]# echo $?
1
[root@px ~]# 

--------------------------------------
环境变量和只读变量
环境变量称为全局变量,按照惯例需要大写
#export LANG
注意:可被所有的Shell环境下访问;如果父Shell进程产生了子Shell进程,则环境变量可被“继承”并复制

只读变量
是指不能被清除或重新赋值的变量
#readonly myvar

延伸2:Shell变量的定义、删除变量、只读变量、变量类型
Shell支持自定义变量。

定义变量

定义变量时,变量名不加美元符号($),如:
    
    
  1. variableName="value"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。 同时,变量名的命名须遵循如下规则:
  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

变量定义举例:
    
    
  1. myUrl="http://see.xidian.edu.cn/cpp/linux/"
  2. myNum=100

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:
    
    
  1. your_name="mozhiyan"
  2. echo $your_name
  3. echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
    
    
  1. for skill in Ada Coffe Action Java
  2. do
  3. echo "I am good at ${skill}Script"
  4. done
如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。 推荐给所有变量加上花括号,这是个好的编程习惯。

重新定义变量

已定义的变量,可以被重新定义,如:
    
    
  1. myUrl="http://see.xidian.edu.cn/cpp/linux/"
  2. echo ${myUrl}
  3. myUrl="http://see.ccccc.edu.cn/cpp/shell/"
  4. echo ${myUrl}
这样写是合法的,但注意,第二次赋值的时候不能写 $myUrl="http://see.xidian.edu.cn/cpp/shell/",使用变量的时候才加美元符($)。

只读变量

使用  readonly  命令可以将变量定义为只读变量,只读变量的值不能被改变
下面的例子尝试更改只读变量,结果报错:
    
    
  1. #!/bin/bash
  2. myUrl="http://see.xidian.edu.cn/cpp/shell/"
  3. readonly myUrl
  4. myUrl="http://see.xidian.edu.cn/cpp/danpianji/"
[root@xx shell]# readonly var=pjm [root@xx shell]# echo ${var} pjm [root@xx shell]# var=pjm2222 -bash: var: readonly variable [root@xx shell]# 
运行脚本,结果如下:
/bin/sh: NAME: This variable is read only.

删除变量

使用  unset  命令可以删除变量。语法:
    
    
  1. unset variable_name
变量被删除后不能再次使用;unset 命令不能删除只读变量。

举个例子:
    
    
  1. #!/bin/sh
  2. myUrl="http://see.xidian.edu.cn/cpp/u/xitong/"
  3. unset myUrl
  4. echo $myUrl
上面的脚本没有任何输出。

变量类型

运行shell时,会同时存在三种变量:
1) 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。(set)
2) 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。(env)
3) shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

--------------------------------------
位置参量(命令行参数)
      位置参量是一组特殊的内置变量,通常被 shell 脚本用来从命令行接受参数,或被函数用来保存传递给它的参数。
      执行 shell 脚本时,用户可以通过命令行向脚本传递信息,跟在脚本名后面的用空格隔开的每个字符串都称为位置参量。
      在脚本中使用这些参数时,需通过位置参量来引用。例如: $1表示第一个参数,$2表示第二个参数,以此类推。$9以后需要用花括号把数字括起来,如第10个位置参量以 ${10}的方式来访问。

$0

当前脚本的文件名      (形如 ./07testfor.sh )

$1-$9

1 个到第9 个位置参量

${10}

10 个位置参量,类似地,有${11} , ...

$#

位置参量的个数         ($#)

$*

以单字符串显示所有位置参量   ($*)

$@

未加双引号时与 $* 含义相同,加双引号时有区别

$$

脚本运行的当前进程号

$!

最后一个后台运行的进程的进程号

$?

显示前面最后一个命令的退出状态。
0 表示没有错误,其他任何值表示有错误。


#例1:shell_test.sh 
echo “the count of parameters:$#”
echo “first param=$1”
echo “second param=$2”
echo “params’ string=$*”

给SHELL程序传递参数
./shell_test.sh  This is Peter
如果位置参量中含有空格,则需要使用双引号
./shell_test.sh  This is "Peter Piper"

--------------------------------------
数组
数组定义初始化
arr=(math english chinese)
数组引用
引用变量: ${arr[0]}
数组个数: ${#arr[*]}
  所有元素: ${arr[*]}
数组赋值

       arr[0]=chemical

[root@p shell]# arr=(math english chinese)
[root@p shell]# echo ${arr[0]}
math
[root@p shell]# echo ${arr[1]}
english
[root@pa shell]# echo ${arr[2]}
chinese
[root@p shell]# echo ${arr[3]}

[root@p shell]# echo ${arr[*]}
math english chinese
[root@p shell]# echo ${#arr[*]}
3
[root@p shell]# arr[0]=xxxxx
[root@p shell]# echo ${arr[*]}
xxxxx english chinese
[root@p shell]# arr[4]=xxxxx2222
[root@p shell]# echo ${arr[*]}
xxxxx english chinese xxxxx2222
[root@p shell]# echo ${#arr[*]}
4
[root@p shell]# arr[10]=xxxxx101010
[root@p shell]# echo ${arr[*]}
xxxxx english chinese xxxxx2222 xxxxx101010
[root@panjinming shell]# echo ${#arr[*]}
5
[root@panjinming shell]# </span>


--------------------------------------
总结
q什么是Shell程序
q本地变量
q环境变量
q位置参量
q
--------------------------------------




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值