bash shell

来源:互联网 发布:千里马计划软件下载 编辑:程序博客网 时间:2024/05/16 11:24

bash

shell种类: sh, dash, bash ksh, zsh, csh, tcsh
echo $SHELL 查看当前shell
cat /etc/shells 查看系统支持的shell

最常用, Linux预设shell为bash.

变量

字母, 数字, 下划线组成, 不允许数字开头.

定义: VAR=value
使用: $VAR

名称 功能 局部变量 仅在本shell进程可用的用户自定义变量 环境变量 在本shell进程以及其子进程可用的变量(export命令) 位置变量 $0(脚本名), $1-$9(脚本参数) 内建变量 有特殊含义的变量, 如$#, $?

相关命令

  • env 列出所有环境变量
  • set 列出所有环境变量以及自定义变量(当前bash有效)
  • locale 显示当前语言和编码
    • -a 显示所有系统支持的语言和编码
  • unset VAR 删除变量VAR
  • export 显示所有环境变量的定义
    export VAR 将自定义变量VAR升级为环境变量

数组变量

${arr[i]} 数组中下标为i的变量, 等同于c语言中的arr[i].
${arr[*]} 所有数组元素
${#arr[*]} 数组元素个数

内建变量

$? 上一条命令的返回值
$# 命令行或位置参数个数
$$ 当前执行进程的ID
$! 最后执行的后台命令的进程ID
$- shell当前选项, 与set命令功能相同.
$* 命令行参数用字符串连接起来, 用空格分隔.
$@ 命令行参数各个独立表示的数组.

条件测试

0为真, 1为假.
条件测试的两种结构为[ EXP ]test EXP

数值测试

必须使用eq, gt, lt, ge, le, ne
对应于c语言中的==, >, <, >=, <=, !=

字符串测试

-n STR 字符串是否不为空
-z STR 字符串是否为空
STR1 == STR2 判断字符串是否相等
STR1 != STR2 判断字符串是否不相等

字符串比较建议字符串变量使用双引号, 即使变量为空.

文件测试

-e FILE 测试文件是否存在
-f FILE 测试文件是否为普通文件
-d FILE 测试文件是否为目录
-L FILE 测试文件是否为软链接文件
-b FILE 测试文件是否为块设备文件
-c FILE 测试文件是否为字符设备文件
-p FILE 测试文件是否为管道文件
-S FILE 测试文件是否为SOCKET文件
-s FILE 测试文件长度是否不为0
-r FILE 测试文件是否为进程可读文件
-w FILE 测试文件是否为进程可写文件
-x FILE 测试文件是否为可执行文件

输入输出

  • read VAR… 输入内容赋值给变量
    • -p MSG 输出提示信息
    • -n 对输入字符数进行限制
    • -s 隐藏输入字符(常用于密码)
    • -t N 设置超时时间(秒)
  • echo STR 输出字符串STR并换行
    • -n 不换行
    • -e 启用转义字符
  • printf STR 类似C语言的格式输出STR

其他

脚本中打开和关闭跟踪执行功能
set -x 打开跟踪执行功能
set +x 关闭跟踪执行功能

执行命令选项
bash -x FILE.sh 进入跟踪模式, 显示执行的每一条命令.
bash -n FILE.sh 检查shell脚本是否存在语法错误, 不执行脚本.
bash -c STR 从字符串中执行shell命令.

实例

简单算法

冒泡排序
bash code

bubble_sort() {    arr=$1    len=$2    for((i=0;i<len-1;i++)); do        for((j=0;j<len-i-1;j++)); do            if [ ${arr[j]} -gt ${arr[j+1]} ]; then                tmp=${arr[j]}                arr[j]=${arr[j+1]}                arr[j+1]=$tmp            fi        done    done}arr=(3 1 2 5 4)len=${#arr[*]}bubble_sort $arr $lenecho ${arr[*]}

提取字符串

提取路径中的目录路径, 文件名, 扩展名.
利用算术展开
echo ${path%/*} 目录路径
echo ${path##*/} 文件名
echo ${path##*.} 扩展名
利用命令展开

echo `basename $path` 目录路径echo `dirname $path` 文件名 

文件搜索

递归寻找当前目录下~为后缀的文件并删除
直接使用find命令
find . -name "*~" -exec rm {} \;
使用for循环shell脚本
bash code

files=`find . -name "*~"`for file in $files; do    rm $filedone

文本处理

去除各类空白(TAB和空格)
grep -v "^$" text.txt 去除空白行
sed 's/^[ \t]*//g' text.txt 去除行首空白
sed 's/[ \t]*$//g' text.txt 去除行尾空白
去除windows系统文本文件行尾多余的回车换行符
windows行尾使用\r\n, linux行尾使用\n.
^M是linux回车换行符写法(输入方法是按住CTRL+v,松开v,按m)
sed -i 's/^M//g' text.txt
转换编码使用iconv命令
iconv -c -f GB2312 -t UTF-8 old.txt > new.txt

网络处理

获取当前网卡eth0的IP地址(已知C类网络)并扫描局域网可ping通主机
bash code

ipaddr=`ifconfig | grep -A1 "eth0" | sed '1d' | awk '{print $2}' | awk -F: '{print $2}'`network=${ipaddr%.*}for num in {1..255}; do    ip=$network.$num    ping -c 1 -w 1 $ip &> /dev/null    [ $? -eq 0 ] && echo $ipdone

使用arp -a查看局域网主机IP地址与MAC地址映射

0 0