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 $len
echo ${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 $file
done
文本处理
去除各类空白(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 $ip
done
使用arp -a
查看局域网主机IP地址与MAC地址映射