Shell与Bash

shell是运行在终端中的文本互动程序,bash(GNU Bourne-Again Shell)是最常用的一种shell。是当前大多数Linux发行版的默认Shell。

Shell相当于是一个翻译,把我们在计算机上的操作或我们的命令,翻译为计算机可识别的二进制命令,传递给内核,以便调用计算机硬件执行相关的操作;同时,计算机执行完命令后,再通过Shell翻译成自然语言,呈现在我们面前。
其他的shell还有:sh、bash、ksh、rsh、csh等。Ubuntu系统常用的是bash,Bio-linux系统是基于ubuntu定制的,但是却使用了zsh
sh的全名是Bourne Shell。名字中的玻恩就是这个Shell的作者
而bash的全名是Bourne Again Shell。最开始在Unix系统中流行的是sh,而bash作为sh的改进版本,提供了更加丰富的功能。一般来说,都推荐使用bash作为默认的Shell。

可以用如下命令查看本机shell

echo $SHELL

例程1 展示命令的参数

文件名positionPara.sh

#!/bin/bash     
# 输出各个参数 
echo $0 $1 $2 
echo $* 
echo $@ 
echo 参数个数=$#

说明

  • #!表示指定解释器
  • 文件名中.sh不是必须的
  • 运行文件可以直接用sh positionPara.sh执行,也可以下面的指令运行

运行

chmod +x positionPara.sh 
./positionPara.sh 10 20

结果

/positionPara.sh 10 20 
10 20 
10 20 
参数个数=2

解释:

  • $n :$0 代表命令本身、$1-$9 代表第1到9个参数,10以上参数用花括号,如 ${10}。
  • $* :命令行中所有参数,且把所有参数看成一个整体。
  • $@ :命令行中所有参数,且把每个参数区分对待。
  • $# :所有参数个数。
  • chmod +x 表示为该文件增加可执行权限

例程2 运算表达式

  • $((运算式)) 或 $[运算式]
  • expr m + n 注意 expr 运算符间要有空格
  • expr m - n
  • expr \*,/,% 分别代表乘,除,取余
  • 注意expr表达式的运算符与数字之间必须有空格

Shell 变量
定义
Shell 变量分为系统变量和自定义变量。系统变量有 H O M E 、 HOME、 HOMEPWD、$USER等,显示当前 Shell 中所有变量:set 。
变量名可以由字母、数字、下划线组成,不能以数字开头。

基本语法
定义变量:变量名=变量值,等号两侧不能有空格,变量名一般习惯用大写。
删除变量:unset 变量名 。
声明静态变量:readonly 变量名,静态变量不能unset。

# 使用变量:$变量
echo $(((2+3)*4))   

# 第2种方式 $[],推荐 
echo $[(2+3)*4]  

# 使用 expr 
TEMP=`expr 2 + 3` 
echo `expr $TEMP \* 4`

例程3 [ condition ] 语句

[ condition ] 注意condition前后要有空格。非空返回0,0为 true,否则为 false 。

if [ 'test01' = 'test' ] 
then
     echo '等于' 
fi  

# 20是否大于10 
if [ 20 -gt 10] 
then
     echo '大于' 
fi  

# 是否存在文件/root/shell/a.txt 
if [ -e /root/shell/a.txt ] 
then
     echo '存在' 
fi  

if [ 'test02' = 'test02' ] && echo 'hello' || echo 'world' 
then
     echo '条件满足,执行后面的语句' 
fi

其中fi其实就是if反过来写23333

结果

大于 
hello 
条件满足,执行后面的语句

例程4 for循环

语法

# 语法1
for 变量名 in 值1 值2 值3...
do
    程序
done

# 语法2
for ((初始值;循环控制条件;变量变化))
do
    程序
done

实例1 : 打印命令行参数

#!/bin/bash  

# 使用$* 
for i in "$*" 
do     
    echo "the arg is $i" 
done 
echo "=================="  

# 使用$@ 
for j in "$@" 
do     
    echo "the arg is $j" 
done

输出

the arg is 1 2 3 
================== 
the arg is 1 
the arg is 2 
the arg is 3

从此例中也可以看出$*$@的区别

实例2 : 输出从1到100的和

#!/bin/bash 
SUM=0  
for ((i=1;i<=100;i++)) 
do     
    SUM=$[$SUM+$i] 
done 

echo $SUM

参考