Shell中常错注解
注:Linux中对空格等格式控制的很严格。要注意有些地方一定要有,有的地方一定不能有
变量赋值时=号两边不能有空格
在用UE打开shell脚本时,windows和Linux环境不同,所以回车换行等也会不同,会报出某些莫名奇妙的错误,尽量使用VI来编辑
1、#![dsw1] /bin/sh
注:此行可以不写,但如写了这必须按上,/不能反。#!后面给出的路径名必须是正确,否则将会出现一个错误消息,通常是Command not found
2、dsw=[dsw2] "how are you"
为变量赋值时=号左右不能有空格
3 index=`expr $index+1`
expr要求操作数与操作符之间用空格隔开,而且必须用反引号,以告知shell这是一个命令。.
双引号[dsw3]
使用双引号可引用除字符美元符号($)、反引号(`)、反斜线(/)外的任意字符或字符串。
单引号
单引号与双引号类似,不同的是shell会忽略任何引用值。换句话说,如果屏蔽了其特殊含义,会将引号里的所有字符,包括引号都作为一个字符串。
$ echo `date` [dsw4] -----------------àdate
反引号
反引号用于设置系统命令的输出到变量。s h e l l 将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用。
两种方法防止变量扩展:
(1)使用单引号,放置在单引号中的变量将失去扩展
(2)使用反斜杠/,列:echo “/$num”
注意在比较运算符的两端加上空格,否则就成了赋值运算。
if [ "x$1" = "xSCP" ] #加x是为了增加可读性,也属于个人习惯.
字符串测试:
string string不为空白字串
-n string string的长度大於0
-z string string的长度等於0
string1=string2 string1等於string2
string1!=string2 string1不等於string2
数字比较区
int1 -gt int2 int1大於int2
int1 -ge int2 int1大於等於int2
int1 -eq int2 int1等於int2
int1 -ne int2 int1不等於int2
int1 -le int2 int1小於等於int2
int1 -lt int2 int1小於int2
文件测试:
-r filename 档案可读取
-w filename 档案可写入
-x filename 档案可执行
-f filename 档案为一般档
-d filename 档案为目录
-s filename 档案为非空的一般档$0 程序名字
$n 第n个参数值,n=1..9
$* 所有命令行参数
$@ 所有命令行参数,如果它被包含在引号里,形如"$@",则每个参数也各自被引号包括
$# 命令行参数个数
$$ 当前进程的进程ID(PID)
$! 最近后台进程的进程ID
$?[dsw5] 最近使用命令的退出状态
逻辑测试:
"-a"代表逻辑AND 运算
"-o"代表逻辑OR运算
"!" 代表NOT 运算。
C风格条件测试[dsw6]
字符串测试:[dsw7]
string1 > string2 string1 < string2
整形测试:[dsw8]
int1 = int2 int1 != int2
int1 > int2 int1 < int2
int1 >= int2 int1 <= int2
逻辑测试:[dsw9]
&& [dsw10] [dsw11] ||
函数调用方式
Show()
{
}
直接Show [dsw12]
5、有时候变量名与其他文字混淆,可以使用花括号来告诉shell我们要打印的是num变量
num=2
echo "this is the ${num}nd"
这将打印: this is the 2nd
6. 使用命令替换
这是一个相当有用的方法。如果想要使某个命令的输出成为另一个命令的参数时,就一定要使用这个方法。我们将命令列於两个"`" 号之间,而Shell 会以这个命令执行後的输出结果代替这个命令以及两个"`" 符号。
<eg>
str='Current directory is '`pwd`
echo $str
结果如下:
Current directory is /users/cc/mgtsai
这个意思是pwd 这个命令输出"/users/cc/mgtsai",而後整个字串代替原来的`pwd` 设定str 变量,所以str 变量的内容则会有pwd 命令的输出。<eg>
number=`expr $number + 1`
这就是先前所提要作数值运算的方法,基本上expr命令只将运算式解,而後输出到标准输出上。如果要将某变量设定成其值,非得靠命令替换的方式不可。这个例子是将number变量的值加1 後再存回number变量。
二、执行命令
在Bourne Shell中有五种方法执行一个命令,而这五种方式所产生的果有些许的不同。
(1). 使用sh命令
sh command 这个档案必须是Bourne Shell的Script,但这个档案并不一定要设成可执行。除此之外和直接下命令的方式一样。
(2). 使用exec命令
exec command 此时这个Script将会被所执行的命令所取代。当这个命令执行完毕之後,这个Script也会随之结束。
(3).使用./sh
三、流程控制
1、在介绍流程控制之前,我们先来看看test命令。test命令的参数是条件判断式,当条件为真时则传回非零值,而条件为伪时则传回零。在所有的流程控制都必须用到test命令来判断真伪。
2、通常用" [ ] [dsw13] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
3、
#!/bin/sh
if [ [dsw14] "$SHELL" = [dsw15] "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
else
echo "your login shell is not bash but $SHELL"
fi
产用有用的命令
head –n 文件名 用于输出文件的前n行
tail -n 文件名 用于输出文件的最后n行
wc –l/c/w 文件名 统计输入总共有多少行l/字符c/单词w
2:tee ${logFileName}是将文件流引入logFileName目录中
3:touch ${logFile}创建文件
4:sleep 时间
源码区:
#!/bin/sh
echo "The system time is " `date`
echo "**************************"
echo "please enter a password"
echo "**************************"
read pd
if [ "-$pd" = "-dsw" ];then
echo "the password is right"
else
echo "the password is error"
fi
#!/bin/sh
echo "The system time is " `date`
num=0
for a in 1 2 3 4
do
echo $a
num=`expr $num+$a`
echo $num
done
#!/bin/sh[dsw16]
echo "The system time is " `date`
num=0
for a
do
echo $a
num=`expr $num+$a`
echo $num
done
#!/bin/sh
echo "The system time is " `date`
echo "**************************"
echo "please enter a number"
echo "**************************"
len=10
i=0
while [ ${i} -le ${len} ]
do
i=`expr ${i} + 1`
echo ${i}
done
#!/bin/sh
echo "The system time is " `date`
echo "**************************"
echo "please enter a number"
echo "**************************"
len=10
i=0
until [dsw17] [ ${i} -gt ${len} ]
do
i=`expr ${i} + 1`
echo ${i}
done
#!/bin/sh
echo "The system time is " `date`
echo "**************************"
echo "please enter a number"
echo "**************************"
read num
case $num in
A|a)[dsw18] echo 'You entered A.';;
B|b) echo 'You entered B.';;
C|c) echo 'You entered C.';;
*)echo "l don't know what you input";;
Esac
#!/bin/sh
echo “Please select operation”
select [dsw19] operation in “+” “-” “*” “/”
do
case $operation in #case
“+”) ......; break;;
*) echo “Invalid select, please try again”::
esac
done
[dsw1]此之间不可有空格
[dsw2]此处不可有空格
[dsw3]单引号可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。
[dsw4]ESC附近的那个按钮
[dsw5]用于获取上一条命令执行的返回结果
[dsw6] 注:在使用C风格条件测试时,一定要比非C风格时多加一个[],
[dsw7]格式
if [[ $str > “test” ]]; then
......
fi
[dsw8]格式
if (( $num <= 0 )); then
......
fi
[dsw9]格式
if [[ $str = “test” && $num = 0 ]]; then
......
fi
[dsw10]C风格实列
#!/bin/sh
echo "*******************"
echo "please enter a number"
echo "*******************"
if [[ $1 = "dsw" || $2 -eq 1234 ]];then
echo "success"
else
echo "failed"
fi
[dsw11]非C风格实列
#!/bin/sh
echo "*******************"
echo "please enter a number"
echo "*******************"
if [ $1 = "dsw" -a $2 -eq 1234 ];then
echo "success"
else
echo "failed"
fi
[dsw12]不用()
[dsw13]注意:空格
[dsw14]这里一定要有空格,不然得不到正确的结果
[dsw15]这里有空格则为比较符,没空格则为赋值运算符
[dsw16]执行sh:sh sh.sh 1 2 3 4 5 6 7 8,这里的参数好像会自动放入a变量中
[dsw17]条件为假时进入循环
[dsw18]
* 任意字串
? 任意字元
[abc] a, b, c三字元其中之一
[a-n] 从a到n的任一字元
| 多重选择
abc和[abc]区别
[dsw19]select将in后面在””号中的字符串做为菜单,而且有默认的ID,从1开始