乐趣区

关于shell:Shell编程快速入门

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/bash
if [$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 循环

根本语法

# 语法 1
for 变量名 in 值 1 值 2 值 3...
do
    程序
done

# 语法 2
for ((初始值; 循环管制条件; 变量变动))
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/bash
SUM=0
i=0

while [$i -le $1]
do
    SUM=$[$SUM+$i]
    i=$[$i+1]
done       
echo $SUM

读取控制台输出

根本语法

read(选项)(参数)
选项

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

参数

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

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

#!/bin/bash

read -p "请输出一个数 num1=" NUM1
echo "你输出 num1 的值是:$NUM1"

read -t 10 -p "请在 10 秒内输出一个数 num2=" NUM2
echo "你输出 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/bash

function getSum(){SUM=$[$n1+$n2]
    echo "sum=$SUM"
}   

read -p "请输出第一个参数 n1:" n1
read -p "请输出第二个参数 n2:" n2

# 调用 getSum 函数
getSum $n1 $n2
退出移动版