Chinaunix首页 | 论坛 | 博客
  • 博客访问: 52233
  • 博文数量: 8
  • 博客积分: 341
  • 博客等级: 一等列兵
  • 技术积分: 65
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-07 16:54
文章分类
文章存档

2013年(2)

2012年(1)

2011年(2)

2010年(3)

我的朋友
最近访客

分类:

2012-08-27 08:33:48

原文地址:shell编程笔记 作者:xueyueguangshen

相关书籍推荐:Advanced Bash-Scripting Guide<<高级Bash 脚本编程指南>>

1、shell三类:Bourne shell(sh Linux默认),C shell (csh),Korn shell(ksh)

sh 在编程时很优秀,但用户交互不够优秀;csh用户交互做的比sh好,但接口不如sh;ksh融合了csh和sh的优点,并兼容sh

2、试验命令时出错:(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)

(cd /home/apx-services/ && tar zvcf -.)|(cd ./ && tar xvfp -)   报错: tar: Cowardly refusing to create an empty archive

原因是少了空格!:改成(cd /home/apx-services/ && tar cf - . ) | (cd ../test/ && tar xvfp -),成功

另外,网上查的出现这种错误的可能也有windows下写的sh拷到Linux下时,这种错误用dos2unix filename处理后就能解决

3、下面两段加到sh中,报错:bash_test.sh: line 16: syntax error: unexpected end of file

if [ -z $y ]

echo $y

if [ -n $x ]

echo  $x

原因是:if的sh语法

if [ -z $y ]

then

echo $y

fi

if [ -n $x ]

then

echo  $x

fi

4、sh中整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let "x = $x + 1" 或者 x=`expr $x + 1`

x=1999

let "x=$x + 1"

