shell语法基础
一、变量
1、linux大小写敏感,变量取名要注意大小写。可以通过变量名前面加$来访问变量的内容。可以通过使用read命令来将用户输入的值赋给一个变量。
2、给变量赋值时,如果字符串中包含空格,就必须用引号把他们引起了,还要注意在等号两边不能有空格。
3、变量在双引号中会用变量值替换,而在单引号中就不会替换,也可以通过转义字符\来取消$的特殊含义。
例:myvar=“Hi there!”
echo $myvar
echo "$myvar"
echo ' $myvar'
echo \$myvar
将会输出如下:Hi there!
Hi there!
$myvar
$myvar
4、环境变量:环境变量通常用大写字母做名字,为了与环境变量区别开来,用户自定义变量一般都用小写字母。
常用的环境变量有:
二、控制结构
1、shell的布尔判断命令[或test。test的三种条件类型:字符串比较、算术比较和文件有关的条件测试。
2、控制结构
Ø if语句:
if condition
then
statements
else
Statements
Fi
例:#!/bin/sh
if [ -f /root/cherie_test/test_path.sh ];then
echo "/root/cherie_test/test_path.sh exists"
fi
if [ -d /root/cherie_test/test_path.sh ];then
echo "/root/cherie_test/test_path.sh is a director"
else
echo "/root/cherie_test/test_path.sh is not a directory"
fi
解析:[ ]前后都要有空格,不然会报[: missing `]'错误;if与[之间也需要有空格,没有的话会报syntax error near unexpected token `then'错误。
Ø elif语句。对if语句的进一步测试。
例:#!/bin/sh
echo "Is it morning? Please answer yes or no "
read timeofday
if[ $timeofday = "yes"]; then
echo "Good morning"
exit 0
elif [ $timeofday = "no" ];then
echo "Good afternoon"
exit 0
else
echo "Sorry,$timeofday not recognized. Enter yes or no "
exit 1 //异常退出
fi
解析:elif会对在第一个if条件不满足的情况下进行进一步测试,如果两次测试的结果都不成功,就打印出一条错误信息并以1为退出码退出。
Ø for 语句。语法格式:for variable invalues
do
Statements
done
例:#!/bin/sh
for file in $(ls f*.sh); do
lpr $file
done
exit0
解析:打印当前目录中所有以字母f开头的脚本文件。for的参数来着$()中的命令的输出结果,shell扩展f*.sh给出所有匹配此模式的文件的名字。此例中可能会报错lpr: error - scheduler not responding!这是vim配置问题。
Ø while 语句。语法格式: while condition do
Statements
Done
例:#!/bin/sh
foo=1
whlie [ "$foo" -le 20 ]
do
echo "Here we go again"
foo=$(($foo+1))
done
exit 0
解析:测试foo的值,如果它小于20就执行循环体,-le表示小于。
算表达式的使用: count=1
count=$[${count} + 1] 变量加1
Ø until语句。语法格式:until condition
do
Statements
Done
它与while循环很相似,只是把条件测试反过来,循环将执行直达条件为真为止,而不是条件为真时反复执行。
Ø case 语句。语法格式case variable in
pattern statements;;
pattern statements;;
...
esac
注意,每个模式行都以双分号结尾。
例:#!/bin/sh
echo "Is it morning?Please answer yes or no"
read timeofday
case "$timeofday" in
yes|y|Yes|YES)
echo "Good morning"
echo "Up bright and early this morning"
;;
n*|N*) echo "Good afternoon";;
*) echo "Sorry ,answer not recognized";;
esac
exit 0
解析:case语句被执行时,会把timeofday的内容与各个字符串依次进行比较。一旦某个字符串输入匹配成功,case命令就会执行紧随右括号后面的代码。case命令会对用来做比较的字符串就行正常的通配符扩展,因此可以指定字符串的一部分在其后加上*通配符,如n*;只使用一个单独的*表示匹配任何可能的字符串。
三、函数
1、函数的定义。我们只需简单的写出它的名字,然后是一对空括号,再把有关的语句放在一对花括号中,如:function_name () {
Statements
}
例:#!/bin./sh
foo () {
echo "Function foo is executing"
}
echo"script starting"
foo
echo "script ended"
exit 0
运行结果如下: script starting
Function foo is executing
script ended
解析:当遇到foo()结构时,它知道定义了一个名为foo的函数。当执行到foo行时,shell就知道应该去执行刚才定义的函数。
注:在调用一个函数之前必须先对它进行定义。
四、命令
Ø break 命令。终止循环
Ø :命令。冒号(:)命令是一个空命令。它偶尔会被用于简化条件逻辑,相当于true的一个别名。由于它是内置命令,所以它运行的比true快,但它的输出可读性较差。
Ø continue命令。使for、while或until循环跳到下一次循环继续执行。continue可以带一个可选的参数以表示希望继续执行的循环嵌套层数,也就是说你可以部分的跳出嵌套循环。
Ø .命令。点(.)命令用来执行当前shell中的命令。
Ø echo命令。使用echo命令来输出结尾带有换行符的字符串。 常用 echo -n来去掉换行符。
Ø eval命令。eval命令允许你对参数进行求值,有点像一个额外的$。
Ø exec命令。将当前shell替换为一个不同的程序,脚本程序中exec命令后面的代码都不会执行。
Ø exit n命令。exit命令使脚本程序以退出码n结束运行。,退出码0表示成功,退出码1~125是脚本程序使用的错误代码。
Ø export命令。export命令将作为它参数的变量导出到子shell中,并使之在子shell中有效。在默认情况下,在一个shell中被创建的变量在这个shell调用的下级(子)shell中是不可用的。export命令把自己的参数创建为一个环境变量,而这个环境变量可以被其他脚本和当前程序调用的程序看见。
例:脚本export 2
脚本export1
第一个空行的出现是因为变量foo在export2中不可用,所以$foo被赋值为空,echo一个空变量将输出一个空行。Bar用export声明后在export1中仍然有效。
Ø expr命令。expr命令将它的参数当作一个表达式来求值。
Ø printf命令。语法:printf “format string” paremeter1 paremeter2
它支持的转义序列:
Ø return命令。return命令的作用是使函数返回。
Ø set命令。set命令的作用是为shell设置参数变量。还可以通过set命令和它的参数来控制shell的执行方式。其中最常用的命令格式是set -x,它让一个脚本程序跟踪显示它当前执行的命令。
Ø shift命令。shift命令把所有参数变量左移一个位置,使$2变成$1,$3变成$2,依此类推。
Ø trap命令。用于指定在接收到信号后将要采取的行动。trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名,trap command signal。
Ø unset命令。unset命令的作用是从环境中删除变量或函数。
Ø find 命令。查找文件的功能。语法格式:find [path] [option] [tests] [actions]
一些常用的选项:
测试部分,可以提供给find命令的测试非常多,每种测试返回的结果有两种可能:true或false。find命令开始工作时,它按照顺序将定义的每种测试依次应用到它搜索到的每个文件上。
我们还可以用操作符来组合测试。大多数操作符有两种格式:短格式和长格式,
常见的动作:
Ø grep命令。使用grep命令在文件中搜索字符串。grep语法格式:grep[option] pattern [FILES] 如果没有文件名,则搜索标准输入。
grep命令的一些主要选项:
五、正则表达式
特殊字符:
如果你想将上述字符用作普通字符,就需要在它们前面加上\字符。所以,如果你想使用$字符,只需要简单的将它写为\$。
在方括号中还可以使用一些有用的特殊匹配模式,
匹配字符:
跟踪脚本程序中复杂错误的主要方法是设置各种shell选项。为了完成这一任务,你可以在调用shell时加上命令行选项,各种shell选项: