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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

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