`

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 
 

 

转。。

分享到:
评论

相关推荐

    Shell学习笔记

    Shell学习笔记Shell学习笔记Shell学习笔记Shell学习笔记Shell学习笔记Shell学习笔记

    linux脚本shell学习笔记

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

    Bash shell 学习笔记

    Bash shell 学习笔记

    shell学习笔记.docx

    shell学习笔记.docx

    Bash_shell学习笔记

    Bash_shell学习笔记

    PDF电子书《Bash Shell学习笔记》

    PDF电子书《Bash 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脚本中的注释,以#开头的...

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

    shell命令的学习笔记。 包含常用的shell命令说明和使用用例。 可快速入门,也可当手册使用。

    shell script编程学习笔记

    shell script学习中的笔记

    shell脚本学习笔记

    事实是上,您可以不懂任何 shell ,就能使用 Linux 。您启动系统后可以直接进入 X Window ,最后在 X Window 下关机。 我坚信,用 Linux 而不懂 shell ,就象开车只会用头档(first gear)一样。当然,最初看起来,...

    Linux Shell学习笔记

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

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

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

    Linux和shell脚本学习笔记

    Linux学习笔记,Linux基础命令,shell脚本,正则表达式等学习笔记,欢迎下载!!

    shell学习笔记

    shell学习笔记,主要介绍了shell变量、shell字符串、shell数组、shell传递参数、shell基本运算符

    Shell学习笔记总结

    自己在学习SHELL编程时整理的笔记,感兴趣的朋友可以看看

    shell学习笔记-2018-01-09

    根据网易云课堂中shell教学视频,记录的学习笔记 方便自己回忆总结

    shell编程教程.chm

    awk基础入门(4) Unix系列shell程序编写(上) awk基础入门(5) Unix系列shell程序编写(下) Unix系列shell程序编写(中) shell游戏:俄罗斯方块 ...Shell学习笔记 一 ...Shell学习笔记 二 ...Shell学习笔记 五

Global site tag (gtag.js) - Google Analytics