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地址映射

1万+

被折叠的 条评论
为什么被折叠?



