例子
使用vim命令创建一个sh文件并编辑
vim demo.sh
在输入框中输入测试代码
#!/bin/bash
# shell测试
echo "hello world"
可以看到,第一个#表示引入bin/bash,后面的#表示注释
按ESC后,输入:wq,退出并保存文件
执行文件:./demo.sh
-bash: ./demo.sh: 权限不够
修改权限:chmod 777 demo.sh
再次执行文件:./demo.sh
hello world
也可以通过这个执行sh文件:/bin/bash demo.sh
这种执行方式不需要权限
变量
形式 | 说明 |
---|---|
$0 | 当前程序名称 |
$n | 程序输入参数,2第二个参数 |
$* | 所有的输入参数 |
$# | 输入参数的个数 |
$? | 命令执行的状态。0表示成功 |
#!/bin/bash
# shell测试
echo "hello world"
A=10
echo $A
echo "###############"
echo $0
echo $1
echo $2
echo $3
执行结果:
hello world
10
###############
./demo.sh
可以看到使用变量就是$符号加行变量名
如果执行: ./demo.sh 第一个参数 第二个参数 第三个参数
hello world
10
###############
./demo.sh
第一个参数
第二个参数
第三个参数
接着测试
#!/bin/bash
# shell测试
echo "hello world"
A=10
echo $A
echo "###############"
echo $0
echo $1
echo $2
echo $3
echo "变量 \$* 是:$*"
echo "变量 \$# 是:$#"
echo "变量 \$? 是:$?"
执行: ./demo.sh 第一个参数 第二个参数
hello world
10
###############
./demo.sh
第一个参数
第二个参数
变量 $* 是:第一个参数 第二个参数
变量 $# 是:2
变量 $? 是:0
注意
$?表示的是上一次命令是否成功
定义变量时不能有空格,比如A=10改为A = 10,就是错误的
形式 | 说明 |
---|---|
${var} | 变量本来的值 |
${var:-word} | 如果变量var为空或已被删除(unset),那么返回word,但不改变var的值。 |
${var:=word} | 如果变量var为空或已被删除(unset),那么返回word,并将var的值设置为word。 |
${var:?message} | 如果变量var为空或已被删除(unset),那么将消息message送到标准错误输出,可以用来检测变量var是否可以被正常赋值。若此替换出现在shell脚本中,那脚本将停止运行。 |
${var:+word} | 如果变量var被定义,那么返回word,但不改变var的值。 |
循环语句for
#! /bin/bash
for i in `seq 1 15`
do
echo "值是 $i"
done
上面的语句中:seq 1 15
是产生一个1到15的数字集合
执行结果为
值是 1
值是 2
值是 3
值是 4
值是 5
值是 6
值是 7
值是 8
值是 9
值是 10
值是 11
值是 12
值是 13
值是 14
值是 15
求和
#! /bin/bash
j=0
for((i=0; i< 15; i++))
do
j=`expr $i + $j`
done
echo $j
执行结果:105
注意expr $i + $j
,加号之间一定要有空格
如果 是expr $i+$j
,那么执行后的结果:14+13+12+11+10+9+8+7+6+5+4+3+2+1+0+0
压缩指定文件
#! /bin/bash
for i in `find /root -name "*.sh"`
do
tar -czf sh.tgz $i
done
循环语句while
#! /bin/bash
i=0
while((i<10))
do
echo $i
i=`expr $i + 1`
done
执行结果
0
1
2
3
4
5
6
7
8
9
shell读文件
#! /bin/bash
while read line
do
echo $line
done<./test.txt
if语句
#! /bin/bash
num1=100
num2=200
if(($num1>$num2));then
echo "num1>num2"
else
echo "num1<num2"
fi
注意:if语句没有{},只需要分号
语句一定要有Tab键输入
逻辑运算符 | 说明 | |
---|---|---|
-f | 判断文件是否存在 | |
-d | 判断目录是否存在 | |
-eg | 等于(整形比较) | |
-ne | 不等于 != | |
-le | 小于 < | |
-ge | 大于或等于 >= | |
-a | 双方都成立 && | |
-o | 单方成立 |
例子
#! /bin/bash
TESTDIR=./test
if [ ! -d $TESTDIR ];then
mkdir -p $TESTDIR
else
echo "目录存在"
fi
如果test不存在,则创建,否则打印目录存在
注意:
if和[之间要有空格,否则会报语法错误
mkdir -p,相当于android中的mkdirs
算数运算符
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | `expr $a + $b` |
- | 减法 | `expr $a - $b` |
* | 乘法 | `expr $a * $b` |
/ | 除法 | `expr $a / $b` |
% | 取余 | `expr $a % $b` |
= | 赋值 | a=$b |
== | 相等 | [ b ] |
!= | 不相等 | [ b ] |
算数运算的方式
使用 $(( ))
r=$(( 4 + 5 ))
使用 $[ ]
r=$[ 4 + 5 ]
使用let命令
n=10
let n=n+1
使用 expr 外部程式(推荐)
r=`expr 4 + 5 `
关系运算符
运算符 | 说明 | 举例 |
---|---|---|
-eq | 相等 | [ $a -eq $b ] |
-ne | 不相等 | [ $a -ne $b ] |
-gt | 大于 | [ $a -gt $b ] |
-lt | 小于 | [ $a -lt $b ] |
-ge | 大于等于 | [ $a -ge $b ] |
-le | 小于等于 | [ $a -le $b ] |
字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 字符串是否相等 | [ $a = $b ] |
!= | 字符串是否不相等 | [ $a != $b ] |
-z | 字符串长度是否为0 | [ -z $a ] |
-n | 字符串长度是否不为0 | [ -n "$a"] |
$ | 字符串是否为空 | [ $a ] |
重定向
< 输入重定向
cat 0< test.txt
注意:< 后面一定要有空格,代表后面是个文件
> 输出重定向
echo hello > file
把hello输出到file文件中
函数
#! /bin/bash
function test(){
echo "这是一个函数"
cc="函数里的变量"
echo $cc
echo $1
echo $3
}
test 11 33 55
这是一个函数
函数里的变量
11
55
计算阶乘
#! /bin/bash
a=1
factorial(){
for((i=1;i<$1;i++))
do
a=$[$a * $i]
done
echo "$1 的阶乘是 $a "
}
factorial $1
输入: ./function.sh 6
输出:6 的阶乘是 120
注意:
factorial $1的这个$1是执行命令时传递进去的,比如上面的./function.sh 6的这个6.
factorial函数内的$i是传递进函数的参数,是通过函数调用传进去的
上面的函数也可以这么写
factorial(){
for i in `seq $1`
do
let a*=$i
done
echo "$1 的阶乘是 $a "
}
函数返回值
funreturn(){
read -p "请输入数值" num
return $[2*num]
}
funreturn
echo "funreturn value: $?"
请输入数值100
funreturn value: 200
请输入数值300
funreturn value: 88
我们可以看到,第二次输入的数值答案是错的,是因为$?一般用来表示函数的执行状态,并且它的范围0~255,当超过这个数值时,会返回一个错误的值
return 这个关键字,仅仅是表示把结果保存起来,并不是返回的意思。在return后面继续添加语句,一样会继续执行
那么如何取得大于255的返回值呢,我们可以使用echo
funreturn(){
read -p "请输入数值" num
return $[2*num]
echo $[2*$num]
}
result=`funreturn`
echo "funreturn value: $?"
echo "funreturn value: $result"
请输入数值600
funreturn value: 0
funreturn value: 1200
可以看到,答案是对的,并且 return并没有终止函数
网友评论