shell 学习笔记
2013-07-10 21:55
211 查看
shell 脚本语言是一种解释型语言;
shell脚本的实质是 shell命令的有序集合;
1)建立shell文件
2)赋予可执行的权限 chmod a+x filename
3)执行shell文件 ./filename
命名规则通C语言的命名规则;
变量赋值的方式:先写变量名,然后是 = ,紧接着是新值,中间不要有空格。当想取出变量的值时,加“$"符号即可
当赋值的内容中有空格时,注意请加上双引号; 可以使用unset +变量名 可以取消变量的赋值
例如:
定义:name=value (使用带空格的值时加引号)
访问:$name
例:FRUIT=apple
$echo $FRUIT(结果为apple)
$echo FRUIT(结果为FRUIT)
Bourne Shell只支持标量,Korn Shell中支持数组。
数组创建: name[index]=value 数组访问:${name[index]}
只读变量:readonly name
删除变量:unset name
局部变量(只在当前SHELL实例中存在),环境变量(SHELL任何子进程都能使用),SHELL变量(正确运行所必需,如PWD,PATH,HOME等)。
导出环境变量:export name
可能会见到形如 ${variable}形式的变量,变量名两侧的额外的花括号通常用来帮助识别 $ 后的变量名。
此外注意shell中的反引号的用途:
反引号 ·是在 波浪号 ~ 同一键位。 反引号允许你将shell 命令的输出赋给变量,它是脚本编程中比较重要的构件之一。
用法如: test=`date` , shell会运行反引号中的命令,并将其输出给变量test。
下面我们举例,在脚本中通过反引号获得当前日期并用他来生成唯一文件名:
注意date命令后要有空格 `date +%y%m%d`
chmod u+x date.sh
./date.sh 此时生成了文件log.130710
这里用到了 重定向输入 > 。此外还有重定向输入 < , 还有 >> 表示将输出追加到文件的末尾。
$1,......$9分别包括第一个到第九个命令行的参数
$# 命令输入的个数
$* $@ :所有命令行的参数
$? :前一个命令的退出状态
$$ 包含正在执行进程的ID号
3)环境变量
4)预定义变量
说明性语句:以#开头到本行结束;
功能性语句 :shell命令、用户程序和其他shell程序;
结构性语句:条件测试,多路分支,循环语句,循环控制语句等等;
数学运算:
expr 算术运算命令 主要用于进行简单的整数运算:包括 加+、减-、乘 \* 、除/、 求模 %;
注意:
a)expr后的表达式个符号间需用空格隔开
b)expr支持的操作符有: |、&、<、<=、=、!=、>=、>、+、-、*、/、%
c)expr支持的操作符中所在使用时需用\进行转义的有:|、&、<、<=、>=、>、*
e)expr只支持整数运算
注意变量与运算符之间要有空格,比如:: $ expr 1 + 9, 输出结果为 10.
此外要特别注意expr命令中的一些诡异的结果,如 expr 5 * 2, 会出错。此时我们需要使用shell的转义字符\ 来识别容易被shell错误解释
的任意字符:
注意bash shell 为了保持和Bourne shell的兼容而包含了expr命令,他注意使用$ 和[ ]来实现把一个数学运算结果赋给某个变量,
如 $[ operation ] 将数学表达式圈起来:
注意:
a)$[]将中括号内的表达式作为数学运算先计算结果再输出
b)对$[]中的变量进行访问时前面需要加$
c)$[] 也只支持整数运算
、
进行浮点数计算的方法:
bc是linux下的一个简单计算器,支持浮点数计算,在命令行下输入bc即进入计算器程序,而我们想在程序中直接进行浮点数计算时,利用一个简单的管道即可解决问题。
注意:
1)经我测试bc支持除位操作运算符之外的所有运算符。
2)bc中要使用scale进行精度设置
3)浮点数计算实例
基本格式为: variable=`echo "options; ecpression" | bc` , 注意使用了反引号。
输出结果为 9.42
此外可以使用 awk 进行浮点数运算:
输出结果为1
介绍:
awk是一种文本处理工具,同时也是一种程序设计语言,作为一种程序设计语言,awk支持多种运算,而我们可以利用awk来进行浮点数计算,和上面bc一样,通过一个简单的管道,我们便可在程序中直接调用awk进行浮点数计算。
注意:
1)awk支持除微操作运算符之外的所有运算符
2)awk内置有log、sqr、cos、sin等等函数
3)浮点数计算实例
输出结果为1
test 可测试三种对象 :字符串 整数 文件属性
tput 用于设置中断的工作模式;
1、使用if_then语句
if command
then
commands
fi
先运行if后面的命令,如果命令的退出状态是0(成功执行命令),就将执行then后面,fi前面的所有命令。否则就跳到fi 后面继续执行。
2、if-then-else语句
if command
then
commands
else
commands
fi
3、嵌套if语句
if command1
then
commands
elif command2
then
commands
elif command3
then
commands
fi
4、test命令(方括号[ ]为同义词)
用于提供对条件的判断
if test condition 也可以不用test condition,而使用 [ conditon ] ([ , ] 的前后必须有空格)
then
commands
fi
condition有三种:
(1)数值比较: –eq, –ne, –ge,-gt, -le, lt
但是要注意:test命令无法处理存储在变量中的浮点值。
使用bash计算器bc时,只是欺骗了shell把浮点值作为字符串值存储于一个变量中。如果只是先使用echo语句显示结果,这种方法很好。但是在面向数值的函数(如数值测试条件)中不起作用。 底线是不能在test中使用非整数变量.
(2)字符串比较:=,!=,<,>,-n(检测字符串长度是否大于0),-z(检测字符串长度是否等于0)
字符串相等:测试比较将所有标点符号和大写都考虑在内
字符串顺序:要注意两点:
1)’>’,’<’一定要用’\’转义,否则shell会将它们当做重定向符号,将字符串值看做文件名
2)大于和小于的顺序与在sort命令中的顺序不同。
在test中,同一个字母,大写字母>小写字母,在sort中,相反。
字符串大小:评估一个变量是否包含数据时,使用-n和-z比较方便对空变量和未初始化的变量检测出的长度也为0
(3)文件比较
文件比较是shell脚本中最强大和最常用的一类比较。test可以测试文件状态和路径。(使用的非常频繁!)
-d file: 检查file是否存在并且是一个目录
-e file: 检查file是否存在
-f file: 检查file是否存在并且是一个文件
-r file: 检查file是否存在并且可读
-s file: 检查file是否存在并且不为空
-w file: 检查file是否存在并且可写
-x file: 检查file是否存在并且可执行
-O file: 检查file是否存在并且被当前用户拥有
-G file:检查file是否存在并且默认组是否为当前用户组
file1 –nt file2: 检查file1是否比file2新
file1 –ot file2: 检查file1是否比file2旧
5、复合条件查询
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
6、if-then的高级特征
(1)使用双圆括号表示数学表达式
(( expression ))
expression包括除了标准数学操作符外的其他操作符如下:
++, --, !, ~, **, <<, >>, &, |, &&, ||
(2)使用双方括号表示高级字符串处理函数
[[ expression ]]
提供了除test命令中的标志字符串比较以外的模式匹配功能
在模式匹配中,可以定义与字符串值相匹配的正则表达式
来个if嵌套语句的例子,判断润年:
7、case 命令
可以使用case命令,而不是编写所有的elif语句来继续检查相同的变量值。
case命令以列表导向检查单个变量的多个值:
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
A, for … in 语句
for 变量 in seq字符串
do
action
done
说明:seq字符串 只要用空格字符分割,每次for…in 读取时候,就会按顺序将读到值,给前面的变量。
B.for((赋值;条件;运算语句))
for((赋值;条件;运算语句))
do
action
done;
while 条件语句
do
action
done
3,until循环语句
until 条件
do
action
done
意思是:直到满足条件,就退出。否则执行action.
echo -n 表示 省略语句后面的换行符,默认是有换行符的;下面代码中,在打印的语句后面有 \c 表示不换行;\b表示退格 \f表示清屏;
shell脚本的实质是 shell命令的有序集合;
1 shell编程的基本过程
1)建立shell文件2)赋予可执行的权限 chmod a+x filename
3)执行shell文件 ./filename
2 shell 变量
1)用户自定义变量
命名规则通C语言的命名规则;变量赋值的方式:先写变量名,然后是 = ,紧接着是新值,中间不要有空格。当想取出变量的值时,加“$"符号即可
当赋值的内容中有空格时,注意请加上双引号; 可以使用unset +变量名 可以取消变量的赋值
例如:
定义:name=value (使用带空格的值时加引号)
访问:$name
例:FRUIT=apple
$echo $FRUIT(结果为apple)
$echo FRUIT(结果为FRUIT)
Bourne Shell只支持标量,Korn Shell中支持数组。
数组创建: name[index]=value 数组访问:${name[index]}
只读变量:readonly name
删除变量:unset name
局部变量(只在当前SHELL实例中存在),环境变量(SHELL任何子进程都能使用),SHELL变量(正确运行所必需,如PWD,PATH,HOME等)。
导出环境变量:export name
可能会见到形如 ${variable}形式的变量,变量名两侧的额外的花括号通常用来帮助识别 $ 后的变量名。
此外注意shell中的反引号的用途:
反引号 ·是在 波浪号 ~ 同一键位。 反引号允许你将shell 命令的输出赋给变量,它是脚本编程中比较重要的构件之一。
用法如: test=`date` , shell会运行反引号中的命令,并将其输出给变量test。
下面我们举例,在脚本中通过反引号获得当前日期并用他来生成唯一文件名:
#!/bin/bash #date.sh today=`date +%y%m%d` ls /home > log.$today
注意date命令后要有空格 `date +%y%m%d`
chmod u+x date.sh
./date.sh 此时生成了文件log.130710
这里用到了 重定向输入 > 。此外还有重定向输入 < , 还有 >> 表示将输出追加到文件的末尾。
2)位置变量
$0 :$1,......$9分别包括第一个到第九个命令行的参数
$# 命令输入的个数
$* $@ :所有命令行的参数
$? :前一个命令的退出状态
$$ 包含正在执行进程的ID号
3)环境变量
4)预定义变量
3 shell程序和语句
shell程序时由 零和多条shell语句构成,shell语句包括:说明性语句:以#开头到本行结束;
功能性语句 :shell命令、用户程序和其他shell程序;
结构性语句:条件测试,多路分支,循环语句,循环控制语句等等;
1)说明性语句
在shell程序的开头加 #!/bin/sh 意思是告诉OS用那种类型的shell来解释执行改程序2)功能性语句
read 从标准输入读入一行,并赋值给后面的变量;可阻塞数学运算:
expr 算术运算命令 主要用于进行简单的整数运算:包括 加+、减-、乘 \* 、除/、 求模 %;
注意:
a)expr后的表达式个符号间需用空格隔开
b)expr支持的操作符有: |、&、<、<=、=、!=、>=、>、+、-、*、/、%
c)expr支持的操作符中所在使用时需用\进行转义的有:|、&、<、<=、>=、>、*
e)expr只支持整数运算
注意变量与运算符之间要有空格,比如:: $ expr 1 + 9, 输出结果为 10.
此外要特别注意expr命令中的一些诡异的结果,如 expr 5 * 2, 会出错。此时我们需要使用shell的转义字符\ 来识别容易被shell错误解释
的任意字符:
$ expr 5 \* 2 $ 10
注意bash shell 为了保持和Bourne shell的兼容而包含了expr命令,他注意使用$ 和[ ]来实现把一个数学运算结果赋给某个变量,
如 $[ operation ] 将数学表达式圈起来:
注意:
a)$[]将中括号内的表达式作为数学运算先计算结果再输出
b)对$[]中的变量进行访问时前面需要加$
c)$[] 也只支持整数运算
、
$ v1=$[1 + 5] $ echo $v1 $ 6 $ v2=$[$v1 * 2] $ 12
进行浮点数计算的方法:
bc是linux下的一个简单计算器,支持浮点数计算,在命令行下输入bc即进入计算器程序,而我们想在程序中直接进行浮点数计算时,利用一个简单的管道即可解决问题。
注意:
1)经我测试bc支持除位操作运算符之外的所有运算符。
2)bc中要使用scale进行精度设置
3)浮点数计算实例
基本格式为: variable=`echo "options; ecpression" | bc` , 注意使用了反引号。
var=3.14 var=`echo "scale=2;$var*3"|bc` echo $var
输出结果为 9.42
此外可以使用 awk 进行浮点数运算:
var=1 var=`echo "$var 1"|awk '{printf("%g",$1*$2)}'` echo $var
输出结果为1
介绍:
awk是一种文本处理工具,同时也是一种程序设计语言,作为一种程序设计语言,awk支持多种运算,而我们可以利用awk来进行浮点数计算,和上面bc一样,通过一个简单的管道,我们便可在程序中直接调用awk进行浮点数计算。
注意:
1)awk支持除微操作运算符之外的所有运算符
2)awk内置有log、sqr、cos、sin等等函数
3)浮点数计算实例
var=3.14 var=`echo "$var 2"|awk '{printf("%g",sin($1/$2))}'` echo $var
输出结果为1
test 可测试三种对象 :字符串 整数 文件属性
tput 用于设置中断的工作模式;
3)结构性语句:
条件语句及多路分支语句用法:1、使用if_then语句
if command
then
commands
fi
先运行if后面的命令,如果命令的退出状态是0(成功执行命令),就将执行then后面,fi前面的所有命令。否则就跳到fi 后面继续执行。
2、if-then-else语句
if command
then
commands
else
commands
fi
3、嵌套if语句
if command1
then
commands
elif command2
then
commands
elif command3
then
commands
fi
4、test命令(方括号[ ]为同义词)
用于提供对条件的判断
if test condition 也可以不用test condition,而使用 [ conditon ] ([ , ] 的前后必须有空格)
then
commands
fi
condition有三种:
(1)数值比较: –eq, –ne, –ge,-gt, -le, lt
但是要注意:test命令无法处理存储在变量中的浮点值。
使用bash计算器bc时,只是欺骗了shell把浮点值作为字符串值存储于一个变量中。如果只是先使用echo语句显示结果,这种方法很好。但是在面向数值的函数(如数值测试条件)中不起作用。 底线是不能在test中使用非整数变量.
(2)字符串比较:=,!=,<,>,-n(检测字符串长度是否大于0),-z(检测字符串长度是否等于0)
字符串相等:测试比较将所有标点符号和大写都考虑在内
字符串顺序:要注意两点:
1)’>’,’<’一定要用’\’转义,否则shell会将它们当做重定向符号,将字符串值看做文件名
2)大于和小于的顺序与在sort命令中的顺序不同。
在test中,同一个字母,大写字母>小写字母,在sort中,相反。
字符串大小:评估一个变量是否包含数据时,使用-n和-z比较方便对空变量和未初始化的变量检测出的长度也为0
(3)文件比较
文件比较是shell脚本中最强大和最常用的一类比较。test可以测试文件状态和路径。(使用的非常频繁!)
-d file: 检查file是否存在并且是一个目录
-e file: 检查file是否存在
-f file: 检查file是否存在并且是一个文件
-r file: 检查file是否存在并且可读
-s file: 检查file是否存在并且不为空
-w file: 检查file是否存在并且可写
-x file: 检查file是否存在并且可执行
-O file: 检查file是否存在并且被当前用户拥有
-G file:检查file是否存在并且默认组是否为当前用户组
file1 –nt file2: 检查file1是否比file2新
file1 –ot file2: 检查file1是否比file2旧
5、复合条件查询
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
6、if-then的高级特征
(1)使用双圆括号表示数学表达式
(( expression ))
expression包括除了标准数学操作符外的其他操作符如下:
++, --, !, ~, **, <<, >>, &, |, &&, ||
(2)使用双方括号表示高级字符串处理函数
[[ expression ]]
提供了除test命令中的标志字符串比较以外的模式匹配功能
在模式匹配中,可以定义与字符串值相匹配的正则表达式
来个if嵌套语句的例子,判断润年:
#!/bin/bash # This script will test if we're in a leap year or not. year=`date +%Y` #命令的结果可以直接赋值给一个变量,如果要检查一个命令的返回状态,就用$? if [ $[$year % 400] -eq 0 ]; then echo "This is a leap year. February has 29 days." elif [ $[$year % 4] -eq 0 ]; then if [ $[$year % 100] -ne 0 ]; then #嵌套从这里开始 echo "This is a leap year, February has 29 days." else echo "This is not a leap year. February has 28 days." fi else echo "This is not a leap year. February has 28 days." fi
7、case 命令
可以使用case命令,而不是编写所有的elif语句来继续检查相同的变量值。
case命令以列表导向检查单个变量的多个值:
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
4)高级结构性语句:循环语句(for,while,until用法)
1,for循环使用方法(for/do/done)A, for … in 语句
for 变量 in seq字符串
do
action
done
说明:seq字符串 只要用空格字符分割,每次for…in 读取时候,就会按顺序将读到值,给前面的变量。
#!/bin/bash for i in $(seq 10) do echo $i done
B.for((赋值;条件;运算语句))
for((赋值;条件;运算语句))
do
action
done;
#!/bin/bash for((i=1;i<=10;i++)) do echo $i done2,while循环使用(while/do/done)
while 条件语句
do
action
done
#!/bin/bash i=12 while [[ $i -gt 6 ]] do echo $i ((i--)) done
3,until循环语句
until 条件
do
action
done
意思是:直到满足条件,就退出。否则执行action.
#!/bin/bash i=5 until [[ $i -lt 0 ]] do echo $i ((i—)) done
echo -n 表示 省略语句后面的换行符,默认是有换行符的;下面代码中,在打印的语句后面有 \c 表示不换行;\b表示退格 \f表示清屏;
相关文章推荐
- Shell学习笔记1
- Kafka-2.11学习笔记(二)Shell脚本介绍
- shell学习笔记(1)-变量
- shell学习笔记
- 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等
- Linux学习笔记六-shell
- 学习笔记——shell命令(2)AWK
- shell学习笔记
- shell学习笔记之条件(二)
- Power Shell 学习笔记(三)变量
- shell脚本编程之if语句学习笔记
- Shell学习笔记
- Power Shell 学习笔记(四)对象管道
- shell 学习笔记2-- ctrl +
- shell脚本学习笔记 (一)
- Hadoop学习笔记(五)---HDFS shell操作
- Liunx 命令行与shell脚本编程大全 第八章学习笔记(Linux系统的包管理基础)
- 2015—01—22 Shell学习笔记基础(1)
- FiORI2.0学习笔记-shell controller及&component.js
- shell脚本学习笔记之文本处理命令