Linux Shell 初步编程
笔记向,慎读
查看shell
echo $Shell
cat /etc/shells
Linux 默认 default shell 为->sh/bash
目录结构
/ 根目录 只放目录,不放文件
/home 用户的宿主目录
/usr/bin 命令文件目录
/usr/sbin 放置系统管理员使用的可执行命令
/etc 系统配置文件所在地
/var 经常变动的目录,存放系统日志的地方
/tmp 临时文件目录,会存放程序临时产生的文件
/dev 设备文件存储目录
常用命令的基本用法
wc [-c|-w|-l] [文件名] #字节数|单词数|行数
chmod [u|g|o|a] [+|-|=] [mode] 文件名
grep [-i|-v...] 查找条件 目标条件
-i:查找时忽略大小写
-v:查找与条件不符合的行
-A1:获得符合匹配的下一行,包括匹配行
find [查找范围] [查找条件]
-name -szie -user -type
tar [选项] 归档文件名 源文件或目录
-z或-j必须其一,表示使用gzip还是bzip2压缩
-c或-x只能选其一,c表示创建压缩,x表示解压缩
sort 常用参数
-u 删除所有重复行
-r 以降序顺序排列
-n 以数值顺序排列
-k n 对文件第n行进行排列
-t : 以分隔符:进行排列
-c 是否排序
特殊变量
$0 脚本名
$1 - $9 脚本参数
$# 命令行参数个数
$@ 命令行参数独立表示
$* 命令行参数用一个字符串表示
$$ 当前进程id
$? 上一条命令回传值,成功为0
数组声明
array=(1 2 3 4)
${array[2]} 获得第二个元素
${array[*]} 获得所有元素
${#array[*]}获得数组数目
条件测试
- test expression
- [ expression ] 注意[] 间的空格
数值比较
-eq= -gt> -lt< -ge>= -le<= -ne!=
字符串比较
-n string 是否为不空
-z string 是否为空
s1 = s2 注意空格
s1 != s2 字符串比较时最好用双引号,以免出错
文件测试
-d file 目录
-e file 存在
-f file 普通
-b file 块设备
-x file 是否可执行
-L file符号化链接
复合条件测试
!空格 expression
expression -a expression1
expression -o expression1
#冒泡排序
array=(10 9 8 7 6 4 2 3 1)
for((i=${#array[*]}-1;i>0;i--));
do
for((j=0;j<i;j++));
do
if [ ${array[j]} -gt ${array[j+1]} ]
then
t=${array[j]}
array[j]=${array[j+1]}
array[j+1]=$t
fi
done
done
echo ${array[*]}
读取和输出变量
echo -n (去换行) -e (解析转义)
read [-p|n|s] var1 var2 .... p为提示信息,n为字符数限制,s为密码
#利用read读取文件内容
while read line
do
echo $line
done <bubble.sh
重定向
错误命令2>文件 覆盖方式
错误命令2>>文件 追加方式
命令 >文件 2>&1 正确和错误输入到同一个文件
&> /dev/null 不产生输出信息
shell 文本处理
${#string} 计算字符串长度
${string:pos:len} 提取子串
${string#substring} 从开头,删除最短匹配substring
${string%%substring} 从尾开始删除最长匹配
${string%substring} 从尾开始删除最短匹配
${string/#old/new} 如果结尾以old ,以new替换
${string/%old/new} 如果结尾以old ,以new替换
${string/old/new} 以new替换old
高级文本处理
awk
awk '条件{行为}'
$0 记录当前记录
$1-$n 记录第n个字段,以FS分割
FS 分割字段
NF 当前列数
NR 已经读出的记录数
sed
#常用用法
sed -i "3,6s/old/new/g" source [i表示在源上修改]
[3,6表示在第3,6行修改]
d命令
sed '/fish/d' my.txt 删除有fish行
sed '2d' my.txt 删除第二行
sed '2,$d' my.txt 删除第二行到结尾
c命令
sed '2c XXXXX' 替换第二行
sed '/fish/c XXXXX' 替换有fish的行
a和i是追加插入
几个例子
#判断是大写还是小写还是数字
read -p "input char:" word
case $word in
[[:lower:]] )
echo "$word is lower";;
[[:upper:]] )
echo "$word is upper";;
[0-9] )
echo "$word is digital";;
esac
#将小写替换成大写
for line in `cat output.txt`
do
echo $line |tr [a-z] [A-Z]
done
echo -e "\n"
sed 's/[a-z]/\u&/g' output.txt