美文网首页
编译原理与语法(四)——shell语法

编译原理与语法(四)——shell语法

作者: 王志强_9380 | 来源:发表于2019-10-10 17:09 被阅读0次

例子

使用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 程序输入参数,1第一个参数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
== 相等 [ a ==b ]
!= 不相等 [ a !=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并没有终止函数

相关文章

网友评论

      本文标题:编译原理与语法(四)——shell语法

      本文链接:https://www.haomeiwen.com/subject/uvswpctx.html