shell程序的基本特征(解释型语言):
1.所有shell程序第一行都是以#!开头,后面跟上执行此shell程序的shell解释器的完整路径。
2.习惯在程序的第二行以注释的方式写出程序的名称。
3.最简单的shell程序就是一组shell命令的堆砌。
4.shell程序就是普通的文本文件,添加可执行权限后方可执行(chmod +x *.sh)。
shell中的变量分为:局部变量,环境变量,位置变量。
shell是一种解释型语言,与C、JAVA不同,在编程时无需事先声明变量,当对一个变量赋值时也就定义了该变量。局部变量:只在当前的进程和程序中有效的变量。
shell中的变量是无数据类型的,可以使用同一变量存放不同类型的值。变量赋值后只需在变量前加$符号,即可访问变量的值。可用赋值符号(=)为变量赋值,变量的值如果不是带空格的字符串则可不必加引号。变量输出使用的指令:echo。
环境变量:一个用户的所有进程中都可以访问的变量。
export命令查看系统的环境变量列表。
环境变量的访问:需要在一个环境变量前加一个$符号
环境变量的定义:使用export命令定义环境变量,环境变量的名称一般都是大写的。
export XX=123 此种定义在重新引导系统时会失效。
echo $XX
在系统配置文件中定义环境变量:上面定义的环境变量,只在当前shell中运行的所有进程中有效。可以在系统配置中加入这些环境变量的定义。在环境变量配置文件/etc/profile中定义两个环境变量:
export A1=hell
export A2=123
位置变量:是shell程序在运行时传入的参数。程序中可以用变量的形式来调用这些参数。这些参数存放在1到9的9个特殊的变量名中,被形象的称为位置变量。同普通变量一样,位置变量用前缀$加数字来表示。如:第5个参数,表示为$5。
shell中的不常用的运算符:**对两个变量的幂运算,+=,%=,/=...
t=`expr $1**$2`(注意反单引号,命令替换) #用expr改变运算顺序,求x的y次方。($1$2位置变量)
t=$[t*3]
s=$[s+t]
(+-*/两边要有空格)
输入和输出
echo $str
echo $str>file #将结果报错到file中,如果没有文件会新建一个文件。如果已经有文件则会覆盖以前的文件。
echo $str>>file #将结果追加到文件file中。
echo输出的内容可以有下面的格式控制字符:
\c:末尾追加上\c表示这一行输出完毕后不换行。
\t:输出一个挑个,相当于按下‘tab’键。
\n:输出一个换行。
read:从键盘或文件中读入信息,并赋给一个变量。
如果多个变量时多个变量用空格隔开。
在读取语句后天就<filename,表示从文件中读取数据并赋给变量。
文件重定向:执行命令时指定命令的输入、输出和错误的输出和出入方式。
(修改了默认的数据流向)(输出>、>> 输入<)(标准输入0,标准输出1,标准错误2)
command>filename 把标准输出重定向到一个文件中(会清空原有内容)
command>>filename 追加方式
command 1>filename 标准输出设备编号为1,上面的省略了,其实是等价的
command>filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(2表示标准错误)
command 2>filename 把标准输出的错误重定向到一个文件中
command>>filename 2>&1 把标准输出和标准错误一起追加到一个文件中
command< filename > filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出
command < filename
shell 中的单引号、双引号、反引号、反斜线在命令中的特殊含义。
双引号:引用一个字符串。字符串里不能直接使用$、引号、双引号、反斜线、反引号这些特殊符号。如果字符串里没有空格,则与不使用双引号效果相同。
单引号:引用一个字符串,并忽略特殊符号。如果双引号中再使用单引号,则输出时会输出这个单引号。
双引号要想输出双引号,要用反斜线。单引号的字符串如果要包含单引号,也要用反斜线。字符串中要使用单引号,可以用双引号将其引起来,避免使用反斜线。单引号中使用双引号,也不需使用反斜线。
反引号用于执行引号中的系统命令,并将命令结果返回,返回结果可赋给一个变量。(命令替换)
反斜线对特殊符号转义。
var1=1000
echo "hello linux $var1"
结果:hello linux 1000
var1=1000
echo ’hello linux $var1‘
结果:hello linux $var1
echo "hello "linux""
结果:hello linux
echo "hello \"linux\""
结果:hello "linux"
echo 'hello "linux"'
结果:hello "linux"
测试语句
对变量大小、字符串、文件属性等内容进行判断。
test 字符串、数字、文件状态等内容的测试。
文件状态测试:文件的权限、有无、属性、类型等内容进行判断。与其他语言不同的是,test命令的测试结果,返回0时表示测试成功。返回1时表示测试失败。
文件状态测试表
-d测试文件是否是目录文件。 | -s测试文件是否非空。 |
-f测试文件是否是正规文件。 | -w测试文件是否可写。 |
-L测试文件是否是是符号链接文件。 | -u测试文件是否有suid位设置。 |
-x测试文件是否可执行。 | -r测试文件是否可读 。 |
数值测试:比较两个数值大小或相等关系,相当c中的比较运算符。shell中的数值测试有下面2种情况。
1.test 第一个操作数 操作符 第二个操作数
2.用中括号代替test命令。[ 第一个操作数 操作符 第二个操作数 ] 注意括号处有空格。
数值比较符表
-eq是否相等 | -ne是否不等 |
-le第一个数是否不大于第二个数 | -ge第一个数是否不小于第二个数 |
-gt第一个数是否大于第二个数 | -lt第一个数是否小于第二个数 |
逻辑测试:将多个条件进行逻辑运算,常用作循环语句或判断语句的条件。
三种逻辑测试:-a逻辑与;-o逻辑或;!逻辑非,条件为假时结果为真;
字符串测试:是否相等或为空。
test 字符串 字符串比较符 字符串 [ 字符串 字符串比较符 字符串 ]
test 字符串1 字符串比较符 字符串2 [ 字符串1 字符串比较符 字符串2 ]
字符串比较符:=;!=;-z(测试字符串是空字符串);-n(测试字符串是非空字符串)
流程控制结构
if 条件1 then 命令1 elif 条件2 then 命令2 else 命令3 fi |
if 条件1;then 命令1 elif 条件2; then 命令2 else 命令3 fi |
#!/bin/bash
# judge a file is writeable
if test -z $1
then echo 'please input a file name'
else
if test -w $1
then echo "writeable"
else
echo "unwriteable"
fi
if test -x $1
then echo "executeable"
else
echo "unexecuteable"
fi
fi
for 变量名 in 列表 do 命令1 命令2... done |
for char in a s d f g do echo $char done |
for str do echo $str done (从位置变量列表读) |