shell编程的笔记

关于历史命令

Shell相关

!! 是上一次执行的命令

!字符串  指执行最近一次以这个字符串开头的命令

!$ 取出上一条命令最后一个单词或命令

  *匹配0个或多个字符         ?匹配一个字符

Ctrl+z  暂停一个进程          fg(foreground)恢复这个进程到前台  bg(background)恢复这个进程到后台

如果暂停多个进程,则可以使用jobs命令,查看进程编号 ,如1 或2。然后fg 和bg的时候后边加上这个编号,指定返回哪个进程。 如  fg 2

Ctrl+c  结束掉一个进程

 env 显示所有环境变量

set显示当前shell所有变量(包括自定义、环境变量

设置变量时需要注意:

a=b   b作为变量内容,等号两边不能有空格   ,变量内容带有特殊字符时,需要加上单引号

如:  a=’str      heheh’

单引号会使里边的特殊符号失去作用:

比如:  a=’$abc’      那么a就是$abc

a=”$abc”  那么a就是$abc变量的值

变量里本身含有单引号,这就需要用双引号括起来了,变量里若含有双引号可以使用” 转义

 

 bash进入子shell,pstree可以查看

父shell的变量,让子shell可以使用,需要命令 export 一下

释放一个变量  unset 

管道符 |

如: 查看一个文件有多少行    cat  hi.txt | wc -l

-----------------------------------------------------------------------

变量定义

#x='fff'

#echo $x

#x="$x"hehe

#export x   (使之成为环境变量)

===============

追加一个目录如/root 到环境变量PATH

# PATH=$PATH:/root

# echo $PATH

===============

#bash  (子shell)

#pstree

set (查看所有变量)

env (查看环境变量)

 ----------------------

查看当前语系

locale

echo $LANG

echo $LC_ALL

------------------------

位置参数变量

$n 第几个参数

$* 全部变量 整体对待

$@ 全部变量 单独对待

$# 参数个数

---------------------

shell脚本开头一行

#!/bin/bash

---------------------

预定义变量

$?   (返回上一条命令执行正确否 0正确)

---------------------

read -p -s 用户输入的字符赋给变量

--------------------

declare -i -a -x(export) -p    变量声明为一个类型   -i整型 -a数组 -x环境变量 -p变量属性

---------------------

配置文件

配置文件加载顺序图

-----------------------------

欢迎信息  /etc/motd

--------------------------

正则&&通配符

----------------------------------

字符操作命令

cut   (比较适合规律的列文档    -f 列    -d分界符

 -----------------------------------

printf

awk

# awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s ",$4,$5,$6}'  netstat.txt

$0 当前记录(这个变量中存放着整个行的内容)

$1~$n 当前记录的第n个字段,字段间由FS分隔

查看文件系统/dev/root下的使用率:

df -h | grep "/dev/root" | awk '{print $5}' | cut -d '%' -f 1

-------------------------------------

sed

点击酷壳网这个也不错

---------------------------------------

sort

wc

--------------------------------------

插播个知识点:软硬连接

软连接类似于快捷方式,不同的i节点,删原文件,另一个打不开;硬链接就是一个文件,相同i节点,他俩名字不同而已,删除一个,另一个仍然访问。

---------------------------------------

标准输入输出的知识点:

标准输入:

  键盘  /dev/stdin   文件描述符0

标准输出:

  显示器  /dev/stdout   文件描述符1(标准正确输出)

标准错误输出:

  显示器  /dev/stderr   文件描述符2

比如:

标准正确输出的重定向: #echo 'aaa' 1> test1.log

有可能我的命令出错了,此时可以把这个报错信息标准错误输出。比如echoz命令写错了,(>>是追加文件,而不是覆盖)

标准错误输出的重定向: #echoz 'bbb' 2>> test2.log

正确和错误的输出同时重定向到一个地方,这种场景比较多见:这样格式  2>&1放在后头

#echoz  'ccc' >> test3.log 2>&1

或者这样格式:  #date &>> test3.log

正确输出放到一个地方,错误输出放到一个地方(分开保存,/dev/null是空设备:

#echo 'ddd'  >> test4.log  2>>/dev/null

 ======================================

shell判断符号,推荐[[  ]],语法要求:中括号内容左右两边留有空格

test -e /data/www/index.php

[ -e /data/www/index.php ]

[[  -e /data/www/index.php ]]

------------------------------

分支判断语法

注意:if要以if收尾。类似do以done收尾。case以esac收尾;

if后要有then,如果then不换行,那么then前边要有个分号;else后则不需要then;

elif的关键词;

#!/bin/bash

a='bb' #赋值操作等号两边不能有空格

if test -e "./test.sh"
 then echo 'exists'   #if 后有then
else echo 'no exists'  # else后没有then
fi

if [[ -n ${a}  ]]  
  then echo ${a} 
fi

b=123
if [ ${b} -eq 123 ]
  then echo '$b='"$b"  #输出$b=123 这里注意单双引号的区别
fi

echo 1+1  #输出 1+1

echo $((1+2)) #输出3

shell的几种常用的循环方式:

#!/bin/bash

for i in 1 2 3 
do
 echo $i
done

echo 


for j in {1..10}
do
  echo $j
done


for file in "./*"
do 
 echo $file
done



for file in $(ls) 
do 
 echo $file
done

比如现在文件夹下有n个文件,只有名字是a.txt的不想删除,其他都要删。可以利用xargs

比如: ls | grep -v a.txt | xargs rm -rf 

${var:-word}这个意思是如果var这个变量存在且不为空,就返回var,否则返回word

点击慕课网这个入门也很好

原文地址:https://www.cnblogs.com/firstForEver/p/4834766.html