Shell 看完就会用

作者: 司鑫 | 来源:发表于2018-02-03 00:26 被阅读239次
SHELL

一 什么是 Shell


shell 直译为壳,shell 是一个命令解释器,处于内核和用户之间,负责把用户的指令传递给内核并将执行结果回显给用户,同时 shell 也是一门编程语言。
shell 之所以被称为 shell ,是因为它隐藏了操作系统的底层细节。Unix 下的一些图形用户界面如 GNONE 、KDE... 也被称为是 “虚拟 shell”

二 常见的几种 shell


  • Bourne Shell (sh):它是 Unix 的默认 shell,也是其它 shell 的开发基础,但是在交互方面不如其它 shell,sh 的创始人是 Steven Bourne,为了纪念他也是以他的名字来命令
  • C Shell(csh):csh 的语法和 C 语言很类似,在交互方面有了很大的改善如:命令不全,命令别名等,但是 csh 和 sh 不兼容
  • Korn Shell(ksh):是 csh 的一个加强版,集合了 csh 和 sh 的优点,并且兼容 sh
  • Bourne Again Shell (bash):是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。
  • Zsh:在兼容 bash 的同时提供了更多的改进

三 常用功能


  1. 历史命令
  • 查看历史记录
history  // 查询历史记录,显示最近使用的2000条命令(默认两千)
  • 修改显示记录数
vi /etc/profile  //修改环境变量配置文件
HISTSIZE=1000   //修改默认历史命令条数

source /etc/profile 使环境变量生效
  • 把内存中的命令历史保存到文件中(历史默认保存在 ~/.bash_history
    文件中)
    打开 terminal 后,我们在没有关闭 terminal 前,在当前 terminal 的操作命令会保存在内存中,直到当前 terminal 关闭后,内存中的命令历史才会被写入到 ~/.bash_history 文件中。
    如果我们需要强制将内存中的命令历史保存在 ~/.bash_history 文件中,使用
history  -w //把内存中命令历史,保存入文件
  • 清空历史
history  -c 
  • 重复历史命令
!n          //重复第n条命令
!str        //重复最后一个以str开头的命令
上箭头     //调用上面的命令
  1. 别名
  • 查看系统中已有的别名
alias
  • 设置别名
alias  ls='ls  --color=never'   手工设定别名,临时生效
vi  ~/.bashrc       在 ~/.bashrc 写入别名,永久生效
  1. 输出重定向
    即把输出在屏幕上的信息重定向到文件中(比如 log 信息)
>   覆盖
  ls  >  aa     将 ls 命令显示的信息覆盖到 aa 文件中

>>  追加
ls  >>  aa      将 ls 命令显示的信息追加到 aa 文件中

ls  gdlslga  2>>aa    将错误信息输出到 aa 文件中(ls gdlsga 命令会出错)

ls  >> aa  2>>bb      将正确信息输出到 aa 文件中,错误信息输出到 bb 中

ls  >>  aa  2>&1      将正确和错误信息都追加在 aa 中
  1. 多命令顺序执行
  • 命令1 ; 命令2 ; 命令3 //命令123顺序执行。之间没有任何关系
  • 命令1 && 命令2 //命令1正确执行后,命令2才会执行
  • 命令1 || 命令2 //命令1执行不正确,命令2才会执行
  1. 管道符
    命令1 | 命令2//命令1的执行结果,作为命令2的执行条件
netstat -tlun | grep 80                 查询监听的端口号,并查看80端口是否启动。
  1. 键盘读取
read  -p “提示信息”   [-t  等待时间]   变量名

# example.sh #
#!/bin/bash
read -p "please input num1:" -t 30  test1
read -p "input num2:" -t 30  test2
sum=$(( $test1 + $test2))
echo “num1 +  num2 = $sum”
  1. 数值运算
    变量默认是字符串类型,进行数值运算可有下面三种方法
num1=123
num2=456

1 declare -i sum=$num1+$num2
2 sum=$(( $num1 + $num2 ))
3 sum=$(expr $num1 + $num2)     注意+左右必须空格

支持的运算操作 +   -  \*  /  %取余

四 变量


变量设定规则

  • 变量以等号连接值,等号不能有空格
  • 变量名由数字和字母和下划线组成,不能以数字开头
  • 变量值中有空格,用引号括起来
  • 双引号内,有特殊字符。如$
  • 单引号中特殊字符无含义
  • 在变量值中,可以使用\转义符
  • 变量值可以直接调用系统命令。 `命令` $(命令)
  • 变量值可以累加 aa=123 aa="$aa"456 echo $aa --->123456
  • 环境变量一定设为大写
  1. 本地变量
  • 声明
变量名=变量值     注意:=号左右不能有空格
aa=123
  • 调用
echo $aa
  • 查看变量
set     查看所有变量,包括环境变量和本地变量
  • 删除
unset 变量名
  1. 环境变量
  • 声明
export  变量名=变量值
  • 查看
set 查看所有变量
env、export 只查看环境变量
  • 声明变量类型
declare     声明变量类型的,如果不特别声明,所有变量为字符串型
-i   声明为int 
-x   声明为环境变量
  • 删除
unset 变量名
  • 环境变量配置文件
/etc/profile
/etc/bashrc     所有用户生效

~/.bashrc
~/.bash_profile 只对指定用户生效
  1. 位置参数变量
    在执行 shell 脚本时手动传入参数
    eg:
sh example.sh a b 


 # example.sh #
#!/bin/bash

echo "the  command  is  $0"    // $0 代表命令自己
echo "param1 is  $1"      // $1 代表第一个参数即 a
echo "param2 is $2"       // $2 代表第一个参数即 b

五 常用命令


  1. 行提取命令 grep
