shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令。这点与Windows的命令提示符类似,但Linux shell的功能更加强大,我们可以使用 <和>对输入输出进行重定向 ,使用|在同时执行的程序之间实现数据的管道传递,使用$(n)获取子进程的参数。
重定向:
以b.txt为例: ll > b.txt
ll显示的东西 在b.txt显示了
管道传递: ll |grep “s”
在ll中 查找带s的文件
执行shell脚本的方法:1.sh 文件名,2.bash 文件名 ,3. source 文件名
程序的开头必须为 #!/bin/sh(放在文件的第一行)
shell编程是以“#” 为注释,但对 #!/bin/sh 却不是, #!/bin/sh是对shell的声明,说明你所用的是那种类型的shell及其路径
在进行shell编程的时候,以#开头的句子表示注释,直到这一行结束,C语言中是以// /**/表示注释
#!/bin/sh
A="hello world"
echo "A is"
echo $A
注意:shell在解释命令时的原则是第一个符号标记只能是程序或者命令,有空格的时候第一个符号标记就是“A”,当然就不成立了,
而没有空格的时候,第一个标记是“A=“hello world””,shell将解释为变量赋值指令,因此可以通过。
#!/bin/sh
echo $0
echo $#
echo $1
echo $2
echo $3
#!/bin/sh
cp a.sh t.sh
#!/bin/sh
A=10
echo $A
read A
echo $A
检查文件是否存在,test用法,
代码演示:
#!/bin/sh
#if test -f b.txt
if [ -f b.txt ]
then
echo "success"
else
echo "failed"
fi
注意:使用[]时,必须要在[符号和被检查的条件之间留出空格,可以把符号看作和test样,test和后面的条件之间总是有一个空格。
#!/bin/sh
echo "this is morning,yes or no"
read today
if [ $today = "yes" ]
then
echo "good morning"
#else
elif [ $today = "no" ]
echo "good afternoon"
fi
#!/bin/sh
if [ 3 -eq 4 ]
then
echo "yes"
else
echo "no"
fi
#!/bin/sh
if [ -d b.txt ]
then
echo "yes"
else
echo "no"
fi
#!/bin/sh
for food in 1 5 7 9
do
echo $food #输出结果
done
结果:
在默认情况下. shell的变量都是当作字符串来处理的,所以for在适合于对一系列字符串进行循环处理时使用,但需要执行特定次数时,for就不怎么适用了。
代码演示:
#!/bin/sh
echo "please password"
read passwd #输入数字
while [ "$passwd" != "6" ] #判断条件是否满足
do
echo "try again"
read passwd
done
exit 0
#!/bin/sh
food=1
while [ $food -le 20 ]
do
echo $food
food=$(($food+1)) #注意要用两个括号 不然food=$food+1 编译不通过
done
exit 0
#!/bin/sh
food=1
until [ $food -le 20 ]
do
echo $food
food=$(($food+1)) #注意要用两个括号 不然food=$food+1 编译不通过
done
exit 0
结果:啥都没有
until与while循环很相似,只不过while循环是条件满足时,循环继续,而until是条件满足时跳出循环。
#!/bin/sh
echo "this is morning,please yes or no"
read today #键盘输入
case "$today" in #判断
yes) echo "good morning";;
no) echo "good afternoon";;
y ) echo "good morning";;
n ) echo "good afternoon";;
* ) echo "answer not recognzed";;
esac #这个必须加
exit 0
注意每个模式都以双分号(;;)结尾,因为你可以在前后模式之间放置多条语句,所以需要使用一一个双分号来标记前一个语句的结束和后一个语句的开始
#!/bin/sh
food()
{
echo "ni zhen de henshuai"
}
echo "ni zhen sha"
food
echo "ni shi shazi"
如果要在shell函数中声明局部变量,则要使用local关键字,局部变量的作用域则局限在函数范围内。此外,函数还可访问全局作用范围内的其他shell变量。如果全局变量和局部变量出现了同名,则局部变量会覆盖全
使用局部变量的时候:
代码演示:
#!/bin/sh
sample_name="ni hao shuai"
food()
{
local sample_name="local ni hao shuai"
echo "ni zhen de henshuai"
echo $sample_name
}
echo "ni zhen sha"
food
echo $sample_name
echo "ni shi shazi"
exit 0
#!/bin/sh
yes_or_no()
{
echo "is your name $*?"
while true
do
echo "please enter yes or no"
read a
case "$a" in
y|yes) return 0;;
n|no) return 1;;
* ) echo "error"
esac
done
}
echo "original parameters are $*"
if yes_or_no "$1 " # shell脚本编程中,注意:Linux中返回0表示成功
then
echo "hi$1"
else
echo "never mind"
fi
exit 0
冒号(:)是一个空命令,它偶尔会被用于逻辑简化,相当于true的一个别名,由于它是内置命令,所以它的运行效率要比true高
while:相当于while true
代码演示:
#!/bin/sh
fun()
{
while :
do
echo "jingjing"
done
}
fun
exit 0
这个命令在控制条件未满足之前,跳出for/while/unti循环。另外还可以为break提供一个参数,表明要跳出的循环的层数,这点跟我们在c语言中的break不一样。不过一般情况下,我们不会这么做,因为它降低了程序的可读性。
代码演示:
#!/bin/sh
rm -rf fred*
echo > fred1 #创建3个文件 和一个目录
echo > fred2
mkdir fred3
echo > fred4
for file in fred*
do
if [ -d "$file" ] #如果是目录,就退出
then
break; # ;可有可无
fi
done
echo first direcyory starting fred was $file
rm -rf fred*
类似于C中的continue,使for/while/until循 环跳到下一次循环继续执行,continue也可以附带一个参数,表示希望继续执行的循环嵌套if的层数,同样,这个参数也很少用,它会降低th程序的可诗性
代码演示:
#!/bin/sh
rm -rf fred*
echo > fred1
echo > fred2
mkdir fred3
echo > fred4
for file in fred*
do
if [ -d "$file" ]
then
echo skipping the directory $file
continue
fi
done
echo first direcyory starting fred was $file
rm -rf fred*
将当前的shell替换为一一个不同的程序
exec wall"hello world"
将当前的shell替换为执行wall,exec后面的语句都不会执行了,因为当前的shell已经不复存在了
代码演示 :
#!/bin/sh
echo "lulu"
exec echo "hengheng"
echo "aa"
echo "bb"