shell教程
2019-06-23 本文已影响0人
超哥__
Linux Shell参考
测试:docker run -it centos:6
Linux常用命令
自动补全
- 在命令行输入命令首字母后,按两次tab可列出所有以该字母开头的命令
[root@870cee8a91f9 /]# l
l. ld lesskey lgroupmod ln logname lsmod lusermod luserdel
- 在命令行输入$后,按两次tab可列出环境变量
[root@870cee8a91f9 /]# $
$BASH $BASH_VERSINFO $HISTFILESIZE $MAILCHECK $PWD
- 在准备输入路径时,按一次tab可补全指定目录的文件
[root@870cee8a91f9 /]# ls /bin/bas
basename bash
命令执行方式
- 作为可执行程序或脚本
/bin/ls
./1.sh
- 脚本作为解释器参数
bash 1.sh
bash /tmp/1.sh
python 1.py
- 使用shell命令执行
echo $(ls -al /)
echo
- 用于在屏幕上打印字符串
- 用于其他命令传参
echo pass | passwd user --stdin
- 用于写入文件
echo abcd > aaa.txt
- 用于打印变量
echo $RANDOM
文件操作
ls
find
cat
chmod 修改文件属性
file 查看文件类型
grep 正则搜索
cut 字符串处理
awk 字符串处理
sed 文本字符串处理
sort
uniq
du -sh 计算文件夹大小
mkdir
rm
mv
head
tail
which 定位可执行文件
touch 创建文件
系统
date
kill
ps aux
uname 查看系统版本
网络
curl
wget
scp
ssh
chmod
权限标志
4 r read
2 w write
1 x execute
常用权限:
abc a,b,c分别为三个8进制数字,每个数字对应上面权限标志的读,写,执行组合,a,b,c分别代表文件所属用户,所属用户组,其他用户执行权限
444 r–r–r–
600 rw——-
644 rw-r–r–
666 rw-rw-rw-
700 rwx——
744 rwxr–r–
755 rwxr-xr-x
777 rwxrwxrwx
例:
chmod 777 /path/to/my/file 赋予读写执行权限
chmod chmod ug=rwx,o=x file 赋予属主和用户组读写执行权限,其他用户只有执行权限
chmod +rwx /path/to/my/file 在原始权限上增加user/group/other的读写执行权限
chmod +x 1.sh 有了执行权限才可以直接运行'./1.sh'
awk
截取文本列
ps aux | grep -v grep | awk '{print $1}'
sed
正则替换
echo This is a dog | sed 's/This/aaa/'
截取文本行
echo -e "1\n2" | sed -n '2p'
find
find . 递归列出当前目录及所有子目录,和ls区别是ls只列当前目录
find /path -name "1.txt" 在指定目录及所有子目录查找文件
find /tmp -exec ls {} \; 对所有找到的文件执行ls操作
grep
-E 使用郑泽
-i 忽略大小写
-v 反选
-n 显示行号
echo aabb | grep -E [a-z]{4}
echo aabb1122 | grep
grep -nwr 字符串 目录
ps aux | grep 进程 | grep -v grep
vim
^ 行首
$ 行尾
gg 首行
G 尾行
x 删除当前字符
nx 删除当前n字符
dd 删除当前行
ndd 删除当前n行
/ 查找
a 编辑模式
:命令模式
:wq 写入文件并退出
:q! 放弃保存并推出
shell语法
解释器说明
一般shell脚本第一行为#!/bin/bash
,这个标记告诉系统,该文件的默认解释器是bash,则效果等同于:./test.sh -> bash ./test.sh
,同理如果使用了标记#!/usr/bin/pyhon
,则效果等同于:./1.py -> python 1.py
注释
单行注释:'#'符号以后的内容都会被注释
多行注释:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
重定向
> 输出重定向 echo hello > test
echo hello > /dev/null 禁止输出
< 输入重定向 cat < test
>> 输出追加重定向
变量
var1=hello # 注意=前后不能有空格
echo $var1
echo ${var1}_world # 注意此时需要帮助解释器识别变量,用花括号
var1=1
if [ $var1 -gt 0 ]; then echo ok;fi
字符串
s=abcd
echo ${#s} 长度
echo ${s:1:2} 子串
数组
array_name=(value0 value1 value2 value3)
array_name[4]=value4 # 赋值
echo ${#array_name[@]} # 获取长度
echo ${array_name[4]} # 获取元素
echo ${array_name[@]}# 获取所有元素
# 增加元素
条件判断
a=5
if [ $a == 5 ];then # []内部必须有空格
echo a=5
fi
if [ $a == 5 ];then echo a=5;fi # 写成一行
if [ $a -gt 0 ];then
echo a>0
else
echo a<=0
fi
if [ $a -lt 0 ];then
echo a<0
elif [ $a -lt 5 ];then
echo 0<=a<5
elif [ $a -lt 10 ];then
echo 5<=a<10
else
echo a>10
fi
表达式
文本测试
-d 是否目录 -e 是否存在 -f 是否文件
-r 是否可读 -w 是否可写 -x 是否可执行
if [ -d /usr/bin ];then echo /usr/bin is dir;fi
逻辑测试
if [ -e /etc/fstab ] && [ -e /usr/bin ];then echo ok;fi # 逻辑与
if [ -e /etc/fstab ] || [ -e /usr/bin ];then echo ok;fi # 逻辑或
if [ ! -e /etc/nopath ];then echo ok;fi # 逻辑非
注意 ! 逻辑非适用于所有表达式
整数操作
-eq 是否相等 -ne 是否不等 -gt 是否大于 -lt 是否小于
-le 是否小于等于 -ge 是否大于等于
[ 10 -eq 15 ]
echo $?
运算符 + - * / % == !=
num1=$[1+2] 运算
num2=$[$num1*3]
num3=`expr 1 + 2`
if [ $[1+2] == 3 ];then echo ok;fi
if [ $[3*1] == 3 ];then echo ok;fi
if [ $[7%4] == 3 ];then echo ok;fi
< >
if [[ 10 < 11 ]];then echo ok;fi # 注意两层[]
字符串
-z 是否空 -n 是否非空 = 是否相等 != 是否不等
a=xyz
if [ $a != abc ];then echo ok;fi
== 相等 =~ 正则匹配
a=aa12345
if [[ $a =~ ^aa[0-9]{5}$ ]];then echo ok;fi # 注意两层[],检测前缀后缀常用
流程
for i in {1..10};do echo $[$i*$i];done
arr=(1 2 3)
for i in ${arr[@]};do echo $[$i*$i];done
arr=(s1 s2 s3)
for i in ${arr[@]};do echo test_${i};done
for i in `cat /etc/hosts`;do echo line $i; done
for i in $(cat /etc/hosts);do echo line $i; done
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
函数
1.sh=>
function test {
echo test argc=$#,arg1=$1,arg2=$2,arg3=$3
}
function testret1 {
echo 123
}
function testret2 {
return 456
}
echo main argc=$#,arg1=$1,arg2=$2,arg3=$3
test 1 2 3
testret1
echo test=$? # 打印testret1返回值整数
echo test=$(testret2) # 取testret2函数输出字符串
./1.sh a b c