Linux Bash基本语法

发布于 / Linux / Comments Off on Linux Bash基本语法

1 标准输入、输出与标准错误输出

系统为这三个文件分配了文件标识符fd(file descripter),在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。它们的文件标识符,分别为0,1,2,关系如下表:

文件描述符 名称 通用缩写 默认值
0 标准输入 stdin 键盘
1 标准输出 stdout 屏幕
2 标准错误 stderr 屏幕

1.1 输出重定向 

语法

说明

>

把标准输出重定向到一个新文件,”>” 会覆盖原有的内容。

>>

把标准输出重定向到一个文件中,不覆盖原有的内容(追加)。

2 >

把标准错误重定向到一个文件中

2 >>

把标准错误重定向到一个文件中(追加)

2 > &1

把标准输出和错误重定向到一个文件(追加)

1.2 输入重定向

语法 说明
< filename文件作为标准输入
<< delimiter 从标准输入中读入,知道遇到delimiter分界符

1.3 绑定重定向

语法 说明
> &m 把标准输出重定向到文件描述符m中
< &- 关闭标准输入
> &- 关闭标准输出

2 变量

2.1 环境变量

通过使用printenv可以显示当前的环境变量

printenv
#显示所有环境变量

2.2 本地变量

Shell不需要明确定义类型,事实上Shell变量的值都是字符串,比如我们定义var=45,其实var的值是字符串而非整数,shell变量不需要事先定义就可以使用,如果使用没有定义的变量,这字符串取值为空字符串。

变量名称=”变量Value”,“=”的两边不能有空格,否则shell解释成名称和命令参数。

获取变量使用 $变量名称

str="Hello_World"
echo $str
#输出结果:Hello_World

2.2.1 文件名代换

可以使用*、?、[]对文件名代换

匹配符 说明
* 匹配0个多个任意字符
? 匹配一个任意字符
[] 匹配方括号中任意一个字符的一次出现

2.2.2 命令代换

将命令替换为命令输出,所有的shell支持使用反引号的方式进行命令替换,命令替换可以嵌套,需要注意的是如果使用反引号的形式,在内部反引用前必须使用反斜杠转移

匹配符 说明
`` 例如 echo ${pwd}
$() 例如 echo `pwd`

2.2.3 算术代换

匹配符 说明
$(()) 例如 echo $((4 + 6))

3 符号

3.1 转义字符

‘\’用作转义字符。

3.2 单引号

单引号内的所有字符都保持它本身字符的意思,而不会被bash进行解释。

3.3 双引号

除了$、``、/外,双引号内所有的字符保持字符本身的含义。

4 逻辑判断

4.1 if

在shell中用if,then,elif,else,fi这几条命令实现分支控制,这种流程控制语句本质上也是由若干个逻辑判断组成,需要注意的是。

  • if/then结束都离不开fi

  • if和[]注意用空格隔开,]后面紧跟;

  • []内的条件与都有一个空格隔开

例如:

if [ -f $a ];then 
        echo "hello world!" 
fi

这里面-f是运算符,相应的运算符还有

# 表达式运算符
!   # 表达式为假
-a  # 逻辑与 表达式1 –a 表达式2 两个表达式都为真则是真
-o  # 逻辑或 表达式1 –o 表达式2 两个表达式有一个为真则是真
# 字符串运算符
-n    # 字符串的长度为非零
-z    # 字符串的长度为零
=     # 字符串相等
!=    # 字符串不等
# 整数比较运算符
-eq   # int1 -eq int2 如果 int1 等于 int2,则为真
-ge   # int1 -ge int2 如果 int1 大于或等于 int2,则为真
-gt   # int1 -gt int2 如果 int1 大于 int2,则为真
-le   # int1 -le int2 如果 int1 小于或等于 int2,则为真
-lt   # int1 -lt int2 如果 int1 小于 int2,则为真
-ne   # int1 -ne int2 如果 int1 不等于 int2,则为真
# 文件运算符
-ef   # File1 –ef File2 两个文件具有同样的设备号和i结点号
-nt   # File1 –nt File2 文件1比文件2新
-ot   # File1 –ot File2 文件1比文件2旧
–b    # 文件存在并且是块设备文件
–c    # 文件存在并且是字符设备文件
–d    # 文件存在并且是目录
–e    # 文件存在
–f    # 文件存在并且是正规文件
–g    # 文件存在并且是设置了组ID
–G    # 文件存在并且属于有效组ID
–h    # 文件存在并且是一个符号链接(同-L)
–k    # 文件存在并且设置了sticky位
–b    # 文件存在并且是块设备文件
–L    # 文件存在并且是一个符号链接(同-h)
–o    # 文件存在并且属于有效用户ID
–p    # 文件存在并且是一个命名管道
–r    # 文件存在并且可读
–s    # 文件存在并且是一个套接字
–t    # FD 文件描述符是在一个终端打开的
–u    # 文件存在并且设置了它的set-user-id位
–w    # 文件存在并且可写
–x    # 文件存在并且可执行

4.2 case

case结构用于多种情况的条件判断,类似于其它语言的switch/case,但从语法结构上有很大的不同,常用格式。

case 字符串 in
    模式)
        语句
        ;;
    模式2 | 模式3)
         语句
        ;;
    *)
     默认执行的 语句
         ;;
esac

例如:

#!/bin/bash
read -p "请输入要查查询的区号:" num
case $num in
 
   *)echo -n "中国";;&
     03*)echo -n "河南省";;&
        ??71)echo "郑州市";;
        ??72)echo "安阳市";;
        ??73)echo "新乡市";;
        ??73)echo "许昌市";;
     07*)echo -n "江西省";;&
        ??91)echo "南昌市";;
        ??92)echo "九江市";;
        ??97)echo "赣州市";;
esac

5. 循环

5.1 for

例如:

打印目录下所有的文件 

#!/bin/bash
for i in $( ls ); do
    echo item: $i
done

打印序列

#!/bin/bash
for n in $(seq 1 10);
do
   echo $n
done

5.2 while

例如:

#!/bin/bash
counter=$1
while [ $counter -lt 10 ];
do
    echo the counter is $counter
    counter=$(($counter+1))
done

5.3 until

例如:

#!/bin/bash
counter=$1
until [ $counter -lt 10 ];
do
   echo the counter:$counter
   let counter=counter-1
done

转载原创文章请注明,转载自: 斐斐のBlog » Linux Bash基本语法
评论已关闭