Shell 看完就会用

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概述 1.Shell是什么 Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送...
    littlexjing阅读 2,016评论 0 1
  • 概述 首先,咱们来了解一下,什么是Shell。操作系统内核给我们提供了各种接口,同时也提供了各种用户层的库,理论上...
    keysaim阅读 1,463评论 0 0
  • 一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工...
    架构师小秘圈阅读 8,746评论 3 70
  • 一、什么是Shell脚本 示例 看个例子吧: 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 ...
    Rick617阅读 822评论 0 1
  • 细雨如烟满青城, 行人匆匆欲赶集。 不知西北天尚好, 思心飘去荡无存。
    昙花终有一现阅读 367评论 0 0