Shell入门指南

昨天在往github上面push东西的时候,突然感觉我真是太蠢了,一个学计算机的,居然没有想到把三个命令集成在一个shell脚本里面。通过传入俩个参数,一个文件名,一个关于的递交的信息,这样不就一条命令就好了,还省了很多的事。但是准备写的时候,发现不怎么会使用shell编程,所以查阅了一些资料,决定写一篇关于shell编程的文章吧。这样,即使以后我忘记了,也可以方便查阅。最后,这篇文章是为了那些不会shell,或者不这么熟悉shell的同学,方便以后批处理文件,或者其他的事情。

介绍shell脚本

简单的说shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。通常shell脚本以.sh为后缀。在编写shell时,第一行一定要指明系统需要哪种shell解释用户的shell程序,如:#!/bin/sh(Bourne Shell),#!/bin/bash(Bourne Again Shell),#!/bin/csh(C Shell),#!/bin/ksh(K Shell)等等。

不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。下面的run.sh则指明使用bash执行。

#!bin/bash
ls -l

通常,shell脚本会以#!/bin/sh作为默认的shell程序。执行shell的方式有两种:第一种是通过sh命令执行shell脚本,第二种是为shell脚本加上可执行权限并执行,例如执行当前目录下的run.sh脚本,命令如下:

1.通过sh命令执行shell脚本

sh run.sh

2.为shell脚本直接加上可执行权限并执行

chmod +x run.sh
./run.sh
chmod [who] operator [permission] filename

who的含义是:
u 文件属主权限。
g 同组用户权限。
o 其他用户权限。
a 所有用户(文件属主、同组用户及其他用户)。

operator的含义:
+ 增加权限。
- 取消权限。
= 设定权限。

permission的含义:
r 读权限。
w 写权限。
x 执行权限。
s 文件属主和组s e t - I D。
l 给文件加锁,使其他用户无法访问。


文 件 属 主 同 组 用 户 其 他 用 户
r w x r w x r w x
4 + 2 + 1 4 + 2 + 1 4 + 2 + 1

shell 使用

参数传递

$xxx 表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。
例:显示文件的内容123 456.txt

#!bin/bash
cat "$1"

有人可能会问,为什么要加",因为不加的话,执行指令时会解析成cat 123 456.txt而不是cat 123\ 456.txt,所以如果参数中有空格,就加上"吧。

#!/bin/sh
#print hello world in the console window
a = "world"
echo "hello, $a"    #输出    :hello world
echo "hello, $as"   #希望输出:hello worlds

echo "Hello, $as" 就不会输出“hello, worlds”,而是输出“hello, ”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:
echo "Hi, ${a}s"

基本控制语句

# if语句和其他编程语言相似,都是流程控制语句
if …; then
…
elif …; then
…
else
…
fi

# 在循环中,也可以使用类似C语言中的break和continue语句中断当前的循环操作。
for var in …; do
…
done

常用条件测试

[ -f "$file"     ] 判断$file是否是一个文件
[ $a -lt 3       ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于
[ -x "$file"     ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性
[ -n "$a"        ] 判断变量$a是否有值,测试空串用-z
[ "$a" = "$b"    ] 判断$a和$b的取值是否相等
[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

截取文件名信息

#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
basename 和 dirname

例如:
1、${var##*/}
该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。

#!bin/bash
var = /dir1/dir2/file.txt
echo ${var##*/}
# echo 输出到屏幕
# 输出:file.txt

2、${var%%.*}
该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。

#!bin/bash
var = /dir1/dir2/file.txt
echo ${var%%.*}
# 输出:/dir1/dir2/file

basename
该命令的作用是从路径中提取出文件名,使用方法为basename NAME

dirname
该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME

这俩条命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录。

#!bin/bash
var = /dir1/dir2/file.txt

echo basename $var
# 输出:file.txt

echo dirname $var
#输出:/dir1/dir2

获取某目录下所有文件夹的名称

#!/bin/bash
for dir in $(ls .)
do
    [ -d $dir ] && echo $dir
done 

注释,管道,重定向

1.shell脚本和其它编程语言一样,也拥有注释。注释方法为在注释行前加#号。

#!/bin/sh  
#Filename: comment.sh  

2.管道的作用是在一个命令的标准输出和另一个命令的标准输入之间建立一个通道。例如下面命令就是将ps -aux的标准输出传递给grep作为输入。

#!/bin/sh 
ps -aux | grep httpd

3.输入重定向使用小于号“<”可以实现。输出重定向有两种方式,一种是直接输出,使用一个大于号“>”实现;另一种是以附加的方式输出,使用两个大于号“>>”实现。前者会覆盖原始的输出内容,而后者会添加到文件最后。

#!/bin/sh 
cat < dir.txt   # cat命令重定向到dir.txt文件

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

推荐阅读更多精彩内容