Linux下的shell命令笔记

shell

Shell 是一种脚本语言,不同于 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。
这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。而 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。
这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。
编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。
脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。
Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。

笔录

shell脚本第一行必须以 #!开头,它表示该脚本使用后面的解释器解释执行
介绍下常用的linux命令

  • 创建文件touch命令:touch 文件名
touch  01.sh
  • 查看文件里面的内容cat
cat  01.sh
  • 变更文件权限chmod
chmod 777 01.sh
  • 查看文件夹下的所有内容ls
ls //查看所有文件
ls -al //查看所有文件,并且显示文件权限信息等相关信息
vim  01.sh //打开一个文件

然后点击键盘的insert按键,进入编辑模式
退出按ESC,然后再按Shift+;
最后输入wq 保存退出

  • echo 输出内容
echo "linux"

shell的if条件语句

#!/bin/bash 类似引入头文件,必须引用

  • 02.sh脚本代码:
#!/bin/bash
myDir=/usr/bin    #myDir就是一个定义的变量

if [ -w $myDir ] && [ -d $HOME ]
then
        touch test6
        echo "dir is exist"
        cd $myDir
else
        echo "dir is not exist"
fi      #fi 表示结束条件语句

上面的脚本:判断/usr/bin是否可写,并且是判断home目录是存在,存在创建test6
关于代码中的-w和-d 以及相关命令:
-d 检查是否存在,并且是一个目录
-e 检查file是否存在
-f 检查是否存在,并且是一个文件
-r 检查是否存在 可读
-w 检查文件是否可写
-x 是否可执行

  • 执行
./02.sh

./ 跟上脚本文件,就可以直接执行

  • 结果


    image.png

case in语句

case in语句 相当于Java的switch语句

  • 脚本03.sh 文件
#!/bin/bash
testUser=$1
case $testUser in
rose)
        echo "jason";;
david)
        echo "david";;
*)
        echo "not user";;
esac

上面脚本表示传入的参数是否匹配到case中的字符串,有打印相应的,没有打出默认“not user”

*) 表示默认的条件,相遇Java的switch中的default
;; 这两个连续的分号不能漏,语法要求

  • 执行:代码中的$1 表示的是像脚本传参数,如下:rose就是传的参数
./03.sh rose
  • 结果


    image.png

for语句

  • 01.sh代码:
#!/bin/bash
echo "参数 $1"
echo "参数 $2"
echo "参数长度$#"
for param in "$@"
do
    echo "param:$param"
done    #done 表示结束循环

上面的代码根据传入的参数进行遍历输出

  1. $1$2 根据传入的顺序获取,以此类推,$1到N
  2. $# 表示的是参数的数量
  3. $@ 表示的是所有参数的集合
  • 执行
./01.sh  11  22   # 11和22 分别对应$1 和$2
  • 结果


    for语句.png

数组

  • 默认的空格分隔定义
    脚本文件中数组的表示list="Mother Father Brother" 中间采用空格分开,linux系统默认识别空格为分隔符
#!/bin/bash
list="Mother Father Brother"
for item in $list
do
        echo $item
done
  • 采用分隔符定义
#!/bin/bash
list="Mother,Father,Brother"
IFS=$,
for item in $list
do
    echo $item
done

将IFS设置为逗号,便于做list的分隔符
执行:./04.sh
输出:


image.png

while 语句

while语句类似Java的while

#!/bin/bash
a=10
while [ $a -gt 0 ]
do
    a=$[ $a - 1]
    echo "a:$a"
    if [ $a -eq 5 ]
    then
    echo "跳出循环"
    break
    fi

done

break 左右是跳出循环

运算符 说明
-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否不相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。

执行: ./05.sh
结果:


image.png

grep 查找命令

  • 06.sh 脚本代码:
#!/bin/bash
file=test6
testUser=jason
if grep $testUser /etc/passwd
then
    echo "ok"
fi

上面代码中:
$testUser 查找的内容
/etc/passwd 文件的路径 文件内容里面去找

执行:./06.sh
结果:


image.png

在当前例子中使用到 grep查找命令, 如:grep -n bin 01.sh
常用的 grep 选项有:
-c 只输出匹配行的个数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
-V 显示软件版本信息
使用grep匹配时最好用双引号引起来,防止被系统误认为参数或者特殊命令,也可以匹配多个单词。
关于匹配的实例:
grep -c "48" test.txt 统计所有以“48”字符开头的行有多少
grep -i "May" test.txt 不区分大小写查找“May”所有的行)
grep -n "48" test.txt 显示行号;显示匹配字符“48”的行及行号,相同于 nl test.txt |grep 48)
grep -v "48" test.txt 显示输出没有字符“48”所有的行)
grep "471" test.txt 显示输出字符“471”所在的行)
grep "48;" test.txt 显示输出以字符“48”开头,并在字符“48”后是一个tab键所在的行
grep "48[34]" test.txt 显示输出以字符“48”开头,第三个字符是“3”或是“4”的所有的行)
grep "[48]" test.txt 显示输出行首不是字符“48”的行)
grep "[Mm]ay" test.txt 设置大小写查找:显示输出第一个字符以“M”或“m”开头,以字符“ay”结束的行)
grep "K…D" test.txt 显示输出第一个字符是“K”,第二、三、四是任意字符,第五个字符是“D”所在的行)
grep "[A-Z][9]D" test.txt 显示输出第一个字符的范围是“A-D”,第二个字符是“9”,第三个字符的是“D”的所有的行
grep "[35]..1998" test.txt 显示第一个字符是3或5,第二三个字符是任意,以1998结尾的所有行
grep "4{2,}" test.txt 模式出现几率查找:显示输出字符“4”至少重复出现两次的所有行
grep "9{3,}" test.txt 模式出现几率查找:显示输出字符“9”至少重复出现三次的所有行
grep "9{2,3}" test.txt 模式出现几率查找:显示输出字符“9”重复出现的次数在一定范围内,重复出现2次或3次所有行
grep -n "^$" test.txt 显示输出空行的行号
ls -l |grep "^d" 如果要查询目录列表中的目录 同:ls -d *
ls -l |grep "^d[d]" 在一个目录中查询不包含目录的所有文件
ls -l |grpe "^d…..x..x" 查询其他用户和用户组成员有可执行权限的目录集合

输出到文件中

#!/bin/bash
file=test6
echo "david">$file
echo "tim">>$file

执行完代码之后会找到test6的文件,打开可以看到

david
tim

结束

暂时先将笔记做到这边,后续有新的再来更新,如果上面的有错误,欢迎指出。

参考

https://www.runoob.com/linux/linux-shell.html
http://c.biancheng.net/view/2767.html

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