全部博文(1493)
分类:
2012-08-27 08:43:21
原文地址: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的文件和具体位置