选项: 
  -v 反向
  -n 显示行号

grep  “\.$” test.txt -n  // 匹配以 . 结尾的行并显示行号
  1. 列提取命令 cut
cut  -d  “分隔符”  -f  提取列   文件名

more /etc/passwd | grep "/bin/bash" | cut -d ":" -f 1,3
            提取passwd文件中可以登录的用户的用户名和UID

六 条件判断


格式

test  测试条件  测试内容
或
[ 测试条件 测试内容 ] // [] 中必须有空格
  • 测试文件类型
test  -e  文件名       测试文件是否存在,存在为真
test  -f  文件名       判断是否是普通文件
test  -d  文件名       判断是否为目录
test  -b  文件名       判断是否为块设备文件
test  -c  文件名       字符设备文件
  • 测试文件权限
test  -r  文件名       判断是否有可读权限
test  -w  文件名       可写
test  -x  文件名       执行
test  -s  文件名       判断是否为非空白,有内容为真
  • 两个文档比较
[ file1  -nt  file2 ]   file1是否比file2新
[ file1  -ot  file2 ]   file1是否比file2旧
[ file1  -ef  file2  ]  file1与file2是否是链接文件
  • 两个数值之间判断
[ n1  -eq  n2 ]     n1和n2是否相等
[ n1  -ne  n2 ]     n1和n2是否不等
[ n1  -gt  n2 ]     n1大于n2
[ n1  -lt  n2 ]     n1小于n2
[ n1  -ge  n2 ]     n1大于等于n2
[ n1  -le  n2 ]     n1小于等于n2
  • 判断字符串
[ -z  字符串 ]     判断字符串是否为空
[ 字符串1  ==  字符串2 ]  判断字串1 是否与字串2相等
[ 字符串1  !=  字符串2 ]  判断字串是否不等
  • 多重判断
-a      逻辑与
    [ -z $file -a -e $file ]
-o      逻辑或 
!       逻辑非

七 流程控制


  1. if 语句
  • 单分支
if  条件测试命令 
      then   命令序列
fi
  • 双分支
if  条件测试命令
    then   命令序列1
    else   命令序列2
fi
  • 多分支
if  条件测试命令1  ;  then
        命令序列1
    elif  条件测试命令2  ;  then
    命令序列2
    elif  ...
    else
    命令序列n
fi
  1. for 语句
  • 使用in关键字循环
for  变量名  in  取值列表
  do
     命令序列
 done 

eg:
for time in morning noon afternoon evening
   do
      echo $time
  done

files=$(ls)  //遍历 ls 的结果 
for time in $files 
   do
      echo $time
  done
  • 数值加加循环
s=0
for ((i=1;i<=100;i=i+1))
do
    s=$(($s+$i))
done
  • while循环语句
while  命令或表达式
  do
    命令列表
done

相关文章

  • Shell 看完就会用

    一 什么是 Shell shell 直译为壳,shell 是一个命令解释器,处于内核和用户之间,负责把用户的指令传...

  • day 28

    shell编程基础 shell编程一小时光速入门web集群架构会用到shell编程基础 1、为什么要学shell编...

  • day28-Shell脚本基础

    SHELL编程基础 三小时光速入门因为集群架构会用到shell编程基础,提前讲一丢丢。 shell编程 1. 为什...

  • Lancer流程

    Lancer流程 工欲善其事,必先利其器 命令 在Lancer中,会用到很多Shell相关的命令。 shell中的...

  • Python调用Shell命令

    前言:在python程序里面难免会用到shell命令,在python调用shell脚本也不是很难,记录了一下!**...

  • 【看完就会用】pymongo

    pymongo的使用 python3.7版本。 安装 ​ 大部分都从安装开始。 连接数据库 连接上mongo库...

  • shell-14 shell对文件的操作 sed

    shell对文件的操作 一、简介 在shell脚本编写中,时常会用到对文件的相关操作,比如增加内容,修改内容,删除...

  • shell对文件的操作

    shell对文件的操作 简介 sed命令 sed小技巧 一、简介 在shell脚本编写中,时常会用到对文件的相关操...

  • 第二十八天课堂笔记

    老男孩思想: Shell编程3小时光速入门 因为Web集群架构会用到Shell编程基础,提前讲。 跟老男孩学Lin...

  • 看完这篇还不会用Git,那我就哭了!

    你使用过 Git 吗?也许你已经使用了一段时间,但它的许多奥秘仍然令人困惑。 Git 是一个版本控制系统,是任何软...

网友评论

  • 我稀饭猪头:我刚好学完!
    司鑫:@我稀饭猪头 awk 和 cut 功能一样,也是列提取命令吧,功能会比 cut 强大一些

    cut 只能根据某个特定字符去分割,然后取需要的列。

    awk 能实现复杂的逻辑判断,格式如下:
    ```
    awk '条件1{动作1} 条件2{动作2}...' 文件名
    条件:一般使用逻辑表达式作为条件(如果不写则代表不进行任何判断直接执行后面的动作)
    动作:格式化输出或流程控制语句等
    ```
    eg:
    awk 'BEGIN{FS=":"} {printf $1 "\t $3"}' /etc/passwd // 将 /etc/passwd 的内容先按 ':' 分割,然后取第一和第三列 (BEGIN代表在读取文件之前先执行该语句,如何不写 BEGIN 的话,第一行就不会被分割,直接显示会出来
    我稀饭猪头:@Acey wak会吗
    司鑫:@我稀饭猪头 哈哈,我也是最近刚学,然后做了点笔记,可以一起交流:wink:

本文标题:Shell 看完就会用

本文链接:https://www.haomeiwen.com/subject/wcjyzxtx.html