鸟书shell学习(三)shell脚本程序设计要点总结


一 注意事项

1.脚本的开头一行为 :

#!/bin/bash
声明这个脚本需要的shell的名称
2.程序中出了"#!"之外的其他以#开头的都是注释内容
3.为了方面的使用系统命令,可以在程序的开始部分设置主要环境变量例如PATH
4.脚本程序的运行方法: sh example.sh 或者类似 bash example.shchmod +x example.sh ; ./example.sh ################################ 这两种执行方式都是在新建的子进程中完成的
source example.sh 或者 . example.sh 则是在父进程中直接执行命令的

二 简单脚本

2.1 交互式脚本,处理简单的输入输出

首先是读取用户输入的read命令,输出的命令就是echo ,例如:
read -p 'please input your first name: ' firstname
echo 'your first name is : $firstname'
shell中变量是没有申明比较随意不需要指定类型,在引用的时候, $变量名 或者是 ${变量名}
除了这种方式之外就是通过执行脚本时的参数的传递,在shell中参数名是内置的$0,$1,$2,$4...
这里$0表示文件名,$1开始表示第一个参数,其他依次类推. 初次之外还有其他特殊的参数名,如下:
$# : 表示参数个数
$@:代表"$1","$2" ... 之意$*:代表"$1 $2 $3 ..." 之意
eg:
#!/bin/bash
echo 'filename:'$0
echo 'args size: '$#
echo 'first arg:'$1

2.2 数值运算

shell只能够支持整数的基本运算:+ - * / %
1).declare - i var 可以将变量声明为整数,然后对变量进行运算,变量运算是这样的:$((计算式)) eg:
declare -i v1
declare -i v2
v3=$(($v1 + $v2))
#也可以这样计算:
declare -i v3=$v1*$v2 #表达式之间不能有空格
2).var=$((运算内容)) //运算内容中间是允许有空格的 eg:
echo $ (( 19 + 78))

2.3 shell中的判断式

shell中可以用test命令进行判断,eg:

test -e ./example.sh #测试文件是否存在
常见测试类型和参数如下:截图来自鸟哥的Linux私房菜

 

除了可以用test命令进行条件判断之外i,还可以用[] (中括号的语法进行判断,判断测试参数和test一样).
[]语法要求[]内的所有量之间均有空格,eg:

[b"$name"b==b"xiaoyi"b] #b都表示空格

 

\

\

三 复杂脚本

3.1 条件语句

if else 的标准格式:
if [ 条件判断1 ] ; then
   command1
elif [ 条件判断2 ] ; then
   command2
else 
   command3
fi
其中,条件可以用&&或者||进行连接
case...esac的标准格式如下:
case $variableName in 
"第一个变量内容")
    程序段
    ;;   #每个类型的结尾类似break
"第二个变量内容")
    程序段
    ;;   
*)# 类似default 用* 代替
    其他不符合条件的程序段
    ;;
esac 

3.2 循环语句

循环的几种格式如下:
while do done
while [ condition ]
do 
   程序段
done
until do done
until [ condition ]
do 
  程序段
done
for...do...done
for var in cond1 cond2 cond3 ...
do 
  程序段
done

for ((初始值;限制值;执行步长))
do 
  程序段
done

3.3 函数

function fname(){
    程序段
}

examples:
#!/bin/bash
# if --- else -- exmaple
declare -i v1=10
declare -i v2=15

if [ $v1 -ge $v2 ] ; then
echo ''$v1' is bigger than '$v2''
else 
echo ''$v1' is smaller than '$v2''
fi

# case ... esac example
read -p 'Please input your name : ' name
case $name in
"xiaoyi")
	echo 'hello xiaoyi'
	;;
"xiaoyi1")
	echo 'hello xiaoyi1'
	;;
*)
	echo 'no case matched!'
	;;
esac

# loop example
declare lv=1 
while [ $lv -le 10 ]
do
	echo $lv
	lv=$((${lv}+1))
done

until [ $lv -le 1 ]
do
	echo $lv
	lv=$((${lv}-1))
done

for c in 'c1' 'c2' 'c3'
do
	echo $c
done

for ((i=0;i<10;i=i+1))
do
	echo $i
done

 function printHello(){
	echo 'hello'
}

printHello 




 


 

相关内容