基本过程
- 创建shell文件
后缀为.sh - 赋予shell文件执行权限
- 执行shell文件
两种方式
./文件名
bash 文件名
创建
- 第一行为
#!/bin/bash
,换行切回命令行模式用o换行
shell变量
- shell允许用户简历变量存储数据,但不支持数据类型,将任何赋给变量的值都解释为一串字符
- shell变量赋值时
=
前后不允许有空格 ehco
用于打印$
用于取值- 命令置换时的命令用``括起来(esc下面的小点)
unset
删除变量
预定义变量 位置变量
$0
与键入的命令行一致$1~$9
为第一个到第九个命令- $10以上时为
${10}
$#
为命令行传的参数总量$*
和$@
为将所传的所有命令行参数打印$?
为上一条的命令退出状态$$
打印进程ID号
shell常用的环境变量
HOME
打印家目录PATH
每次工作的搜索路径IFS
默认为空格,tab及换行符PS1,PS2
默认提示符($)及换行提示符(>)TERM
终端类型
shell程序和语句
-
说明性语句
以#号开始到该行结束,不被解释执行 -
功能性语句
-
结构性语句
-
exit 0
用以退出
功能性语句
-
read
类似scanf,输入语句,输入多个时,以空格隔开即可#!bin/bash read year month day echo $year-$month-$day
read
同时可以兼顾打印#!bin/bash read -p "input year month day" year month day echo $year-$month-$day
-
expr
命令,算术命令,主要用于进行简单的整数运算#!bin/bash read -p "input two number " val1 val2 num=`expr $val1 + $val2` #用变量值时要加上$符号 echo $num num=`expr $val1 - $val2` echo $num #每一个算术左右两边都要有空格 num=`expr $val1 \* $val2` #shell编程中*需要前面加\进行转义,小括号也需要\( \) echo $num num=`expr $val1 / $val2` echo $num num=`expr $val1 % $val2` echo $num #expr自带输出打印功能
-
test
语句,测试语句,通过$?
来判断上一天是否执行#!/bin/bash #对于字符串的应用 test "hello" = "hello" echo $? #0为真 test "hello" = "hell" echo $? #返回1,假 test "hello" != "hell" echo $? #返回0,真 test -z "hello" echo $? #-z判断字符串是否长度为0,故返回1 test -n "hello" echo $? #-n判断字符串是否长度不为0,故返回0
#对于整数的应用 a -eq b #测试a与b是否相等 a -ne b #测试a与b是否不相等 a -gt b #测试a是否大于b a -ge b #测试a是否大于等于b a -lt b #测试a是否小于b a -le b #测试a是否小于等于b
#文件测试 -d name #测试name是否为一个目录 -e name #测试一个文件是否存在 -f name #测试name是否为普通文件 -L name #测试name是否为符号链接 -r name #测试name文件是否存在且为可读 -w name #测试name文件是否存在且为可写 -x name #测试name文件是否存在且为可执行 -s name #测试name文件是否存在且长度不为0 f1 -nt f2 #测试文件f1是否比f2更新 f1 -ot f2 #测试文件f1是否比f2更旧
结构型语句
主要包括条件测试语句,多路分支,循环语句,循环控制语句
-
条件语句
if 表达式 then 命令表 elif 表达式 then 命令表 else 命令表 fi
类比
if(){ ... } else if(){ ... } else{ ... }
if test -f $filename then ...... #test可以替换成[],[]的前后需要加空格 elif [ -f $filename ] then ..... else 命令表 fi
多路分支语句
-
case...esac
case 字符串变量 in #case只能检测字符串变量 模式1) #各模式中可用文件名元字符,以右括号结束 命令表 ;; 模式2|模式3) #一次可匹配多个模式,以'|'隔开 命令表2 #命令表以单独的双分号行结束,退出case语句 ;; ...... 模式n) #模式n常写为字符*表示其他所有模式 命令表n ;; #最后一个双分号行可以省略 esac
循环语句for
for 变量名 in 单词表
do
命令表
done
-
例:
#!/bin/bash #for val in 1 2 3 4 5 for ((val=1; val <= 5; val = $val + 1)) do echo "val = $val" done #打印1-5 for file in `ls` do echo "---$file" done #打印当前目录下所有文件
循环语句while
while 命令或表达式 #为真时执行命令表,c语言写法时要用两个小括号(())同for
do
命令表
done #退出状态为命令表中被执行的最后一条命令的退出状态
-
例
#!/bin/bash NUM=0 #while [ $NUM -lt 10] while (($NUM < 10)) do echo "*******$NUM" NUM=`expr $NUM + 1` done
循环控制语句
#!/bin/bash
NUM=0
#while [ $NUM -lt 10]
while (($NUM < 10))
do
if [ $NUM -eq 3 ]
then
break
#continue
fi
echo "*******$NUM"
NUM=`expr $NUM + 1`
done
shell函数
类似c,把所有的外围看做main即可
例
#!/bin/bash
fun()
{
echo "i am a function"
}
fun
-
传参 直接放在函数后面即可,函数内用
$1
等读取#!/bin/bash fun() { A=$1 B=$2 C=$3 echo "A = $A B = $B C = $C" } fun 1 2 3
-
shell中的函数也存在返回值,可以用
$?
进行打印#!/bin/bash fun() { A=$1 B=$2 C=$3 NUM=`expr $A + $B + $C` return $NUM } fun 1 2 3 echo "\$? = $?"
-
shell函数中变量的作用域和c不同,shell的作用域为全局,将其变为局部变量可在变量前加
local
#!/bin/bash fun() { local A=$1 B=$2 C=$3 } fun 1 2 3 echo "A = $A" echo "B = $B" echo "C = $C"