`

shell学习笔记【转】

 
阅读更多

 在启动和使用Shell的过程中,可以使用以下参数:
-a 将所有变量输出
-c " string" 从string中读取命令
-e 使用非交互式模式
-f 禁止shell文件名产生
-h 定义
-i 交互式模式
-k 为命令的执行设置选项
-n 读取命令但不执行
-r 受限模式
-s 命令从标准输入读取
-t 执行一命令,然后退出shell
-u 在替换时,使用未设置的变量将会出错
-v 显示shell的输入行
-x 跟踪模式,显示执行的命令
    许多模式可以组合起来用,您可以试试了,但-ei好象不行,您说why呢?
    使用set可以设置或取消shell的选项来改变shell环境。打开选项用" -" ,关闭选项用" +" ,多数unix允许打开或关闭a、f、e、h、k、n、 u、v和x选项。若显示Shell中已经设置的选项,执行:
#echo $-
    Shell变量名使用的特殊字符:
$# 传送给命令Shell的参数序号(个数?)
$- 在Shell启动或使用set命令时提供选项
$? 上一条命令执行后返回的值
$$ 当前shell的进程号
$! 上一个子进程的进程号
$@ 所有的参数,每个都用双括号括起
$* 所有参数,用双括号括起
$n 位置参数值,n表示位置,n=1..9
$* 这个程式的所有参数
$0 当前shell名
$$ 这个程式的PID
$! 执行上一个背景指令的PID 
    Bsh中有四类变量:用户定义的变量、位置变量(shell参数)、预定义变量及环境变量。
    
    在应用shell变量时候,可以在变量名字两边$后面加上{},以更加清楚的显示给shell,哪个是真正的变量,以实现字符串的合并等功能。例如:
#SUN=sun
#echo ${SUN}day
    用户可以使用" unset <变量>" 命令清除给变量赋的值。例如:
#unset SUN
    Bsh可以进行变量的条件替换,即只有某种条件发生时才进行替换。替换条件放在一对大括号{}中,如:
${variable:-value } variable是一变量值,value 是变量替换使用的默认值,举例如下:
$echo Hello $UNAME
结果显示:Hello
$echo Hello ${UNAME:-there}
结果显示:Hello there
$echo $UNAME
结果显示:(空)
$UNAME=John
$echo Hello ${UNAME:-there}
结果显示:Hello John
    另外一种替换的方法是不但使用默认值进行替换,而且将默认值赋给该变量。其形式如下:
${variable:=value },该形式在变量替换后同时把值value 符给变量variable,举例如下:
$echo Hello $UNAME
结果显示:Hello
$echo Hello ${UNAME:=there}
结果显示:Hello there
$echo $UNAME
结果显示:there
$UNAME=John
$echo Hello ${UNAME:-there}
结果显示:Hello John
    变量替换的值也可以是` `括起来的命令,例如:
$USERDIR={$Mydir:-`pwd`}
    第三种变量的替换方法是只有当变量已赋值时才用指定值替换形式。其形式如下:
${variable:+value },举例如下:
$ERROPT=A
$echo ${ERROPT: +" Error tracking is acitive" }
结果显示:Error tracking is acitive
$ERROPT=
$echo ${ERROPT: +" Error tracking is acitive" }
结果显示: (空)
    我们还可以使用错误检查的条件进行变量替换,其形式如下:
${variable:?message},当变量variable已设置时,正常替换。否则消息message将送到标准错误输出(若此替换出现在shell程序中,那么该程序将终止)。举例如下:
$UNAME=
$echo ${UNAME:?" UNAME HAS NOT BEEN SET" }
结果显示:UNAME HAS NOT BEEN SET 
$UNAME=Stephanie
$echo ${UNAME:?" UNAME HAS NOT BEEN SET"
结果显示:Stephanie
当没有指定message时,shell将显示一条默认的消息,例如: 
$UNAME=
$echo ${UNAME:?}
结果显示:sh:UNAME:parameter null or not set
    用户将变量赋值后,为了防止以后对该变量的修改,可以用以下命令将该变量设置为只读变量,形式如下:
readonly variable
    提问:将一个变量申明成只读变量以后,如何再改成可变的呢?
    Shell变量通常按字符进行存储,为了对Shell变量进行算术运算,必须使用expr命令。expr命令将把一个算术表达式作为参数,通常形式如下:
expr [数字] [操作符] [数字]
    由于Shell是按字符形式存储变量的,所以用户必须保证参加算术运算的操作数必须为数值。下面是有效的算术操作符:
+ 两个整数相加
- 第一个数减去第二个数
* 两整数相乘
/ 第一个整数除以第二个整数
% 两整数相除,取余数
    需要注意的是,用户不能单纯使用" *" 做乘法,若输入$expr 4 * 5系统将会报错,因为Shell看到" *" 将会首先进行文件名替换。正确形式为:
$expr 4 \* 5。
    多个算术表达式可以组合在一起,例如:
$expr 5 + 7 / 3
    运算次序是先乘除后加减,若要改变运算次序,必须使用" `" 号,例如:
