Shell 编程疾速入门

编写一个 Shell 脚本 hello.sh

#!/bin/bash echo 'hello world!'

运行脚本 hello.sh

# 办法1 sh hello.sh  # 办法2 chmod +x hello.sh ./hello.sh#终端打印出 hello world!
Shell 变量

根本语法

定义变量:变量名=变量值,等号两侧不能有空格,变量名个别习惯用大写。
删除变量:unset 变量名 。
申明动态变量:readonly 变量名,动态变量不能unset。
应用变量:$变量名

$n :$0 代表命令自身、$1-$9 代表第1到9个参数,10以上参数用花括号,如 ${10}。
$* :命令行中所有参数,且把所有参数看成一个整体。
$@ :命令行中所有参数,且把每个参数辨别看待。
$# :所有参数个数。

实例:编写 Shell 脚本 positionPara.sh ,输入命令行输出的各个参数信息。

#!/bin/bash     # 输入各个参数 echo $0 $1 $2 echo $* echo $@ echo 参数个数=$#

运行positionPara.sh

chmod +x positionPara.sh ./positionPara.sh 10 20

运行后果

./positionPara.sh 10 20 10 20 10 20 参数个数=2

预约义变量

根本语法

$$ :以后过程的 PID 过程号。
$! :后盾运行的最初一个过程的 PID 过程号。
$? :最初一次执行的命令的返回状态,0为执行正确,非0执行失败。

实例:编写 Shell 脚本 prePara.sh ,输入命令行输出的各个参数信息。

#!/bin/bash     echo 以后的过程号=$$ # &:当前台的形式运行程序 ./hello.sh & echo 最初一个过程的过程号=$! echo 最初执行的命令后果=$?

运行后果

以后的过程号=41752 最初一个过程的过程号=41753 最初执行的命令后果=0 # hello world!

运算符

根本语法

$((运算式)) 或 $[运算式]
expr m + n 留神 expr 运算符间要有空格
expr m - n
expr *,/,% 别离代表乘,除,取余

实例:

# 第1种形式 $(()) echo $(((2+3)*4))   # 第2种形式 $[],举荐 echo $[(2+3)*4]  # 应用 expr TEMP=`expr 2 + 3` echo `expr $TEMP \* 4`

条件判断

根本语法:[ condition ] 留神condition前后要有空格。非空返回0,0为 true,否则为 false 。

实例:

#!/bin/bash if [ 'test01' = 'test' ] then     echo '等于' fi  # 20是否大于10 if [ 20 -gt 10] then     echo '大于' fi  # 是否存在文件/root/shell/a.txt if [ -e /root/shell/a.txt ] then     echo '存在' fi  if [ 'test02' = 'test02' ] && echo 'hello' || echo 'world' then     echo '条件满足,执行前面的语句' fi

运行后果

大于 hello 条件满足,执行前面的语句

if判断

根本语法

if [ 条件判断式 ];then       程序   fi# 或者(举荐)if [ 条件判断式 ]then    程序elif [ 条件判断式 ]then    程序fi

实例:编写 Shell 程序:如果输出的参数大于60,输入“及格”,否则输入“不及格”

#!/bin/bashif [ $1 -ge 60 ]then    echo 及格elif [ $1 -lt 60 ]then    echo "不及格" fi

case分支

根本语法

case $变量名 in"值1")如果变量值等于值1,则执行此处程序1;;"值2")如果变量值等于值2,则执行此处程序2;;...省略其它分支...*)如果变量值不等于以上列出的值,则执行此处程序;;esac

实例:当命令行参数为1时输入“周一”,2时输入“周二”,其余状况输入“其它”

case $1 in"1")echo 周一;;"2")echo 周二;;*)echo 其它;;esac

for 循环

根本语法

# 语法1for 变量名 in 值1 值2 值3...do    程序done# 语法2for ((初始值;循环管制条件;变量变动))do    程序done

实例:

1.打印命令行输出的参数。

#!/bin/bash  # 应用$* for i in "$*" do         echo "the arg is $i" done echo "=================="  # 应用$@ for j in "$@" do         echo "the arg is $j" done

运行后果

the arg is 1 2 3 ================== the arg is 1 the arg is 2 the arg is 3

2.输入从1加到100的值。

#!/bin/bash SUM=0  for ((i=1;i<=100;i++)) do         SUM=$[$SUM+$i] done echo $SUM

while 循环

根本语法

while [ 条件判断式 ]do    程序done 

实例:输入从1加到100的值。

#!/bin/bashSUM=0i=0while [ $i -le $1 ]do    SUM=$[$SUM+$i]    i=$[$i+1]done       echo $SUM

读取控制台输出

根本语法

read(选项)(参数)
选项

  • -p:指定读取值时的提示符
  • -t:指定读取值时期待的工夫(秒),如果没有在指定工夫内输出,就不再期待了。

参数

  • 变量名:读取值的变量名

实例:读取控制台输出一个num值。

#!/bin/bashread -p "请输出一个数num1=" NUM1echo "你输出num1的值是:$NUM1"read -t 10 -p "请在10秒内输出一个数num2=" NUM2echo "你输出num2的值是:$NUM2"

运行后果

请输出一个数num1=10你输出num1的值是:10请在10秒内输出一个数num2=20你输出num2的值是:20

函数

1.零碎函数

根本语法

basename,删掉门路最初一个 / 前的所有局部(包含/),罕用于获取文件名。
根本语法
basename [pathname] [suffx]
basename [string] [suffx]
如果指定 suffx,也会删掉pathname或string的后缀局部。

dirname,删掉门路最初一个 / 后的所有局部(包含/),罕用于获取文件门路。
根本语法
dirname pathname
如果门路中不含 / ,则返回 '.' (以后门路)。

实例:

# basename /usr/bin/sort  sort  # basename include/stdio.h  stdio.h  # basename include/stdio.h .h stdio# dirname /usr/bin/  /usr  # dirname dir1/str dir2/str dir1 dir2  # dirname stdio.h .

2.自定义函数
根本语法

[ function ] funname[()]{    Action;    [return int;]}# 调用funname 参数1 参数2...

实例:计算输出两个参数的和。

#!/bin/bashfunction getSum(){    SUM=$[$n1+$n2]    echo "sum=$SUM"}   read -p "请输出第一个参数n1:" n1read -p "请输出第二个参数n2:" n2# 调用 getSum 函数getSum $n1 $n2