文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>很久以前的shell学习的笔记

很久以前的shell学习的笔记

时间:2006-01-10  来源:xiaophedap

    在启动和使用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  : [email protected]
#DESCRIPTION : 备份程序,此程序可以检查备份是否成功
#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
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载