Linux Shell
Linux Shell
常用命令
给命令起别名
# 创建一个别名命令
alias list='ls -h'
# 删除一个别名命令
unalias list
# 查看系统上所有的别名命令
alias
Shell中的变量
# 定义本地变量
say="hello"
# 使用本地变量
echo $say
# 查看所有变量
set
declare
# 设置变量为只读变量
readonly say
# 再次设置变量值会报错
say="bye"
# 清除变量
unset say
Shell中变量的展示
myvar="hello"
# 普通显示
$myvar
${myvar}
# 一个没有定义值的变量
myname=
# 显示默认值:没有定义值,使用默认值来显示(但不把值设置到变量)
${myname:-"unknown"}
# 设置默认值:没有定义值,就设置一个默认值(会把值设置到变量上)
${myname:="Normal Name"}
# 指示错误提示:变量unset(未定义值)或者为null时,给出指示
${myname:?"Normal Name"}
# 显示替代值:变量为null是,使用替代值进行展示(不修改原有变量的值)
myname=null
${myname:+"Other"}
Shell脚本文件中的变量
#!/bin/sh
# test.sh
# 脚本命令名
echo "script name:$0"
# 参数 1-9
echo "param 1:$1"
echo "param 2:$2"
echo "param 3:$3"
echo "param 4:$4"
echo "param 5:$5"
echo "param 6:$6"
echo "param 7:$7"
echo "param 8:$8"
echo "param 9:$9"
# 参数 10+的获取方式
echo "param 10:${10}"
# 全部参数
echo "all params:$@"
echo "all params:$*"
# 传递到脚本中的参数个数
echo "params count:$#"
# 上一次运行的脚本的退出状态
echo "last cmd exit state:$?"
脚本调用
test.sh 1 2 3 4 5 6 7 8 9 10
常用环境变量
# 主命令
echo $HOME
# PATH路径
echo $PATH
# 终端信息
echo $TERM
# 命令提示符
echo $PS1
# 二级命令提示符
echo $PS2
# 自定义命令提示符
PS1="[\u@\h \W]\$"
# 当前目录
echo $PWD
pwd
# 当前使用的默认shell
echo $SHELL
# 查看环境变量
env
# 导出环境变量
export
Shell中的双引号和单引号
# 双引号解析字符中的$XXX
echo "hello $SHELL"
# 单引号不解析字符中的$XXX
echo 'hello $SHELL'
# 反引号执行引号中的内容,并替换为结果
ls `cat list.txt`
Shell中的运算符
# 按位运算符
~op1
op1 >> op2
op1 << op2
op1 & op2
op1 ^ op2
op1 | op2
# 逻辑运算符
&&
||
# 赋值运算符
# = , += , -=, *= , /= , %=, &=, ^=, |= , <<=, >>=
let count=$count+$add
let count+=$add
# 方括号中的表达式求值
$[ 5+5 ]
# 指定进制[base#num]
$[2#1011+8#26]
Shell中的输入输出
# -e 解析转移字符
echo -e "hello\nworld"
#echo -n 尾部不添加换行符
echo -n "First Name:"
#read 读取输入内容赋值给变量
read firstname
# 连接并输出信息
cat myfile | more
文件重定向
# 把标准输出重定向到新文件
command > filename
# 把标准输出和标准错误一起重定向到文件
command > filename 2>&1
# 把标准输出重定向到文件
command 1 > filename
# 把标准输出重定向到文件(以追加的方式)
command >> filename
# 把标准输出和标准错误一起重定向到文件(以追加的方式)
command >> filename 2>&1
# 把filename作为标准输入,filename2作为标准输出
command < filename > filename2
# 从标准输入中读取指导遇到分解符delimiter
command << delimiter
# 把文件描述符m作为标准输入
command <&m
# 把标准输出重定向到文件描述符
command >&m
# 关闭标准输入
command <&-
exec命令
# 执行完会退出,需要和文件描述符一起用
exec ./a.out
exec的应用
#!/bin/sh
# 使用文件描述符来操作exec,&0把0号文件描述符的内容赋值给3号文件描述符,然后把name.txt内容的给标准输入
# (缓存标准输入到3,把标准输入替换为name.txt)
exec 3<&0 0<name.txt
# 从文件中读取出内容放到line1和line2
read line1
read line2
# 还原标准输入
exec 0<&3
Linux的其他工具
# df 报告文件系统磁盘使用量
df -h
# tee 在屏幕显示并可以输出到文件中
who | tee -a out.txt
控制流
if
case
for
while
break
continue
条件测试
test expression 或者 [ expression ]
(注意:中括号左右要有空格)
# 测试a.out这个文件是否存在
test -e a.out
# 如果a.out存在,$? 为 0 否则为 1
echo $?
# man test
# ---------------------------
# test 参数
# -e 文件存在
# -f 文件存在并且是一个正规文件
检查文件是否存在
#!/bin/sh
# 测试传入的第一个参数
test -e $1
if [ $? -eq "0" ]; then
echo "$1 is exist."
else
echo "$1 is not found."
fi
测试字符串
[ string operator string ]
= 两个字符串相等
!= 两个字符串不相等
-z 空串
-n 非空
if [ 'abc' = $1 ]; then
echo "equal"
else
echo "not equal"
if
expr 计算
# 注意计算操作符左右两侧要有空格
expr 5 + 6
# 注意乘号需要前面加\来转义,方式被shell解析为通配符
expr 5 \* 6
if 语句
if condition
then
cmd
elif condition
then
cmd
else
cmd
fi
或者
if codition; then
cmd
else
cmd
fi
case 多选择语句
case word in
pattern1 ) compound-list ;;
pattern | pattern ) compound-list ;;
pattern | pattern ) compound-list
esac
问答选择
#!/bin/sh
while
do
echo -n "Enter any num[1-5]:"
read num
case $num in
1|2|3|4|5)
echo "You enter num is $num"
;;
*)
echo -n "Wrong num,continue[y/N]:"
read is_continue
case $is_continue in
y|yes|Yes)
continue ;;
*)
break ;;
esac
esac
done
for 循环语句
for name in word
do
compound-list
done
循环显示数字
for item in 1 2 3
do
echo $item
done
显示指定目录下的文件
#!/bin/sh
#list_files.sh
index=0
for item in `ls $1`
do
echo "$index:$item"
index=`expr $index + 1`
done
使用
list_files .
省略in的用法
#!/bin/sh
i=1
#等价于
#for param in $@
for param
echo "param #$i in $param"
i=`expr $i + 1`
done
while 循环语句
# 先测试通过后,执行命令
while compound-list
do
compound-list
done
乘法口诀表
#!/bin/sh
#九九乘法口诀表
i=1
while [ $i -le 9 ]
do
j=$i
while [ $j -le 9 ]
do
result=`expr $i \* $j`
echo -n "$i*$j=$result\t"
j=`expr $j + 1`
done
i=`expr $i + 1`
echo
done
文件中按行读取数据
#!/bin/sh
# read.sh test.txt
while read LINE
do
echo $LINE
done < $1
until 循环
# 先执行一次命令然后再进行测试
until compound-list
do
compound-list
done
正则表达式
元字符集
^ 匹配行首
$ 匹配行尾
* 匹配0到多个单字符
[ ] 匹配序列
\ 转义字符
. 匹配任意单字符
pattern{n} 匹配前面pattern出现次数 =n
pattern{n,} 匹配前面pattern出现次数 >=n
pattern{n,m} 匹配前面pattern出现次数,在n到m
查找
# 指定路径下查找文件
find
# 小范围查找
# 按行查找信息
grep
# 按列过滤信息
awk
# sed
sed
grep命令
grep
# -c 匹配的行数统计
# -i 忽略大小写
# -v 反向匹配
# -s 不显示错误信息或无匹配文本
# -n 显示行号
awk命令
awk
# -F ":" 按照:将行分割为多列
# 输出第1和第三列
awk -F ":" '{print $1,"-",$3}' /etc/passwd
# 第三列大于200的信息输出
awk -F ":" '$3>200 {print $1,"-",$3}' /etc/passwd
# 打印第7列数值都大于0的数据的第1列和第7列
awk '{ if($7>0) print $1,"\t",$7 }'
# 打印第5到第7条数据
awk ' NR>=5 && NR<=10 { print }'
sed命令
sed
# -n 只显示符合条件的行
# 打印全部行
sed -n 'p' data.txt
# 打印从第三行开始匹配/ddd/的行
sed -n '3,/ddd/p' data.txt
# 打印空行
sed -n '/^$/p' data.txt
# 把所有的yes替换为no
sed 's/yes/no/g' data.txt
# abc出现的行号
sed -n '/abc/='
sort命令
sort
# -n 按数字方式排序
# -r 逆序
# -kN 按第N列排序