$int=`expr 5 + 7`
$expr $int / 3
或者
$expr `expr 5 + 7` / 3
    echo命令可以使用一些特殊的逃逸字符进行格式化输出,下面是这些字符及其含义:
\b Backspace
\c 显示后不换行
\f 在终端上屏幕的开始处显示
\n 换行
\r 回车
\t 制表符
\v 垂直制表符
\ 反斜框
\0nnn 用1,2或3位8进制整数表示一个ASCII码字符
    test命令的使用方法为:
test condition
    可测试的条件分为4类:
 1)测试两个字符串之间的关系
 2)测试两个整数之间关系
 3)测试文件是否存在或是否具有某种状态或属性
 4)测试多个条件的与(and)或(or)组合
    1. 测试两个字符串之间的关系
    bsh把所有的命令行和变量都看作字符串。一些命令如expr和test可以把字符当作数字进行操作。同样任何数字也可以作为字符串进行操作。用户可以比较两个字符串相等或不等,也可以测试一个串是否赋了值。有关串的操作符如下:
str1 = str2 当两个串有相同内容、长度时为真
str1 != str2 当串str1和str2不等时为真
-n str1  当串的长度大于0时为真(串非空)
-z str1  当串的长度为0时为真(空串)
str1  当串str1为非空时为真
    不但Shell程序可以使用test进行条件判断,test命令也可以独立执行(注意两个串相等必须是长度和内容都相等),例如:
$str1=abcd
$test $str1 = abcd
$echo $?
结果显示:0
$str1=" abcd "
$test " $str1"  = abcd
$echo $?
结果显示:1(上面str1包含5个字符,其中最后一个为空格符。而test命令中的另一个串只有4个字符,所以两串不等)
    不带任何操作符和使用-n操作符测试一个串结果是一样的,例如:
$str1=abce
$test $str1
$echo $?
结果显示:0    
$test -n $str1
$echo $?
结果显示:0
    但是,上面两条命令也有一点差别,反映出了使用test命令潜在的问题,请看下例:
$str1="    "
$test $str1
$echo $?
结果显示:1
$test -n " $str1"
$echo $?
结果显示:0
$test -n $str1
结果显示:test:argument expected
    上 例中,第一次测试为假因为Shell在执行命令行之前首先要进行变量替换,即把$str1换成空格,然后shell又将命令行上的空格删除,故test命 令测试到的为空串。而在第二次测试中,变量替换后空格位于括号内,故不会被删除,test测试到的是一个包含空格的串,在第三次测试中,shell把空格 删除,只把-n传个test命令,所以显示参数错。
    2. 测试两个整数之间关系
    test命令与expr命令一样,也可以把字符转变成整数,然后对其操作。test命令对两个数进行比较,使用的操作符如下:
int1 -eq int2 两数相等为真
int1 -ne int2 两数不等为真
int1 -gt int2 int1大于int2为真
int1 -ge int2 int1大于等于int2为真
int1 -lt int2 int1小于int2为真
int1 -le int2 int1小于等于int2为真
    下面的例子反映了字符串比较与数字比较的不同:
$str1=1234
$str2=01234
$test $str1 = $str2
$echo $?
结果显示:1
$test $str1 -eq $str2
$echo $?
结果显示:0
    3. 测试文件是否存在或是否具有某种状态或属性
    使用test进行的第三类测试是测试文件的状态,用户可以测试文件是否存在,是否可写以及其他文件属性。下面是文件测试时使用的选项。注意只有文件存在时,才有可能为真:
-r file  用户可读为真
-w file  用户可写为真
-x file  用户可执行为真
-f file  文件为正规文件为真
-d file  文件为目录为真
-c file  文件为字符特殊文件为真
-b file  文件为块特殊文件为真
-s file  文件大小非0时为真
-t file  当文件描述符(默认为1)指定的设备为终端时为真
    4. 测试多个条件的与(and)或(or)组合
    复杂的条件测试(and 、or 、not):
-a 与
-o 或
! 非
    就是组合条件了,任何高级语言中都有的(NOT、AND、OR),例如:
$test -r em.null -a -s em.null
$echo $?
结果显示:1
说明了em.null并不是可读并且非空的文件
    5. 另一种执行test的方法
    bsh中还有另一种执行test命令的方法,就是把测试条件放到一对[ ]中,例如:
$int1=4
$[ $int1 -gt 2 ]
$echo $?
结果显示:0
    要注意在[ 的后面和 ]符号的前面要有一个空格。
    下面我们用test命令写个简单但比较完善的程序:
