1.hello world
以下几个脚本写法均正确:
1
2
3
|
#!/bin/bash a='hello world' echo $a
|
1
2
3
|
#!/bin/bash a='hello world' echo ${a}
|
1
2
3
|
#!/bin/bash a="hello world" echo ${a}
|
1. 变量单引号,双引号都正确?
2.变量$a , ${a}都正确,区别是什么?
大家常见的变量形式都是$var,如
$ var=test
$ echo $var
test
但当你要显示变量值加随意的字符(我这里用AA)时,就会出错,如下:
$ echo $varAA
$
这时应该用变量的原形:${var},即是加一个大括号来限定变量名称的范围,如下
$ echo ${var}AA
testAA
$
2 位置参数
由系统提供的参数称为位置参数。位置参数的值可以用$N得到,N是一个数字,如果为1,即$1。类似C语言中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始。第0号为程序名字,从1开始就表示传递给程序的参数。如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。
3 内部参数
上述过程中的$0是一个内部变量,它是必须的,而$1则可有可无,最常用的内部变量有$0、$#、$?、$*,它们的含义如下。
l $0:命令含命令所在的路径。
l $#:传递给程序的总的参数数目。
l $?:Shell程序在Shell中退出的情况,正常退出返回0,反之为非0值。
l $*:传递给程序的所有参数组成的字符串。
1
2
3
4
5
6
7
|
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testparameter.sh #!/bin/bash echo "the program name is $0"; echo "the program has $# parameter"; echo "the parameter string is $*"; echo "the execution result is $?"
|
1
2
3
4
5
|
[nxuser@PSjamsBond-0-0-0 tmp]$ ./testparameter.sh this is a test
the program name is ./testparameter.sh
the program has 4 parameter
the parameter string is this is a test
the execution result is 0
|
1
2
3
4
5
6
7
8
9
10
|
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testdelete.sh #!/bin/bash
#方括号必须有空格,否则语法错误
if [ $# -eq 0 ];then echo "please specify a file to delete" else
gzip $1
mv $1.gz $HOME/dustbin
echo "success" fi
|
注意:
1. 方括号必须有空格,否则报错
if [ $# = 0 ];then
else
fi
4 键盘读入变量值
在Shell程序设计中,变量的值可以作为字符串从键盘读入,其格式为:
read 变量
例如:
[root@localhost bin]#read str
read为读入命令,它表示从键盘读入字符串到 str
1
2
3
4
5
6
7
|
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testread.sh #!/bin/sh echo "input directory" read DIRECTORY cd $DIRECTORY ls
|
1
2
3
4
5
6
7
8
|
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testcaculate.sh #!/bin/sh
echo “please input x y” #读入多个值,空格隔开
read x y #运算需要用`包括,并且运算符两个数字必须用空格隔开,否则报错 z=`expr $x + $y` echo “The sum is $z”
|
1. read多个值用空格隔开
2,表达式expr用`包括,并且运算符两侧的数字必须加空格,否则报错
3 表达式total=`expr $total +$num`及num=`expr $num +1`中的符号“`”为键盘左上角的“`”键。
5 字符串比较
1
2
3
4
5
6
7
8
|
[nxuser@PSjamsBond-0-0-0 tmp]$ vi teststring.sh #!/bin/sh
read str1 str2 if [ $str1 = $str2 ];then
echo "equal" else
echo "not equal" fi
|
除了上面的写法,也可以这样写:
1
2
3
4
5
6
|
[nxuser@PSjamsBond-0-0-0 tmp]$ vi teststring.sh #!/bin/sh
read str1 str2
[ "$str1" = "$str2" ] echo $?
~
|
”[”后面和”]”前面及等号“=“的前后都应有一个空格;注意这里是程序的退出情况,如果ar1和ar2的字符串是不想等的非正常退出,输出结果为1。
6 文件操作
-d 是否是目录
1
2
3
4
5
6
7
|
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testfile.sh #!/bin/sh if [ -d /tmp ];then
echo "yes" fi
~
|
-f 是否为文件
1
2
3
4
5
6
7
8
9
|
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testfile.sh #!/bin/sh if [ -f /tmp ];then
echo "yes" else
echo "no" fi
~
|
7 循环
1
2
3
4
5
6
7
|
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testloop.sh #!/bin/sh for i in a,b,c,d 1,2,3,4 do
echo $i done
|
在循环列表中的空格可表示换行。
1
2
3
4
5
6
7
|
<STRONG>#!/bin/sh total=0 for(( j=1;j<100;j++))
do
total=`expr $total + $j`
done echo "result is $total"</STRONG>
|
for i in 列表
do
......
done
for((...))
do
...
done
for语句中的双括号不能省,最后的分号可有可无,表达式total=`expr $total + $j`的加号两边的空格不能省,否则会成为字符串的连接。
while 表达式
do
操作
done
until 表达式
do
操作
done
8 switch
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/bin/sh
echo "input name" read NAME
case $NAME in
kerry) echo "kerry";;
eva) echo "eva";;
*) esac
|
第二个条件不需要case语句 ,最后结尾注意。操作语句是;;结尾
case 表达式 in
值1|值2)
操作;;
值3|值4)
操作;;
值5|值6)
操作;;
*)
操作;;
esac
9 函数
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testfuction.sh #!/bin/sh
add()
{
a=$1
b=$2
sum=`expr $a + $b`
echo "sum is $sum"
}
add $1 $2
~
|
注意:
函数定义完成后必须同时写出函数的调用,然后对此文件进行权限设定,在执行此文件