Bash 基础语法
  Linux   0 评论

Bash 基础语法

  Linux   0 评论

简介

Bash 是一个命令解释程序,结合 Linux 命令可以完成很多事情。

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

文件描述符 名称 通用缩写 默认值
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 来显示当前的环境变量

HOSTNAME=IDC-D-1699
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=111.200.23.36 31752 22
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/3
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/java/jdk1.8.0_101/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
JAVA_HOME=/usr/local/java/jdk1.8.0_101
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root

2.2 本地变量

Shell 变量不需要明确定义变量类型,事实上 Shell 变量的值都是字符串,Shell 变量不需要事先定义就可以使用,如果使用没有定义的变量,这字符串取值为空字符串。

变量名称="变量value"

= 两边不能有空格,否则 Shell 会解释成名称和命令参数。

获取变量使用 $变量名称

a="ywq"
echo $a

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 中用 ifthenelifelsefi 这几条命令实现分支控制,这种流程控制语句本质上也是由若干个逻辑判断组成的,需要注意的是:

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

4.2 case

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

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

当程序执行到指定的条件语句 ;;& 时,不会停止运行,指导执行到 ;;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
util [ $counter -lt 10 ];
do
    echo the counter:$counter
    let counter=counter-1
done

6 比较运算

6.1 比较符

比较符 说明 举例
-e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename 可写,则为真 [ -w /varmtmp.txt ]
-x filename 如果 filename 可执行,则为真 [ -x /usr/bin/grep ]
-s filename 如果 filename 不是空白文件,则为真
-u filename 如果 filename 有 SUID 属性,则为真
-g filename 如果 filename 有 SGID 属性,则为真
-k filename 如果 filename 有 stickybit 属性,则为真
file1 -nt file2 如果 file1 比 file2 新,则为真
file1 -ot file2 如果 file1 比 file2 旧,则为真

6.2 字符串比较运算法

比较符 说明 举例
-z string 如果 string 长度为零,则为真
-n string 如果 string 长度不为零,则为真
str1 = str2 如果 str1 与 str2 相同,则为真
str1 != str2 如果 str1 与 str2 不相同,则为真

6.3 算术比较符

比较符 说明 举例
-eq 等于
-ne 不等于
-lt 小于
-le 小于或等于
-gt 大于
-ge 大于或等于

文章来源

回复