shell编程自学(一)

it2026-03-18  4

shell编程就是对一堆Linux命令的逻辑化处理。

1.第一个shell程序

#!/bin/bash #第一个shell小程序 echo hello world!

第一行表示我们选择使用bash shell。shell中#符号表示注释。shell的第一行比较特殊,一般都会以#!开始来指定使用的shell类型。在linux中,除了bash shell以外,还有很多版本的shell, 例如zsh、dash等等…不过bash shell还是我们使用最多的。 第二行以#符号开始,表示本行是注释,运行的时候是不会运行本行的。在这我就不写了。 第三行中的echo是linux中的输出命令,该行的意思很明显的就是输出hello world!

2.运行第一个shell程序 touch 新创建一个文件(hello_world.sh), 然后将以上代码复制到此文件中,然后需要赋予此文件的可执行权限。 执行 ./hello_world.sh 如果直接执行hello_world.sh,这时会默认从$PATH环境变量中去寻找,这时,由于我们为将此文件配置在环境变量中,因此会找不到。所以,我们用了"."这个符号,表示从当前目录找。 除了以上执行方法,我们还可以直接指定shell来运行 /bin/sh hello_world.sh 这儿我们指定用了/bin/sh来执行,这时hello_world.sh中指定的/bin/bash将不会生效。

3.变量 shell编程中分为两种变量,第一种是我们自己定义的变量(自定义变量),第二种是Linux已定义的环境变量(环境变量, 例如:$PATH, $HOME 等…, 这类变量我们可以直接使用)。

#!/bin/bash #使用环境变量 echo $PATH #自定义变量hello hello="hello world" echo $hello

以上演示了自定义变量和系统环境变量的用法,使用很简单,就是使用 符 号 加 上 变 量 名 就 行 了 。 记 住 : 定 义 变 量 不 用 符号加上变量名就行了。记住:定义变量不用 符号,使用变量要加$就行了。 在第5行中,我们在自定义变量时,使用了双引号,在shell编程中, 如果变量出现空格或者引号,那么也必须加引号, 否则就可以省略。 还有一点需要注意,定义变量的时候,“=”左右不可以有空格。

4.将linux命令执行结果赋值给变量

#!/bin/bash path=$(pwd) files=`ls -al` echo path: $path echo files: $files

以上2行和第3行分别演示了两种方式来将Linux命令执行结果保存到变量。 第2行将pwd执行结果(当前所在目录)赋值给path变量。 第3行将ls -al命令执行结果(列出当前目录下所有的文件及文件夹)赋值给变量 第三行的符号不是单引号,是键盘上“~”这个按键 shell运算 主要分为整型和浮点型的运算。整型又有两种实现方式,浮点型是通过使用bash内置的计算器(bc)来实现的。

5.整型运算 在shell中,有两种方式能实现整数运算,一种是使用expr命令, 另外一种是通过方括号($[])来实现。

#!/bin/bash #输出13 expr 10 + 3 #输出10+3 expr 10+3 #输出7 expr 10 - 3 #输出30 expr 10 \* 3 #输出3 expr 10 / 3 #输出1 expr 10 % 3 #将计算结果赋值给变量 num1=$(expr 10 % 3) #将计算结果赋值给变量 num2=`expr 10 % 3`

在以上的乘法(*)中,我们用了反斜线(\)来转义,不然会报错。 运算符前后必须还有空格,否则会被直接当作字符串返回。 如果要将计算结果保存到变量,就需要用 $() 或者 `来替换命令,或者用方括号 $[]

#!/bin/bash num1=10 num2=3 #输出num1 + num2=13 echo "num1 + num2=$[$num1 + $num2]" #输出num1+num2=13 echo "num1+num2=$[$num1+$num2]" #输出num1 - num2=7 echo "num1 - num2=$[$num1 - $num2]" #输出num1 * num2=30 echo "num1 * num2=$[$num1 * $num2]" #输出num1 > num2=1 echo "num1 > num2=$[$num1 > $num2]" #输出num1 < num2=0 echo "num1 < num2=$[$num1 < $num2]" #将运算结果赋值给变量,输出num3=3 num3=$[$num1 / $num2] echo "num3=$num3"

6.浮点运算

在shell中,做浮点运算一般是用bash的计算器(bc)。在shell脚本中,一般我们的使用方法是: variable=$(echo “options; expression” | bc)

options是bc的一些选项,例如: 可以通过scale去设置保留的小数位数。具体有哪些参数,可以man bc进行查看 expression就是我们具体的表达式,例如 10 * 3 " | " 叫做管道,一头接入前一个命令的返回结果, 一头接入下一个命令。表示将前一个命令的执行结果作为后一个命令的参数输入。以上,表示将我们的表达式作为bc的参数输入。

#!/bin/bash #表示 10/3, 保留2位小数,将结果赋值给了num, 输出3.33 num=$(echo "scale=2; 10 / 3" | bc) echo $num

scale=2,表示小数点后取2位,如果不加scale,默认为0,不要小数点

提示找不到bc 就安装一下 apt-get install bc 或者#sudo apt install bc

shell的结构化命令 也就是我们其它编程语言中的条件选择语句及循环语句。 条件选择 if then 语句

if command then commands fi

在shell脚本的 if 是根据紧跟后面的那个命令的退出状态码来判断是否执行then后面的语句的。

退出状态码: 正常退出(命令执行正常)的状态码是0 非正常退出的状态码不是0

以上语句的语义为: 如果if后面的命令执行正常(状态码0),那么就执行then后面的语句。否则不执行。 fi 代表 if 语句的结束。

#!/bin/bash #这儿由于pwd是linux内置的命令,因此执行后会正常退出(状态码0),所以会执行then中的语句 #如果此处替换为一个不存在的命令(例如: pw),那么就会非正常退出,不会执行then中的语句 if pwd then echo 执行then里面的语句 fi

if then 还可以简写为

if command; then commands fi

因此,以上代码还可以写为:

#!/bin/bash if pwd;then echo 执行then里面的语句 fi

如果我要判断处理异常退出(状态码非0)情况,用else,与if-then语句相比,这回多了个else语句,else语句用来判断if后面的命令非正常退出的情况

if command1 then commands elif command2 then command3 fi

但是上面就只能根据退出状态码判断,不能写表达式。

最新回复(0)