shell编程必须知道的基本语法:
1. 如何使用多个命令
方法一:在终端上使用“;”来隔开不同的命令
方法二:创建一个shell 脚本
- 如何创建一个shell脚本-----shell脚本的基本格式
#!/bin/bash
#this is the first shell
date
who
#the end
3. 如何运行一个shell脚本程序
chmod u+x test
./test
- shell脚本中的echo命令------相当于c语言中的printf
·格式如下:
echo This is a test
echo “This is a test to see if it will work”
echo ‘Rich says “scripting is easy” .’
echo “Let’s see who’s logged into the system: ”
echo –n 的用法
- 使用变量
a) 环境变量
b) 用户变量
在变量名字前面加上$符号来引用变量的值
如:
days=10
#等于号两边不能有空格
guest=”Katie”
echo “$guest will visite us $days days after”
- 反引号----是shell脚本中最重要的特性之一,反引号允许你将shell命令的输出赋值给一个变量,注意shell中的变量不需要显式指定类型,系统会自动识别,可以直接调用
如:
testing=`date`
echo “The date and time are: ”$testing
一个让系统自动创建日志文件日期的方法:
today=`date +%y%m%d`
ls /usr/bin –al > log.$today
- 重定向输入和输出
a) 输出重定向
command > outputfile
b) 输入重定向
command < inputfile
c) 内联输入重定向
command << marker
sentences
marker
- 管道 command | command
rpm –qa | more
rpm –qa | sort
- 如何在shell中进行数学运算
a) expr命令------只能进行整数类型的运算,且需要使用反引号来获取expr命令的输出
b) 使用方括号来代替expr命令进行运算
格式:var=$[ 运算表达式 ]
c) 进行浮点运算的解决方法,使用shell内建的bash计算器,小数点位数是由scale变量来控制的
如终端下使用:
bc –q#终端输入
3.44 / 5
0#结果
scale=4#设置scale
3.44 / 5
.6880#结果
quit
shell脚本中使用:
格式:var=`echo “options; expression” | bc`
如:
#!/bin/bash
var1=`echo “scale=4; 3.44 / 5” | bc`
echo The answer is $var1
如何进行多个表达式的运算:
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=`bc << EOF
scale=4
a1 = ($var1 * $var2)
a2 = ($var3 * $var4)
a1 + a2
EOF
`
- 命令的退出状态码,每个命令都有一个退出状态码,成功执行为0,不成功非0,用echo $?命令可以查看退出状态码,但是用exit 命令可以指定退出状态码的值
结构化命令编程:
- 使用if-then语句,格式如下:
if command
then
commands
fi
或者
if command ; then
commands
fi
- 使用if – then – else 语句,格式如下:
if command
then
commands
else
commands
fi
- 嵌套使用if,格式如下:
if command1
then
commands
elif command2
then
more commands
fi
- 前面所讲的if-else语句,if只能接受shell命令作为判断条件,不能接受普通的任意表达式,使用test可以克服这个缺点,格式如下:
if test condition
then
commands
fi
或者
if [ commands ]
then
commands
fi
test命令可以判断3类条件:
·数值比较
n1 –eq n2;检查n1,n2是否相等
n1 –ge n2;检查n1是否大于等于n2
n1 –gt n2;检查n1是否大于n2
n1 –le n2;检查n1是否小于等于n2
n1 -lt n2;检查n1是否小于n2
n1 –ne n2;检查n1是否不等于n2
·字符串比较
str1 = str2;检查str1是否和str2相同
str1 != str2;检查str1是否和str2不同
str1 < str2;
str1 > str2
-n str1;检查str1的长度是否非0
-z str1;检查str1的长度是否为0
·文件比较
-d file;检查file是否存在并是一个目录
-e file;检查file是否存在
-f file;检查file是否存在并是一个文件
-r file;检查file是否存在并可读
-s file;检查file是否存在并非空
-w file
-x file
-O file;检查file是否存在并属当前用户所有
-G file;检查file是否存在并且默认组与当前用户相同
file1 –nt file2;检查file1是否比file2新
file1 –ot file2;检查field1是否比file2旧
- 前面我们所讲的if-then语法格式并不符合我们c语言中的格式,现在我们来讲一下if-then的高级特性
a) 使用双圆括号(有些地方称作双尖括号)允许你将高级数学表达式放入进行比较
如:if (( $var1 ** 2 > 90 ))
then
commands
fi
双尖括号里面可以识别的命令符号:var++, var--, ++var, --var, !逻辑求反, ~位求反, **幂运算, <<, >>, &, |, &&, ||
有了这些,我们的shell就和c语言的语法比较接近了。
b) 使用双方括号[[ expression ]] 针对字符串进行比较的高级特性,对字符串进行模式匹配
如:
#!/bin/bash
if [[ $USR == r* ]]
then
echo “Hello $USR”
else
echo “Sorry, I don’t know you”
fi
- 用case命令来替换if-then-else语句,对比c语言语法格式来学习
直接来例子进行比较:
例子1:
#!/bin/bash
if [ $USER = “Rich” ]
then
echo “welcome $USER”
elif [ $USER = “barbara” ]
then
echo welcome $USER
elif [ $USER = testing ]
then
echo welcome $USER
else
echo ”sorry, you are not allowed here”
fi
例子2:
case $USER in
Rich | Barbara)
echo “Welcome, $USER”;;#注意结尾符号
testing)
echo “Welcome, $USER, nice your visite”;;
*)#相当于default
echo “sorry, we are not allowed here”;;
esac#结束标识
- 更多的结构化命令
a) for命令格式
for var in list
do
commands
done
用var读取list里面的值进行遍历输出
如:
for test in Albame Alaska Arizona California
do
echo The next place is $test
done
如:
for file in /etc/*
do
if [ -d “$file” ]
then
echo “$file is a directory”
elif [ -f “$file” ]
then
echo “$file is a file”
fi
done
b) c语言风格的for命令
for (( a = 1; a < 10; a++ ))
do
echo “The number is $a”
done
c) while命令
格式:
while [ command ]
do
commands
done
如:
var1=10
while [ $var1 –gt 0 ]
do
echo $var1
var1=$[ $var1 – 1 ]
done
d) until命令,与while命令工作的方式相反
格式:
until [ commands ]
do
commands
done
e) 嵌套循环
如:
for (( a = 1; a <= 3; a++ ))
do
echo “Starting loop $a: ”
for (( b = 1; b <= 3; b++ ))
do
break 2
echo“ Insert loop $b”
done
done
循环语句一个比较有实际意义的用法是循环处理文件数据,如你可以编程实现逐行遍历/ets/passwd文件并输出内容,这里你需要将IFS变量的值改为冒号
f) break 命令和continue 命令
g) 处理循环的输出,你可以添加一个命令将循环的输出不显示在屏幕上,而是重定向到一个文件夹
只需要在done命令后加上如:done > output.txt
三.前面我们程序里面需要的变量都是预先定义赋好值的,不能进行交互式的输入,这在一般程序设计时是不可能的,现在我们讲一下如何向程序里面传递参数
1.第一种方法是用命令行参数来向程序传递参数
如:./test 3 5,这个命令行我们输入了三个参数,在程序里直接对应$0,$1,$2,它们相当于变量的名字,在程序里可以直接调用,相当于$1=3, $2=5。$#表示传递给函数的参数个数。
2.另一种方法是用read命令,可以让你在程序执行期间进行输入,如:
echo –n “Enter your name: ”
read name
echo “Hello $name, nice name. ”
从文件test中读取内容的方法:
count=1
cat test | while read line
do
echo “Line $count: $line”
count=$[ $count + 1 ]
done
echo “I have finished read file”
四.如何定时运行程序和如何让程序开机时运行
1.用at 命令来计划执行作业
at [ -f filename ] time
2. at命令只能让程序在某个时间只执行一次,运用cron时间表可以让我们实现定期要执行的脚本
cron时间表命令格式如下:
min hour dayofmonth month dayofweek command(脚本全路径)
- 开机时运行脚本,很简单,只要你将你要运行的脚本放在开机时需要执行的脚本文件夹下就可以了,当然具体执行的时候还涉及到很多内容,这里不详述了。
五.shell脚本函数
1.基本脚本函数
(1).创建函数两种方法:
a.function name{
commands
}
b. name( ) {
commands
}
如:
注意:每个函数名必须唯一,如果重新定义函数那么新定义将取代函数原先的定义,而这不会引发错误消息。
2.函数退出状态
Bash shell将函数看作小型脚本,并以退出状态结束,函数退出状态有三种方式
(1) 使用标准变量$?来确定函数的退出状态
(2) 使用return命令
(3) 使用函数输出
3.向函数传递参数
如下:
这里的函数所使用的参数值为私有的参数环境变量,所以函数无法从脚本命令行访问脚本参数值,即函数所使用的变量$1和$2,不同于脚本主代码的变量$1和$2,如果函数想使用,必须在调用该函数时手动传递这些数据。
4.函数使用的全局变量和局部变量
(1)全局变量是在shell脚本内处处有效的变量。默认情况下,脚本中定义的变量都是全局变量,在函数外部定义的变量,在函数内部仍能正常访问
(2)与全局变量相对,函数内部使用的变量可以称为局部变量,只需要在局部变量前面冠以local关键字,关键字local确保变量仅在函数内部使用,如果脚本在函数外部有同名变量,那么shell将能区分开这两个变量。