Shell基本元素
(1)#! /bin/bash 必须的,指出shell的类型
(2)# 注释
(3)变量
(4)控制
一个shell脚本
vi mkdir.sh
#!/bin/bash
# this is mkdir
cd /home
mkdir shellTest
echo "shellTest is created."
1.echo命令用于在屏幕上显示消息
使用方式:echo 要显示的内容
2.#用于在shell脚本中进行注释
Shell的一般结构
shell 类型
函数
主过程
一般模板 abc.sh
#! /bin/bash shell类型
#a simple shell script example
#a function
sayhello() 函数
{
echo "Enter Your name:"
read name 读取来自键盘输入的变量
echo "Hello $name"
}
echo "programme starts here..." 主过程
sayhello
echo "programme ends."
Shell中的特殊符号
1、注释符#
除了#!/bin/bash里的#特殊
2、美元符 $
变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来
3、单引号
被引起的字符全部做普通字符,即全部原样
echo ‘my $SHELL’
4、双引号
引号内的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。
5、倒引号(数字1键旁边的那个键)
引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。
`pwd` 即pwd命令的执行结果
$LOGNAME 系统变量
区别下面几句:
echo ‘my home is $HOME’
echo “my home is $HOME”
echo `my home is $HOME`
echo “my home is `pwd`”
echo ‘my home is `pwd`’
6. 反斜线
反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。、
echo “Filename is N0\$\`”
变量
创建变量
1、可以在任何时间通过简单的赋值来创建变量
语法:
<variable name>=<value>
Shell中的所有变量都被当作字符串
2、引用变量
$符号用于引用一个变量的内容
variable1=${variable2}
3、在执行shell脚本时,shell还允许用户从键盘中输入一个值给变量。可以使用read命令来做。
read fname
命令替换
1、在单个命令行中使用多个命令的一个方法是通过命令替换
例:echo "The date is `date`"
2、expr命令:用于求值算术表达式。该命令输出被发送到标准输出
例:expr 4+5 将在屏幕上显示9
3、可以在$((...))中包括一个表达式,用下面的命令来计算它的值:
$((表达式))
实验:编写一个简单的四则计算器
echo "Please enter the first number."
read totalqueries
echo "Please enter the second number."
read answered
echo "Please enter the operation."
read opt
result=$((totalqueries $opt answered))
echo "the result of $totalqueries $opt $answered=$result"
条件判断命令
test n1 -参数 n2 (或 –参数 表达式)
[ n1 -参数 n2 ]
真返回0,假返回1。
参数:
-lt 小于
-le小于等于
-gt 大于
-ge 大于等于
-eq 等于
-ne 不等于
·test语句的等价形式[ 1 –lt 4 ]
可用中括号代替test,把表达式括起来实现判断
注意表达式与中括号间有空格。
test 1 –lt 4 #判断1<4
echo $? #结果为0
文件测试
-f 存在且是普通文件
-d 存在且是目录
-s 存在且字节数大于0
-r 存在且可读
-w 存在且可写
-x 存在且可执行
如:test -d “mydoc” [ -d "mydoc" ]
判断mydoc是否是目录
eg:检测从命令行输入的文件是否存在
if [ $# -ne 1 ]
then
echo "usage -$0 file-name"
exit 1
fi
if [ -f $s1 ]
字符串测试
test s 字符串s非空
test s1=s2 字符串s1等于s2
test s1!=s2 字符串s1不等于s2
test -z s 字符串长=0,即为空串
test -n s 字符串长>0
=: 等于则为真
!=:不相等则为真
-z字符串:字符串长度为零则为真
-n字符串:字符串长度不为零则为真
分支语句
if [ $# -eq 0 ]
then
echo “输入了0个参数”
elif [ $# -gt 1 ]
then
echo “输入了多个参数”
else
echo “输入了1个参数”
fi
case “$#” in
0) echo “输入了0个参数” ;;
1) echo “输入了1个参数” ;;
*) echo “输入了多个参数”;;
esac
每个分支条件后必须以两个分号结尾
循环语句
只有条件为真时,就执行do和done之前的命令
while <条件>
do
<命令(s)>
done
while例子——求1到100的和
declare -i i=1
sum=0
while [ $i –le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum
for循环取一列值作为输入并对循环中每个值执行循环
for variable_name in <list_of_values>
do
...
done
for i in `seq 1 9`
do
echo `expr $i \* 10`
done
或写 echo $(expr $i \* 10)
乘号前加转义符,与数字间要有空格。
Read变量
read 变量1 [变量2 …]
可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。
如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空;
如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。
输出a到b序列数各数的10倍数
read a b
for i in `seq $a $b`
do
echo `expr $i \* 10`
done