Shell 编程

写在前边

这里讲的Shell是Linux Shell,基本的Linux shell命令请见Linux命令行基础

为了方便学习,教程中把执行代码后打印在屏幕上的信息,附在代码后边,前边加上两个#号及两个空格。练习时不用输入#号及其后边的内容。比如:

echo "欢迎一起学习Shell!"
##  欢迎一起学习Shell!

这里欢迎一起学习Shell!就是echo “欢迎一起学习Shell!”这条命令执行后打印到屏幕上的信息。 如下:

在$后边输入命令,出现$表示可以输入新的命令了。

变量赋值与取用

变量名称只能有字母、数字、下划线组成,不能以数字开头,区分大小写。变量名前加$启用变量,必要时用{}限定变量名,比如

v_1="W h"
v=Lab
echo $v_1
##  W h
echo $v+Name
##  Lab+Name
echo ${v}_Name
##  Lab_Name
echo $v_Name
##  
echo $v_1_Name
##  
echo ${v_1}_Name
##  W h_Name

将W h字符串赋值给叫v_1的变量,等号两边不能有空格。左边没有引号。右边字符串中无空格时,引号可以省略。$符号接变量名就能调出值。变量名由字符、数字和下划线组成,不能以数字开头。$后边截止到允许的字符为止,所有字符会被当做一个变量名,会混淆的时候使用花括号限定变量名的范围。比如${v}_Name就是取出变量v和字符串_Name连起来, 而$v_Name是取出叫v_Name的变量,如上例子中未加定义,所以echo $v_Name得到一个空行。

比如可以把需要反复使用的一长串字符串赋值给一个变量,以后调用就会很方便。将命令赋值给一个变量,然后直接执行。

Wh=/home/wanghong
ls $Wh
 
goWh="cd $Whome"
$goWh

使用readonly定义设置只读变量,这样的变量不能被重新赋值,重新赋值就会提示“只读变量”

readonly Wh=/home/wanghong
echo $Wh
##  /home/wanghong
Wh=qita
##  bash: Wh: readonly variable

算式运算

使用双小括号$((算式))来执行算式,得到值。可以把计算结果赋给变量,也可以直接用计算结果。

X=$((1+5))     
echo $X
##  6
echo $((1+5))
##  6

shell只能进行整数的运算。要进行浮点数计算,可以使用awk

awk 'BEGIN{print 1/3}'
##  0.333333

算术运算

可以进行加(+)减(-)乘(*)除(/),以及指数运算(**)、取模(%)。

echo $((10%3))
##  1
echo $((10**3))
##  1000
echo $((10/3))
##  3
echo $((10 - 3))
##  7
echo $((10 * 3))
##  30

x++表示在用x的值之后x的值+1,++x表示先+1之后再用x的值。如果一开始没有给xx赋过值,那x++中的x就从0开始:

echo $x
##  
echo $((x++))
##  0
echo $x
##  1
echo $((x++))
##  1
echo $x
##  2
echo $x
##  2
echo $((x++))
##  2
echo $((x++))
##  3
echo $((x++))
##  4
echo $x
##  5
echo $x
##  5
echo $((++x))
##  6
echo $((++x))
##  7
echo $((++x))
##  8
echo $((++x))
##  9

以上的例子一开始没有定义x,因此第一个echo得到空行,然后x++就自动给x一个值,那就0。然后执行完echo $((x++)) 上一步之后,x已经被加上了1。

x--的作用则是每次减去1

echo $((x--))
echo $((x--))
echo $x

布尔运算

在shell里,0表示false,1或者非零值表示true,

echo $((10 >= 9))   #比较, >=, >, <, <=, ==, !=,  这个返回的值是布尔值,1和0,非零值都是1

echo $((10 &&  3))   #逻辑运算, AND, 逻辑值分为0和非零
echo $((10 &&  -3))  #
echo $((10 &&  0))  
echo $((10 ||  3))   #逻辑运算, OR
echo $((10 || -3))
echo $((10 ||  0)) 

字符操作

字符拼接

字符串连接只需要连续写就可以了

