Linux Bash编程笔记

这里主要记录Linux系统的默认shell Bash脚本用法.

Bash特定用法

shebang

# 脚本执行时告诉shell用哪个程序解释脚本

#!/usr/bin/env bash   
#!/bin/bash
#! /bin/bash -xe

# -x 执行详细脚本, 等同于   set -x, 可用于调试目的
# -e 遇到非0错误立即退出, 等同于   set -e

重定向/管道

2>&1
# 1 代表 stdout, 2 代表 stderr.
# 2>1 可以看做重定向 stderr 到 stdout.实际上被解释为 "重定向 stderr 到文件名为 1的文件". 
# & 指出接下来是一个文件描述符而不是一个文件

Bash 脚本基础

变量

# 变量赋值=周围不能包含空格
VARNAME="value"

# 单引号''保持每个字符的字面值
# 双引号""保持每个字符的字面值,除了$,``,\
# 转义字符使用\
# 显示当前日期
$(date +%Y-%m-%d)

特殊变量:

$?  # 上一个命令的退出码

$$ # 当前shell进程ID

参数

  • $# : 参数个数
  • $0 : 文件名
  • $1 : 第一个参数值
if [ $# -eq 0 ]
  then
  echo "no args" 
else
  echo "arg1 $1"
fi  

操作

  • $((expression)) : 算术运算
  • ${#varname} : 字符串长度
# 

subshell

使用(在子命令范围有效), 如临时切换目录等.

循环

    while [$port -lt 1024]
    do
        port = 'expr $port + 1'; 
    done

多分支选择

    case "$1" in
        start)
            ./start.sh
            ;;
        stop)
            ./stop.sh
            ;;
        *)
            echo "Usage: $0 {start|stop}"
            exit 1
            ;;
    esac

Bash 脚本高级

HereDoc

也许你没听过这个名字,但一定见过这个用法.

它会把开头的单词做标记,提取中间的内容作为标准输入stdin.

    # 格式
    <<[-]END_TEXT
        here-document
    END_TEXT
    # 示例1
    cat <<EOF
    My home directory is $HOME
    EOF
    # 说明: 默认会解释内容中的变量符号
    # 如果要保持原样,开头要加上引号'EOF'
    # 如果要去掉格式中的tab符号,前面加-EOF
    # 示例2,利用定向符
    cat <<EOF > file
    My home dir is $HOME
    EOF
    # 精简格式
    fmt -t -w 20 <<< 'Wrap this silly sentence.'

资源