嵌入式_Shell编程(013)
Shell编程
什么是Shell
Shell就是命令解析器,将用户输入的指令转换为相应的机器能够运行的程序
常见的Shell类型
Bourne shell(sh)
Korn shell(ksh)
Bourne Again shell(bash)
C shell(包括csh和tcsh)
TENEX/TOPS C Shell(tcsh)
Shell脚本是一个包含一系列命令序列的文本文件。当运行运行这个脚本文件时,
文件中包含的命令序列将得到执行。(展示,运行hello.sh)
hello.sh
#!/bin/sh
#echo something
echo "hello world"
echo "hello"
mkdir /tnt
#!/bin/sh
符号#!用来指定该脚本文件的解析程序。在上面例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行的属性。
chmod +x filename
在进行shell编程时,以#开头的句子表示注释
在shell编程中,所有的变量都由字符串组成,并且不需要预先对变量进行声明,范例:
#!/bin/sh
#set variable a
a = "hello"
#print a
echo "A is:"
echo $a
有时候,变量名很容易与其他文字混淆
num=2
echo "this is the $numnd"
输出什么
会输出this is the 空
num=2
echo "this is the ${num}nd"
输出this is 2nd
$# 传入脚本的命令行参数个数
$* 所有命令行参数值,在各个参数值之间留有空格
$0 命令本身(shell文件名)
$1 第一个命令行参数
$2 第二个命令行参数
范例:
#!/bin/sh
echo "number of vars:"$#
echo "values of vars:"$*
echo "value of var1:"$1
echo "value of var2:"$2
echo "value of var3:"$3
echo "value of var4:"$4
运行./文件名 1 2 3 4
运行结果
number of vars:4
values of vars:1 2 3 4
value of var1:1
value of var2:2
value of var3:3
value of var4:4
局部变量
在变量首次被赋值时加上local关键字可以声明一个局部变量
范例:
#!/bin/bash
hello="var1"
echo $hello
function func1()
{
local hello="var2"
echo $hello
}
func1
echo $hello
输出? var1 var2 var1
tip:
变量赋值时,=左右两边不能有空格
BASH语句结尾不需要加分号
if语句
if[expression]
then
#code block
fi
if[expression]
then
#code block
else
#code block
fi
if[expression]
then
#code block
else if [expression]
then
#code block
else
#code block
fi
fi
if[expression];then
#code block
elif[expression]
then
#code block
else
#code block
fi
fi
比较
比较操作 整数操作 字符串操作
相同 -eq =
不同 -ne !=
大于 -gt >
小于 -lt <
大于或等于 -ge
小于或等于 -le
为空 -Z
不为空 -n
比较整数a和b是否相等: if[ $a = $b ] (也可以用eq)
比较整数a是否大于整数b: if [$a -gt $b ]
比较字符串a和b是否相等: if[ $a = $b ]
判断字符串a是否为空: if[ -z $a ]
tip:
1.在[和]符号的左右都留有空格
2.=左右都有空格
判断
-e 文件已经存在
-f 文件是普通文件
-s 文件大小不为零、
-d 文件是一个目录
-r 文件对当前用户可以读取
-w 文件对当前用户可以写入
-x 文件对当前用户可以执行
范例:
#!/bin/sh
folder=/home
[-r "$folder"]&&echo "can read $folder"
[-f "$folder"]||echo "this is not file"
for循环
bash中for循环的基本结构:
for var in [list]
do
#code block
done
其中$var是循环控制变量,list是var需要遍历的一个集合,do/done对包含了循环体,
另外如果do和for被写在同一行,必须在do前面加上":",如 for $var in [list]:do
范例:
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
如果列表被包含在一对双引号中,则被认为是一个元素,如
#!/bin/bash
for day in "Sun Mon Tue Wed Thu Fri Sat"
do
echo $day
done
tips:
上面的例子中,在for循环所在的那行,变量day是没有加"$"符号的,
而在循环体内,echo所在行变量$day是必须加上"$"符号的
while循环的基本结构:
while[condition]
do
#code block
done
until循环的基本结构:
until[condition]
do
#code block
done
while和unitl的区别在于while是条件为真的时候执行,until是条件为假的时候执行
case语句
bash中的case结构,可以用于进行多项分支控制
case "$var" in
condition1)
;;
condition2)
;;
*)
default statement;;
esac
范例:
#!/bin/bash
echo "hit a key,then hit return"
read Keypress
case "$Keypress" in
[A-Z]) echo "Uppercase letter";;
[a-z]) echo "Lowercase letter";;
[0-9]) echo "Digit";;
*) echo "Punctuation,whitespace,or other";;
esac

浙公网安备 33010602011771号