shell教程

2019-06-23  本文已影响0人  超哥__

Linux Shell参考

测试:docker run -it centos:6

Linux常用命令

自动补全

[root@870cee8a91f9 /]# l
l. ld lesskey lgroupmod ln logname lsmod lusermod luserdel
[root@870cee8a91f9 /]# $
$BASH $BASH_VERSINFO $HISTFILESIZE $MAILCHECK $PWD
[root@870cee8a91f9 /]# ls /bin/bas
basename  bash

命令执行方式

/bin/ls
./1.sh
bash 1.sh
bash /tmp/1.sh
python 1.py
echo $(ls -al /)

echo

文件操作

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
上一篇下一篇

猜你喜欢

热点阅读