5、until测试:报错[: too many arguments

j=1 

until [ $j eq '4' ]

do

echo $j

j=' expr $j + 1 '

done

改成:until [ $j eq '4' ]

j=`expr $j + 1`

报错[: eq: binary operator expected

改成:until [ $j -eq '4' ]正常运行

6、BASH 中有一些保留变量,下面列出了一些(这些参数只要写一个sh文件echo出来就比较的明白了,一开始学的时候我一直只是看,越看越不明白): 

$IFS 这个变量中保存了用于分割输入参数的分割字符,默认识空格。 $HOME 这个变量中存储了当前用户的根目录路径。

$PATH 这个变量中存储了当前 Shell 的默认路径字符串。 

$PS1 表示第一个系统提示符。

$PS2 表示的二个系统提示符。

$PWD 表示当前工作路径。

$EDITOR 表示系统的默认编辑器名称。

$BASH 表示当前 Shell 的路径字符串。 

$0, $1, $2, ... 表示系统传给脚本程序或脚本程序传给函数的第0个、第一个、第二个等参数。 

$# 表示脚本程序的命令参数个数或函数的参数个数。 

$$ 表示该脚本程序的进程号,常用于生成文件名唯一的临时文件。 

$? 表示脚本程序或函数的返回状态值,正常为 0,否则为非零的错误号。 

$* 表示所有的脚本参数或函数参数。 

$@ 和 $* 涵义相似,但是比 $* 更安全。 

$! 表示最近一个在后台运行的进程的进程号。

7、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 : 从这个Shell一开始启动后的时间。 

    LINENO : Script的行数。 

    HISTCMD : 历史记录数。 

    OPTARG : getopts处理的最后一个选项参数。 

    OPTIND : 下一个要由getopts所处理的参数号码。 

    HOSTTYPE : 机器种类。 

    OSTYPE : 作业系统名称。 

    IFS : Internal Field Separator。 

    PATH : 命令搜寻路径。 

    PATH="/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:." 

    HOME : 目前使用者的home directory; 

    CDPATH : cd命令的搜寻路径。 

    ENV : 如果这个参数被设定,每次有shell script被执行时,将会执行它所设定的档名做为环境设定。 

    MAIL : 如果这个参数被设定,而且MAILPATH没有被设定,那么有信件进来时,bash会通知使用者。 

    MAILCHECK : 设定多久时间检查邮件一次。 

    MAILPATH : 一串的邮件检查路径。 

    MAIL_WARNING : 如果有设定的话,邮件被读取后,将会显示讯息。 

    PS1 : 提示讯息设定,内定为"bash$ "。(请详见提示讯息一节。) 

    PS2 : 第二提示讯息设定,内定为"> "。 

    PS3 : select命令所使用的提示讯息。 

    PS4 : 执行追踪时用的提示讯息设定,内定为"+ "。 

    HISTSIZE : 命令历史记录量,内定为500。 

    HISTFILE : 历史记录档,内定~/.bash_history。 

    HISTFILESIZE : 历史记录档行数最大值,内定500。 

    OPTERR : 如果设为1,bash会显示getopts的错误。 

    PROMPT_COMMAND : 如果设定的话,该值会在每次执行命令前都显示。 

    IGNOREEOF : 将EOF值当成输入,内定为10。 

    TMOUT : 如果设为大于零,该值被解译为输入等待秒数。若无输入,当成没有输入。 

    FCEDIT : fc命令的内定编辑器。 

    FIGNORE : 请详见READLINE。 

    INPUTRC : readline的startup file,内定~/.inputrc 


8、获取设备simid:(at_chat能够执行发送at命令到at服务器端并获取response)

DEVICE="/dev/citty6"

simid=`/usr/app/at_chat  -c AT+CIMI -i $DEVICE | grep -o '^[0-9]*$'`

解释:AT+CIMI 获得IMSI。这命令用来读取或者识别SIM卡的IMSI(国际移动签署者标识)。在读取IMSI之前应该先输入PIN(如果需要PIN的话)。

9、awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。awk的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,

并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。

pattern {action} 如$ awk '/root/' test,或$ awk '$3 < 100' test。


10、Q:shell中提供`和'的区别是?

` 后置引用,命令替换

' 全引用. 'STRING' 阻止了全部特殊字

proto="ls -al"

ehco "$proto" //输出ls -al

echo '$proto' //输出$proto

echo `$proto` //输出total 40 drwxrwxrwx 2 root root 4096 2012-08-23 15:03 . drwxrwxrwx 3 root root 4096 2012-08-22 10:12 ......

下面一段代码是单独测试``,下一次调用的时候就已经运行了

proto=`ls -al`

edit="$proto"

echo $edit  //输出total 40 drwxrwxrwx 2 root root 4096 2012-08-23 15:03 . drwxrwxrwx 3 root root 4096 2012-08-22 10:12 ......



11、觉得还比较好玩:Linux下使cpu使用率达到100%(csdn上看到的,自己去运行了下,然后top出来)

Cpu(s):  8.0%us, 52.2%sy,  0.0%ni, 39.5%id,  0.0%wa,  0.0%hi,  0.4%si,  0.0%st


这里的冒号其实就是个标识符,用冒号是为了更具迷惑性一点而已- -!换成其它标识符就好理解了

a()

{

a | a&

};

a


这回明白了吧,首先定义一个函数a,a的函数体为a | a&

a为调用自身,|是管道(这是最具杀伤力的部分,管道两边的进程同时运行,直接导致每次递归调用创建的进程数呈指数增长),&在后台运行

最后调用刚刚定义的这个函数a


Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;}

附录(Linux shell相关命令):

brctl命令,linux配置网桥

arp -n | grep "br0"//地址解析协议,ip->mac

sed -e 's/Device[0-9]*/Device/g' Device1~9*àDevice

cut -f 2 -d "=",根据“=”来拆分字符串,并从结果中获得第二个拆分出来的字符串
        grep -r 'config_get' /lib/, 在文件夹/lib下查找有config_get的文件和具体位置


阅读(2145) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~