A=张
B=三
echo $A$B
##  张三
echo $A $B
##  张 三
echo $A三
##  张三
echo $AB
##  
echo $A"B"
##  张B
echo ${A}B
##  张B

字符替换

将变量中的首个旧字符串替换成新字符串的语法为${变量/旧字符串/新字符串}
将变量中的所有旧字符串替换新字符串的语法为${变量//旧字符串/新字符串}

X="他叫张三,张三的张,张三的三。"
echo $X
##  他叫张三,张三的张,张三的三。
echo ${X/的/之}
##  他叫张三,张三之张,张三的三。
echo ${X//的/之}
##  他叫张三,张三之张,张三之三。

程序控制

test命令

test用来检查文件类型以及比较数值。语法:test condition && ture执行的操作 || false时执行的操作

test 5 -eq 5  && echo Yes || echo No   # -eq 判断是否等于,也可以用 ==
test 5  == 15 && echo Yes || echo No  
test 5 -ne 10 && echo Yes || echo No   # -ne 判断是否不等于,也可以用 !=
 
test -f test.txt  && echo "Exist"  || touch test.txt  # 判断这个文件是否存着,不存在就建一个
test -f test.txt  && echo "Exist"  || touch test.txt  # 已经存在了,就 echo Exist

用 man test查看更多的选项。这里也可以使用单中括号代替test,比如:

[ -f test.txt ] && echo "Exist"  || touch test.txt 

if结构

8-)语法1(if…then…fi):

if condition
then 
    commands  # 多条命令就用多行,或者分号;隔开
fi

这里的;也可以是换行。

A=1; B=1
if [ $A == $B ]; then echo A; echo B;  fi  # 注意方括号和if之间以及和里边的公式之间,都需要有个空格,不然又得时候会报错。

一般在脚本中这样写,更加清晰明了,一般在编程的时候都是需要换行,做好缩进和对齐,以便阅读。

A=1
B=1
if [ $A == $B ]
then 
    echo A
    echo B
fi

单方括号也可以用test的形式。

8-)语法2(if…then…else…fi):

if condition
then 
    Tcommands  #condition为true的时候执行Tcommands,多条命令就用多行,或者分号;隔开
else 
    Fcommands  #多条命令就用多行,或者分号;隔开
fi

,可以是多个,用;隔开或者换行。否则执行Fcommands。

8-)语法3(if…then…elif…then…else…fi):

if conditionA 
then 
    Acommands 
elif conditionB  # 此行开始往下三行就属于这一个elif,可以有多个elif,比如这里有两个elif,
then 
    Bcommands 
elif conditionC  #通过多个elif判断多个条件
then 
    Ccommands 
else 
    Fcommands 
fi

for循环

语法:

for var in item1 item2 ... itemN
do
    commands  # 多条命令就用多行,或者分号;隔开
done

比如,这里我们可以和上边的if一起,编个一段小程序

for i in {1..10}   #这里用单花括号,表示1数到10。
do
    if [ $i -lt 3 ]
    then
        echo i=$i" i < 3"
    elif [ $i -gt 8 ]
    then
        echo i=$i" i > 8"
    elif [ $i -gt 5 ]
    then
        echo i=$i" i > 5 and i <= 8"
    else
        echo i=$i" i >= 3 and i <=5"
    fi
done

while循环

语法:

 while [ condition ]
    do
    	commands   # 多个commands的时候每个conmmand一行
    done

可以改写一下上边的for循环

i=1
while [ $i -le 10 ]
do
    if [ $i -lt 3 ]
    then
        echo i=$i" i < 3"
    elif [ $i -gt 8 ]
    then
        echo i=$i" i > 8"
    elif [ $i -gt 5 ]
    then
        echo i=$i" i > 5 and i <= 8"
    else
        echo i=$i" i >= 3 and i <=5"
    fi
    ((i++))                 # 每次执行完了之后给i+1,这里复习一下上边提到过的双小括号的用法
done

Shell脚本

参数传递


本网页已被访问8996次;最后编辑时间: 2024/11/02 21:06