首页 > 代码库 > Shell脚本

Shell脚本

【脚本】
1、使用多个Shell命令
# cd ; ls -a
命令过长时使用反斜线字符(\)在命令行上扩充
示例:
#echo “hello \
>world”

2、编辑Shell脚本
新建文件,并以.sh为扩展名,编辑脚本。

显示消息:
使用echo打印字符串时可以不需要加引号,但是如果字符串中有引号,那就需要另外的引号括起来。如:
打印:this‘ll work,echo "this‘ll work"

单引号:所有转移符全部关闭,完整的反应括号中的内容;
双引号:部分转义符关闭,但某些则保留(如:$ );
反引号:反引号内作为一个系统命令并执行(键盘左上角的“`”键)。

3、执行脚本
使用chmod命令赋予执行权限
1)双击;
2)./x.sh
3)bash x.sh

4、指明Shell程序位置
第一行使用:#!/bin/bash指明由/bin目录下的bash程序执行此脚本
其中#为注释符,但是第一行#!也会被程序解析。

5、使用参数
位置参数:Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始。第0号为程序名字,从1开始就表示传递给程序的参数,$1表示传递给程序的第一个参数,以此类推。
内部参数:
$0:命令含命令所在的路径。
$#:传递给程序的总的参数数目。
$?:Shell程序在Shell中退出的情况,正常退出返回0,反之为非0值。
$*:传递给程序的所有参数组成的字符串。
注意:与$*相似的有$@,区别在于$*将所有参数当做一个单词保存,而$@将每个参数当做一个单词,保存在数组中,一般使用for来访问,如:
for param in "$@"
do
 echo "#$count=$param"
 count=$[$count+1]
done

示例:
#! /bin/sh
echo “Program name is $0”;
echo “There are totally $# parameters passed to this program”;
echo “The last is $?”;
echo “The parameter are $*”;
执行后的结果如下:
[root@localhost  bin]# test1 this is a test program //传递5个参数
Program name is /bin/test1                       //给出程序的完整路径和名字
There are totally 5 parameters passed to this program  //参数的总数
The last is 0                                    //程序执行效果
The parameters are this is a test program           //返回由参数组成的字符串

6、使用变量
1)变量赋值:变量名=值,注意:等号(=)前后没有空格;
2)访问变量:变量前面加一个美元符号“$”,如:a="hello world";echo $a;

7、执行数学运算
1)expr命令(bourne shell提供bash兼容,比较笨拙)
示例:
expr 1 + 5   结果:6
expr 5 \* 2  结果:10

2)使用方括号$[ operation ]
var=$[2 * (1 + 3)]
echo $var
结果:8

注意:bash shell只支持整数运算,解决方法为使用内置计算器bc。

7、退出脚本
shell中每个命令运行结束都会返回退出状态码(0~255),退出码没有标准,以下只供参考。
状态码:0表示命令成功结束;1表示通用未知错误;2表示误用shell命令。。。
可以使用echo $? 查看上条命令执行结果。

shell脚本返回的退出码默认为最后一条命令退出码,可以使用exit命令指定退出码,必须指定0~255的数值,超过255会被256除,然后得到余数。

8、test命令
test:格式为test condition
包括数值比较、字符串比较、文件比较。
if test condition
then
 commands
fi
bash中提供另外的声明方式
if [ condition ]
then
 commands
fi
注意:使用方括号是必须在括号与condition之间加一个空格。
数字比较:
-eq 相等
-ge 大于等于
-le 小于等于
-ne 不等于
-gt 大于
-lt 小于

字符串比较
=   相等
!=  不等
<  小于
>  大于
-n str  str长度是否非0
-z str  str长度是否为0
注意:使用<>时需要转义,否则会被认为是重定向符号。

文件比较
-d    对象存在且为目录返回值为“是”
-f    对象存在且为文件返回值为“是”
-L    对象存在且为符号连接返回值为“是”
-r    对象存在且可读则返回值为“是”
-s    对象存在且长度非零则返回值为“是”
-w    对象存在且且可写则返回值为“是”
-x    对象存在且且可执行则返回值为“是”

9、bash shell提供了可在if-then语句中使用的高级特性:
用于数学表达式的双圆括号;
用于高级字符串处理功能的双方括号。

10、条件结构语句
if 表达式1  then
操作
elif表达式2  then
操作
elif表达式3  then
操作

else
操作
fi

11、循环结构语句
for循环
for 变量 in 列表
do
    操作
done
列表是在for循环的内部要操作的对象,可以是字符串也可以是文件,如果是文件则为文件名。
示例:
#! /bin/Bash
for file in $HOME/*
do
    rm $file
 echo “$file has been deleted!”
done

C语言风格的For循环
#! /bin/Bash
total =0
for((j=1;j<=100;j++));
do
 total=`expr $total + $j`
done
echo “The result is $total”
注意:for语句中的双括号不能省,最后的分号可有可无,表达式total=`expr $total + $j`的加号两边的空格不能省,否则会成为字符串的连接。

while循环
while 表达式
do
 操作
done
示例:
#!/bin/Bash
total =0
num=0
while((num<=100));
do
 total=`expr $total + $num`
done
echo “The result is $total”

until循环
until 表达式
do
 操作
done
示例:
#!/bin/Bash
total =0
num=0
until [ $sum –gt 100 ]
do
 total=`expr $total + $num`
 num=`expr $num + 1`
done
echo “The result is $total”

12、循环控制
break可以退出任意类型的循环,包括while和untill循环。
1)跳出单个循环,循环结束;
2)跳出内部循环,内部循环结束,外部循环继续;
3)跳出外部循环,内部循环和外部循环均结束,使用命令“break n”n表示需要跳出的循环级层,默认为1,即当前循环。

continue是提早结束执行循环内部命令但并不终止循环,即进行下一次循环。
同break相似,continue n表示提前结束第n层的此次循环,进入下一次循环。

13、case语句
case 表达式 in
值1|值2)
操作;;
值3|值4)
操作;;
值5|值6)
操作;;
*)
操作;;
esac
示例:
#!/bin/sh
case $USER in
xiaoming|xiaohong)
 echo “You are student!”;;
wanglaoshi)
 echo “You are teacher;        //注意这里只有一个分号
 echo “Welcome !”;;            //这里才是两个分号
*)
 echo “Who are you?”;echo “Get out of here!”;;
    //将两命令写在一行,用一个分号作为分隔符
easc

14、处理用户输入
读取参数
bash shell会将位置参数分配给命令行输入参数,包括shell执行的程序路径和名字。$0表示程序名、 $1表示第一个参数、$2表示第二个参数、知道第9个参数$9,第9个之后的参数需要使用花括号括起来如第10个参数:${10}。

获取用户输入
read命令接收标准输入(键盘)或另外的文件描述符的输入,接收到输入后将数据放进一个标准的变量。
read 变量,如果不指定变量,read将会把数据存放在特殊环境变量REPLY中,它可以跟其他变量一样被使用。
示例:
#!/bin/bash
echo -n "Enter your name: "
read name
echo "Hello $name,Welcome to my program."
注:echo 的-n参数会去掉换行符,使得用户可以在提示符同一行输入。
read命令提供了-p参数,允许read命令指定提示符,用户在提示符同一行输入。
read -p "Enter your name: " name
其他参数:
-t 指定一个计时器等待秒数,计时器过期后read命令返回一个非0退出状态吗
示例:
if -t 5 -p "Please enter your name: " name
then
 echo "Hello $name."
else
 echo "Sorry,goodbye!"
fi

-n 指定输入字符个数,达到指定字符个数自动退出
示例:
read -n 1 -p "Do you sure [Y/N]?" answer

-s 阻止read命令的数据显示在显示器上(还是会显示,但是文字颜色被设置成背景颜色)

另外,如果指定多个变量,输入的每个数据(以空格分开输入)都会被分配到下一个变量,如果没有足够的变量,剩余数据被放在最后一个变量中。

从文件中读取
read命令可以读取linux系统上文件中保存的数据,每次调用read命令可以读取一行数据,当没有可读取数据时,read命令返回非0退出状态码。
常见的方式是使用cat命令输出,并通过管道传送给read命令的while命令。
示例:
#!/bin/bash
count=1
cat test | while read line
do
 echo "Line $count:$line"
 count=$[$count + 1]
done
echo "Finished processing the file"

15、创建函数
函数是被赋予名称的脚本代码块,可以在代码的任意位置使用。当需要调用代码块的时候,只需引用代码块被赋予的函数名即可。但是需要注意,如果在函数定义前使用,会报错。
两种创建函数的方式:
在bash shell脚本中创建函数可以使用两种方式:
1)使用关键字function:
function name{
  commands
}
2)函数名+()方式:
name() {
  commands
}
在脚本中使用函数时,只需要行上指定函数名即可,就跟使用一般的shell命令一样。
注意:函数名必须唯一,如果不唯一也不会报错,但是新定义的函数会覆盖原来的函数。

返回值:
1)默认退出状态码;
此状态码为函数中最后一条命令的退出状态码

2)使用return命令指定一个退出状态码;
需要注意:函数执行结束就应该取返回值,退出状态码必须在0~255之间。
示例:
#!/bin/bash
function cto{
  read -p "enter a value:" value
  echo "doubling the value"
  return $[ $value * 2 ]
}
cto
echo "the new value is $?"

3)使用函数输出。
可以将函数的输出保存在shell变量。
示例:
#!/bin/bash
ceo(){
read -p "please input a value:" value
echo $[ $value * 2 ]
}
result=`ceo`
echo "the result is : $result"

参考:
http://blog.sina.com.cn/s/blog_a57562c801015m9f.html
http://blog.csdn.net/wwp1026/article/details/6891359
http://www.myhack58.com/Article/html/3/68/2006/9038.htm

 

本文出自 “暗夜” 博客,请务必保留此出处http://icyore.blog.51cto.com/8486958/1596284

Shell脚本