存档
-
理解bash的case
从网上找到的一段代码,对于学习bash的同学理解case想必很有帮助
————————————————————————–
#!/bin/bash
####################################################
# Program:
# File operation
# 1.) Open file 2.) Display file 3.) Edit file 4.) Delete file
# History:
# 2006/11/03 BianYuan First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo “———————————”
echo “List of item to operate file -”
echo “———————————”2009年2月26日 | 归档于 shell编程 -
ldd命令的原理极其用法
本文通过部分事例讲述linux shell的ldd命令的原理极其用法,ldd显示可执行模块的dependency的工作原理
其实质是通过ld-linux.so(elf动态库的装载器)来实现的。
我们知道,ld-linux.so模块会先于executable模块程序工作并获得控制权,
因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency
1、首先ldd不是一个可执行程序,而只是一个shell脚本
2、ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,
如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。
当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,
而程序并不真正执行。要不你可以在shell终端测试一下,如下:
(1) export LD_TRACE_LOADED_OBJECTS=1
(2) 再执行任何的程序,如ls等,看看程序的运行结果
$ export LD_TRACE_LOADED_OBJECTS=12008年9月6日 | 归档于 shell编程标签: ldd -
常用的shell程序
shell的普遍作用
UNIX的shell程序解释用户的命令,不管是用户直接输入的或者从一个称作Shell脚本或者Shell程序文件读入。Shell脚本是解释型的,而不是编译型的。Shell从脚本行的每行读取命令并在系统中搜索这些命令,当编译器把一个程序转化为可供机器读取的形式时,那么它就可以被以一个可执行文件用在shell脚本当中。
除了向内核传送命令之外,shell的主要任务是提供一个可单独配置的使用shell资源配置文件的用户环境。Shell常用类型
就像一个人会知道不同的语言和方言一样,你的UNIX系统通常提供多种shell类型:sh 或者称作 Bourne Shell: 最初的shell并且仍然在UNIX系统和UNIX相关系统中使用。它是基本的shell,是一个特性不多的小程序。虽然不是一个标准的shell,但是为了UNIX程序的兼容性在每个Linux系统上仍然存在。
bash 或者称作 Bourne Again shell: 标准的GNU shell,直观而又灵活。或许是初学者的最明智选择同时对高级和专业用户来说也是一个强有力的工具。在Linux上,bash 是普通用户的标准shell。这个shell因此称为Bourne shell的超集,一套附件和插件。意味着bash和sh是兼容的:在sh中可以工作的命令,在bash中也能工作,反之则不然。本书所有的例子和练习均使用bash。
csh 或者称作 C shell: 语法了类似于C语言,某些时候程序员会使用。
tcsh 或者称作 Turbo C shell: 普通C shell的超集,加强了的用户友好度和速度。
ksh 或者称作 Korn shell: 某些时候被有UNIX背景的人所赏识。Bourne shell的一个超集,有着对初学者来说就是一场恶梦的标准配置。
文件 /etc/shells 给出了Linux系统上所有的已知shell的概览: mia:~> cat /etc/shells
/bin/bash
/bin/sh
/bin/tcsh
/bin/csh你默认的shell设置在 /etc/passwd 文件中,象下面这行对用户 mia 的设置: mia:L2NOfqdlPrHwE:504:504:Mia Maya:/home/mia:/bin/bash
要从一个shell转换到另外一个,只要在活动的终端里输入新shell的的名字。系统在PATH设置的目录里面寻找是否包含着个名字,既然一个shell就是一个可执行的文件(程序),当前的shell激活它使它运行起来,新的提示符出现,因为每个shell都有自己典型的外观: mia:~> tcsh
[mia@post21 ~]$2008年9月1日 | 归档于 shell编程 -
Bash新手指南 chm文档提供下载
Bash新手指南 chm文档提供下载
书 名: 《Bash新手指南》语 言: 中文文件名: Bash新手指南.chm大 小: 354K
点击下载 Bash新手指南2008年8月27日 | 归档于 shell编程 -
Bash中对变量的操作
Bash中对变量的操作
1.条件变量替换:Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换条件放在{}中.(1) ${value:-word}当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.(2) ${value:=word}与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将word赋值给value(3) ${value:?message}若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若此替换出现在Shell程序中,那么该程序将终止运行)(4) ${value:+word}若变量以赋值的话,其值才用word替换,否则不进行任何替换(5) ${value:offset}${value:offset:length}从变量中提取子串,这里offset和length可以是算术表达式.(6) ${#value}变量的字符个数 (变量的字符个数,并不是变量个数)(7) ${value#pattern}${value##pattern}去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配#与##的区别在于一个是最短匹配模式,一个是最长匹配模式.(8) ${value%pattern}${value%%pattern}于(7)类似,只是是从value的尾部于pattern相匹配,%与%%的区别与#与##一样(9) ${value/pattern/string}${value//pattern/string}进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的区别与上同
注意:上述条件变量替换中,除(2)外,其余均不影响变量本身的值
2.变量的算术运算在Bash Shell中,只能进行两个整数间的运算,其结果仍为整数.要进行算术运算,需要使用let命令,语法为:let exprexpr是一个包含项和操作符的表达式,项可以是一个变量或是一个整数常数,当使用整数常数时,其默认为十进制整数,用户可以用radio#number来指定其它形式的整数,其中radio定义了整数是几进制表示的,number是该整数的值.若radio>10,那么数字字符可从0-9和A-Z.在表达式中支持的操作符及其含义为:+,-,*,/,% 加,减,乘,除,取模>>,<<,&,^,| 左移,右移,位与,位异或,位或?: 三元运算符.与C语言中的定义一致~ 取补码!,>=,<=,>,<,==,!=,&&,||=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=表达式式中也可以使用括号.括号或运算优先级的定义与一般计算机语言中的相同.let命令具有返回值.当计算结果(若有多个表达式时,以最后一个为准)为0时,返回值为1,否则为0.当表达式中含有shell的特殊字符(如|)时,需要用引用符(‘或”)将其引用起来.使用let时还需要注意的时,对于let x+y这样的式子,shell虽然计算了x+y的值但却将结果丢弃,若不想这样,可以使用let sum=x+y将x+y的结果保存在变量sum中另外还可以使用((和))操作符取代let命令,而且这样的话,还可以省去对算术表达式的引用,如果想返回表达式的值,则需用$(())的格式.
if的条件中,“=”用于比较字符串;“-eq”用于比较整型数。
Bash内建参数===========
PPID : 该bash的呼叫者process ID. PWD : 目前的工作目录。 OLDPWD : 上一个工作目录。 REPLY : 当read命令没有参数时,直接设在REPLY上。 UID : User ID。 EUID : Effective User ID。 BASH : Bash的完整路径。 BASH_VERSION : Bash版本。 SHLVL : 每次有Bash执行时,数字加一。 RANDOM : 每次这个参数被用到时,就会产生一个乱数在RANDOM上。 SECONDS : [...]2008年8月11日 | 归档于 shell编程 -
expr的用法
本文使用一些具体的计算实例来阐述expr的用法, 希望对大家有所帮助
请问我以下这些语句为什么是错误的?
sum=0
sum=`expr $sum + ${sale[1]}`
运行时提示:expr: syntax error
sale[1]是已经赋过值的数组。
我运行了一下,没有错啊
你用的是什么平台?什么shell?
我运行了一下,也没有错啊
HP-UX KSH
请问$sum和${sale[1]}的值必须是整数吗?
HP-UX上提供的ksh不支持数组, 所以sale[1]是无效的。
我的环境是HP-UX ksh
我测试如下,可以通过
[/billing/hwh]num=0
[/billing/hwh]sale[1]=3
[/billing/hwh]num=`expr $num + ${sale[1]}`
[/billing/hwh]echo $num
3
我的测试结果与楼上的完全一致。
ksh是有数组的,可以这样试验一下:
[/export/binary]$ sale[1]=3
[/export/binary]$ sale[2]=4
[/export/binary]$ sale[3]=5
[/export/binary]$ echo ${sale[*]}
3 4 5
关于expr的用法,我将《LINUX与UNIX Shell编程指南》中的相关文字贴于此,作了一点修正,基本用法大概就是这些了。
===========================
17.5 expr用法
expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr也是一个手工命令行计数器。
$expr 10 + 10
20
$expr 1500 + 900
2500
$expr 30 / 3
10
$expr 30 / 3 / 2
5
(注意运算符左右都有空格)
使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义。
$expr 30 * 3
90
17.5.1 增量计数
expr在循环中用于增量计算。首先,循环初始化为0,然后循环值加1,反引号的用法意
即替代命令。最基本的一种是从(expr)命令接受输出并将之放入循环变量。
$LOOP=0
$LOOP=`expr $LOOP + 1`
17.5.2 数值测试
可以用expr测试一个数。如果试图计算非整数,将返回错误。
$rr=1.1
$expr $rr + 1
expr: non-numeric argument
$rr=2
$expr $rr + [...]2008年8月11日 | 归档于 shell编程 -
Bash的环境变量
进入bash后,系统可根据你的配置生成一系列的环境变量,这些环境变量可用export命令显示。下面是一些常用的bash环境变量:
$LOGNAME,当前登录的用户名。
$HOME,当前用户的主目录。
$PATH,当前用户的命令搜索路径。
$LANG,当前系统的语言环境。
$TZ,时区
$MAILCHECK,检查新邮件的间隔,单位是秒。
$PS1,命令行提示符。
$PS2,二级命令行提示符,也就是当你的命令行很长,在一行写不下,转到第二行时出现的提示符。
$PWD,当前目录。2008年8月3日 | 归档于 shell编程 -
Bash的用户交互接口
Bash的用户接口也就是我们经常说的字符界面,这是我们与系统交互的主要环境,我们可通过这个接口管理我们的系统。
在系统引导时,第一个需要运行的进程是init,由init再衍生出一个getty终端进程,该进程打开一个终端窗口,提供标准输入、标准输出和标准错误。然后执行程序/bin/login,login程序提示输入密码,加密并验证密码。通过验证后系统进入登录shell,也就是bash。
不同的登录shell可在passwd文件设置。bash会通过几个配置文件来初始化用户环境。首先bash会查找/etc/profile,并执行其中的命令,初始化系统级别环境。然后在用户目录下查找.bash_profile文件,并执行里d面的命令,初始化用户级别的环境。用户级别的设置可覆盖系统级别设置。最后会执行.bashrc用户环境设置文件,这时,默认提示符美元符号将显示在屏幕上。2008年8月3日 | 归档于 shell编程 -
bash下的控制键
通过控制键可以控制shell的行为,下面是一些常用的控制键。
Table 2.2. 控制键
控制键
描述Ctrl_C
中止当前命令Ctrl_D
输入结束Ctrl_\
如果Ctrl_C无效,则中止当前命令Ctrl_S
禁止屏幕输出Ctrl_Q
开启屏幕输出DEL或CTRL_?
删除最后的字符Ctrl_U
删除整个命令行Ctrl_Z
暂停当前命令2008年8月3日 | 归档于 shell编程 -
bash中的特殊字符
在bash中,有很多有特殊含义的特殊字符,下面是一个完整的列表:
Table 2.1. 特殊字符
字符
含义~
主目录`
命令替换#
注释$
变量表达式&
后台作业*
字符通配符(
启动子shell)
停止子shell\
转义或续行|
管道操作符[]
通配符集{}
命令块;
shell命令分隔符,作用是可在一行输入多条shell命令。‘
强引用,引号内所有内容保持字面意思。“
弱引用,引号内某些内容保持字面意思。<
输入重定向>
输出重定向/
路径分隔符?
通配符,匹配单个任意字符!
取反操作2008年8月3日 | 归档于 shell编程