#!/usr/bin/sh
#
#-----------------------------------------------------
#FileName : backupfiles.sh
#FileType : sh
#Author  : 陈求文[Crystal.Chen]
#E-Mail  : crystal.chen.cc@gmail.com
#DEscript ION : 备份程序,此程序可以检查备份是否成功
#Date  : 2004年11月17日 20:26:20
#Copyright : 0.1
#-----------------------------------------------------
#
#
#-- 检查参数
if [ $# -ne 1 ]
 then 
  echo " 请在程序名后面指出要备份文件所在目录!"
  exit 1
fi
#-- 检查目录名是否有效
if [ ! -d " $1"  ]
 then
  echo " $1 不是一个目录!"
  exit 2
fi
cd $1
ls -a > backupfiles_test.txt
if [ $? -eq 0 ]
 then
  rm *
 else
  echo " 执行不成功!备份失败..."
  exit 3
fi
    注意:将ls -a > backupfiles_test.txt这条语句修改,就可以进行正常的备份了,例如,修改成这条语句:ls -a | cpio -o > /dev/mnt0 
 

 

转。。

分享到:
评论

相关推荐

    linux脚本shell学习笔记

    shell学习基本命令,可以帮助初学者快速掌握较全面的shell脚本知识

    Shell学习笔记

    本文档《Shell学习笔记》详细介绍了Shell脚本编写的基础知识和一些高级技巧,包含了多个主题,例如终端操作、环境变量使用、数学运算、文件描述符、数组和关联数组、别名使用、终端信息获取、日期和时间处理、脚本...

    Shell学习笔记总结

    Shell 学习笔记总结 本资源是 Shell 学习笔记的总结,涵盖了 Shell 的基本概念、类型、变量、进程、权限、管道、POSIX、grep、sed、awk 等命令和编程语言。 一、 Shell 的类型和特点 Shell 是一种命令行界面,...

    Shell脚本学习笔记

    自己整理的Shell脚本学习笔记,脚本实例可直接运行:1. 变量和字符串;2. 传递参数;3. 基本运算符;4. echo&printf;&test;;5. 流程控制;6. 函数;7. 输入输出重定向&文件嵌入

    shell编程学习笔记

    shell脚本成分 开头和注释: shell脚本的开头,用来解释shell程序,包括:#!/bin/bash、#!/bin/csh、#!/bin/tcsh、#!/bin/pdksh,一般用#!/bin/bash。。 shell脚本中的注释,以#开头的...

    Linux教程+ shell学习笔记 + Shell脚本常用命令+shell脚本100例资源合集

    本文整理了一份Linux shell学习笔记及基本命令合集,包含了LINUX常用操作命令和命令行编辑快捷键、shell基本命令,Linux相关使用配置教程等,需要的朋友可下载试试! shell是一个用C语言编写的程序,它是用户使用...

    Linux Shell学习笔记

    Linux shell是学习Linux必须掌握的脚本之一,该文档为本人学习Shell脚本时总结的一些基础知识,包括Shell的语法、简单示例和总结,欢迎下载学习。

    shell script编程学习笔记

    ### Shell Script 编程学习笔记 #### 一、Shell 脚本初窥 ##### 示例: ```bash #!/bin/sh # 第1行:指定脚本解释器(声明使用的shell名称),这里是用/bin/sh做解释器的。“#!”是一个约定的标记 cd ~ # 第2行:...

    shell学习笔记(常用shell命令介绍和用例)

    ### Shell学习笔记(常用Shell命令介绍与用例) #### 一、引言 Shell作为Linux和Unix操作系统的重要组成部分,提供了一种与系统交互的方式。本文档旨在为初学者和有一定经验的用户提供一份全面的Shell命令学习笔记...

    Shell基础学习笔记

    Shell基础学习笔记

    shell学习笔记(自理版)

    Shell学习笔记(自理版) shell学习笔记的主要内容是 shell 变量、环境变量、条件判断语句、循环语句等。下面对这些知识点进行详细的解释。 一、shell 变量 shell 变量可以分为系统变量和环境变量。系统变量...

    linux shell个人学习笔记,绝对极品

    这个个人学习笔记集合了作者在深入理解Linux Shell过程中的经验与精华,旨在帮助读者更好地掌握这一强大的命令行工具。 首先,让我们了解一下Shell的基础知识。在Linux中,Shell是一个命令解释器,它接收用户的输入...

    Shell 学习笔记 word ppt

    Shell学习笔记主要关注的是Linux或Unix系统中的命令行界面(CLI)交互,特别是Shell脚本编程。Shell是一种命令解释器,允许用户通过命令行输入来执行操作系统任务,同时,它也是一种编程语言,可以编写自动化脚本来...

    shell学习笔记-2018-01-09

    ### Shell学习笔记 #### Shell的发展与分类 Shell作为Unix及类Unix系统(包括Linux)的主要用户界面之一,其历史可以追溯到20世纪70年代。最初,Shell仅仅作为一个简单的命令解释器,随着时间的推移,它发展成为了...

Global site tag (gtag.js) - Google Analytics