两个有用的命令
read -p "Please input a choice:" choice
killall -9 myfiles
1.长命令 使用反斜线字符(\)在命令行上扩充
qustdjx@qustdjx-K42JZ:~/test$ echo "this is \
> long command"
this is long command
" >"是回车自动产生的,不是输入的,在执行Shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令
2.编辑shell程序:
例:
#!/bin/sh
echo "Mr.$USER,Today is:"
echo &date "+%c%d%A"
echo "Wish you a lucky day !"
#!/bin/sh通知采用Bash解释。如果在echo语句中执行Shell命令date,则需要在date命令前加符号“&”,其中%B%d%A为输入格式控制符。
3.执行shell的方式:
首先修改权限 :chmod +x date.sh
(1)./date.sh
(2) bash date.sh
(3)为了在任何目录都可以编译和执行Shell所编写的程序,即把/bin的这个目录添加到整个环境变量中。
例:把date.sh 放到/bin 下,修改环境变量:
root@qustdjx-K42JZ:/home/qustdjx/test# cp date.sh /bin
root@qustdjx-K42JZ:/home/qustdjx/test# export PATH=/bin:$PATH
root@qustdjx-K42JZ:/home/qustdjx/test# date.sh
Mr.root,Today is:
2012年08月02日 星期四 12时45分50秒02星期四
Wish you a lucky day !
4.shell 的参数
(1)由系统提供的参数称为位置参数。位置参数的值可以用$N得到,N是一个数字,如果为1,即$1。类似C语言中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始。第0号为程序名字,从1开始就表示传递给程序的参数。如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。
(2)上述过程中的$0是一个内部变量,它是必须的,而$1则可有可无,最常用的内部变量有$0、$#、$?、$*,它们的含义如下。
$0:命令含命令所在的路径。
$#:传递给程序的总的参数数目。
$?:Shell程序在Shell中退出的情况,正常退出返回0,反之为非0值。
$*:传递给程序的所有参数组成的字符串。
例:
#! /bin/sh
echo “Program name is $0”;
echo “There are totally $# parameters passed to this program”;
echo “The last is $?”;
echo “The parameter are $*”;
运行:
qustdjx@qustdjx-K42JZ:~/test$ ./test.sh
Program name is ./test.sh
There are totally 0 parameters passed to this program
The last is 0
The parameter are
例:
#! /bin/sh
if test $# -eq 0
then
echo "Please specify a file!"
else
mv $1 $HOME/dustbin #移动到回收站
echo "File $1 is deleted !"
fi
注:test命令参数;
INTEGER1 -eq INTEGER2
INTEGER1 is equal to INTEGER2
5.shell 程序中的变量
(1)简单的赋值:
x=6
a="hello world"
b=$a
(2)键盘读入值
qustdjx@qustdjx-K42JZ:~/test$ read str
qustdjx
qustdjx@qustdjx-K42JZ:~/test$ echo $str
qustdjx
例:
#! /bin/sh
echo “please input x y”
read x,y
z=`expr $x+$y`
echo “The sum is $z”
注:
#expr 通用求值表达式,通过给定的操作(参数必须以空格分开)连接参数,并对参数求值.可以使算术操作, 比较操作, 字符串操作或者是逻辑操作
expr 5 \* 3 返回 15 在算术表达式expr中使用乘法操作时, 乘法符号必须被转义.
z=`expr $x+$y` 中的“`"是键盘左上角的“`"
6.表达式的比较
(1)字符串比较
作用:测试字符串是否相等、长度是否为零,字符串是否为NULL。
常用的字符串操作符如表所示.。
常用的字符串操作符
字符串操作符
含义及返回值
=
比较两个字符串是否相同,相同则为“真”
!=
比较两个字符串是否不相同,不同则为“真”
-n
比较两个字符串长度是否大于零,若大于零则为“真”
-z
比较两个字符串长度是否等于零,若等于零则为“真”
例:
#! /bin/sh
read ar1
read ar2
[ "$ar1" = "$ar2" ]
echo $? #?保存前一个命令的返回码
qustdjx@qustdjx-K42JZ:~/test$ ./test
sss
sss
0
”[”后面和”]”前面及等号“=“的前后都应有一个空格;注意这里是程序的退出情况,如果ar1和ar2的字符串是不相等的非正常退出,输出结果为1。
例:
判断输入的字符串的长度是否大于0
#! /bin/sh
read ar
[ -n "$ar" ]
echo $? #保存前一个命令的返回码
注:运行结果为1,则表明字符串长度小于或等于0
(2)数字比较
用test比较的运算符
运算符号
含 义
-eq
相等
-ge
大于等于
-le
小于等于
-ne
不等于
-gt
大于
-lt
小于
例:
#! /bin/sh
read x y
if test $x -eq $y
then
echo "$x=$y"
else
echo "$x!=$y"
fi
运行:
qustdjx@qustdjx-K42JZ:~/test$ ./test
12 23
12!=23
注:read 命令读入两个字符串时,应用空格隔开
(3)逻辑操作
Shell中的逻辑运算符
运算符号
含 义
!
反:与一个逻辑值相反的逻辑值
-a
与(and):两个逻辑值为“是”返回值为“是”,反之为“否”
-o
或(or):两个逻辑值有一个为“是”,返回值就是“是”
例:
#! /bin/sh
p1="1111"
p2=""
[ "$p1" -o "$p2" ]
echo $?
[ "$p1" -a "$p2" ]
echo $?
运行:
qustdjx@qustdjx-K42JZ:~/test$ ./test
0
1
注:p2="" 引号内没有空格,如果有空格则会返回两个0
(4)文件操作
文件测试操作符
运算符号
含 义
-d
对象存在且为目录返回值为“是”
-f
对象存在且为文件返回值为“是”
-L
对象存在且为符号连接返回值为“是”
-r
对象存在且可读则返回值为“是”
-s
对象存在且长度非零则返回值为“是”
-w
对象存在且且可写则返回值为“是”
-x
对象存在且且可执行则返回值为“是”
例:
#! /bin/sh
dir="/home/qustdjx/test"
[ -d $dir ]
if test $? -eq 0
then
echo "$dir:exist"
else
echo "$dir :no exist"
fi
运行:
qustdjx@qustdjx-K42JZ:~/test$ ./test
/home/qustdjx/test:exist
例:
输入一个字符串,如果是目录,则显示目录下的信息,如为文件显示文件的内容
#! /bin/sh
echo "Please enter the directory name or file name"
read DORF
if [ -d $DORF ]
then
ls $DORF
elif [ -f $DORF ]
then
cat $DORF
else
echo "input error! "
fi
7.循环结构
Shell常见的循环语句有for循环、while循环语句和until循环。
(1) for循环
语法:
for变量 in列表
do
操作
done
例:
在列表中的值:a,b,c,e,I,2,4,6,8用循环的方式把字符与数字分成两行输出。
#! /bin/sh
for i in a,b,c,e,I 2,4,6,8 #在循环列表中的空格可表示换行。
do
echo $i
done
运行:
qustdjx@qustdjx-K42JZ:~/test$ ./test
a,b,c,e,I
2,4,6,8
例:
#! /bin/sh
total=0
for((j=1;j<=100;j++));
do
total=`expr $total + $j`
done
echo "The result is $total"
运行:
./test: 3: Syntax error: Bad for loop variable
这是因为:http://blog.csdn.net/qustdjx/article/details/7823951
qustdjx@qustdjx-K42JZ:~/test$ ./test
The result is 5050
另一种写法:
#!/bin/sh
s=0
for i in `seq 1 100`
do
s=`expr $s + $i`
done
echo $s
注意:
for语句中的双括号不能省,最后的分号可有可无,表达式total=`expr$total + $j`until循环的加号两边的空格不能省,否则会成为字符串的连接。
(2)while 循环
语法:
while表达式
do
操作
done
只要表达式为真,do和done之间的操作就一直会进行。
例:
#!/bin/sh
i=1
j=0
while ((i <=100 ))
do
((j=j+i))
((i++))
done
echo $j
另一例:
#! /bin/sh
total=0
num=0
while((num<=100));
do
total=`expr $total + $num`
((num=$num+1))
done
echo "The result is $total"
另另一例:
#!/bin/sh
i=1
sum=0
while [ $i -le 100 ]; do
sum=$((sum+i))
i=$((i+1))
done
echo "SUM=$sum"
(3)until 循环
语法:
until 表达式
do
操作
done
重复do和done之间的操作直到表达式成立为止。
例:
#! /bin/sh
total=0
num=0
until [ $num -gt 100 ]
do
total=`expr $total + $num`
num=`expr $num + 1`
done
echo "The result is $total"
8.条件结构语句
语法:
if 表达式1 then
操作
elif表达式2 then
操作
elif表达式3 then
操作
……
else
操作
fi