Shell脚本编程(一)

1. 前言

前面我们学习了Linux相关的命令,接下来我们将进入真正的主题——shell脚步编程。

2. 直接执行命令

首先创建一个shell文件并用Vim编辑器打开

vim 01.sh

这时候已经进入命令模式,键盘点击i进入编辑模式,我们简单的输出当前时间和当前用户:

#!/bin/bash                                                                       
date
who

第一行表示这是Shell中的bash,即Bourne Again Shell,Shell中的一种。我们按Esc退出编辑模式进入命令模式,再按shift + z z退出命令模式,这时候没有执行的权限,我们需要授予其执行的权限

chmod u+x 01.sh

最后命令行输入

./01.sh

执行后的结果为:

Thu Dec 21 18:07:25 CST 2017
root     pts/0        2017-12-21 16:27 (111.196.87.96)

3. 创建变量

#!/bin/bash                                                                                                                                                                                                  
n=10
s="I Love You"
echo $n
echo $s

这里的n和s都是变量,echo是输出命令,但是可以引号内部有空格,如果s=I Love You就会出错,因为中间有空格。此例输出结果为:

10
I Love You

还可以这样进行拼接

echo "$s very much"

输出结果为:

I Love You very much

这时候,有人就要问了,那我要怎样输出符号呢?其实很简单,只需要加上转义字符\,比如我们要输出s,就可以这样:

echo "\$s"

4. 将命令的结果作为变量的值

curTime=`date`
echo $curTime

其中**是键盘左上方波浪线下面的字符,**是键盘左上方波浪线下面的字符,``表示内部是命令,此例是将date命令的结果作为变量curTime的值了,输出结果为:

Thu Dec 21 19:44:51 CST 2017

除了这种做法,还可以:

curTime=$(date)
echo $curTime

输出结果是完全一样的。

5. 输出重定向

将ls -la命令生成的结果输出到text文件中

ls -la > text

输入重定向

wc < text

将text文本中的内容输入,wc命令是输出文本的行数、单词数、字节数。

6. 数学运算

1. 基本整数运算

a=10
b=40
c=$(expr $b / $a)
echo "c=$c"

输出结果为:

c=4

其中expr命令表示此处是数学运算,expr只能进行整数运算。此处的还可以这样表示:

d=$[$b / $a]

结果是一样的。

2. 浮点数运算

由于expr只支持整数运算,对于浮点数运算,我们需要用到bc命令

e=$(echo "scale=4; $a / $b" | bc)
echo "e=$e"

这里bc是bc命令,scale是自带的内建变量,表示精确到小数点后几位,|是管道的意思,前面命令的输出结果作为后面命令的输入,此处命令行输出结果为:.2500

7. 内联输入重定向

f=$(bc << EOF
scale=4
temp=($a * $b)
temp / 4
EOF
)
echo "f=$f"

输出结果为:100.0000

8. 命令执行退出的状态

0        成功
127   没有找到命令
1       未知错误
126  命令不可执行

查看上一次命令的执行状态

echo $?

在shell脚步中,自己指定退出的状态

exit 状态码

只有if命令的退出状态码为0,才会执行then部分

if  命令
then 
    命令
fi

举个例子:

#!/bin/bash                                                                                                                                                            
testuser=zhangpan
if grep $testuser /usr
then
   echo "ok"
ls -a /usr/$testuser/
elif ls -d /usr/$testuser/
then
   echo "主目录存在"
else
   echo "$testuser not exist"
fi

9. test数值比较

test命令的复杂写法:

#!/bin/bash                                                                                                                                                            
#test命令,如果条件成立,test命令以状态为0退出,if条件成立
if test $var
then
echo "test条件成立"
else
echo "test条件不成立"
fi

test命令的简单写法:

#!/bin/bash                                                                                                                                                            
a=10
b=5
#test命令的简单写法[]
if [ $a -gt $b ]
then
   echo "$a more than $b"
else
   echo "$a smaller than $b"
fi

10. test字符串比较

11.test文件比较

#!/bin/bash                                                                                                                                                            
mydir=/usr/zhangpan
#-d检查目录是否存在
if [ -d $mydir ]
then
   echo "$mydir exist"
   ls $mydir
else
   echo "$mydir not exist"
fi

[ -d mydir ] :检查/usr/zhangpan目录是否存在,lsmydir :将/usr/zhangpan目录中的文件全部展示到控制台,当然也可以先转到目录下,再展示:

cd $mydir
ls

其他的有关命令:

-d filename:如果filename为目录,则为真
-e filename:如果filename存在,则为真
-f filename:如果filename为常规文件,则为真
-r filename:如果filename可读,则为真
-w filename:如果filename可写,则为真
-x filename:如果filename可执行,则为真

12.多个条件

多个条件并列:

[] && []

例如:

#!/bin/bash                                                                                                                                                            
#多个条件
mydir=/usr/zhangpan
if [ -d $HOME ] && [ -w $mydir ]
then
   cd $mydir
   touch text.c
else
   echo "no such file"
fi

13.任意数学表达式或赋值

任意数学表达式或赋值用双小括号

((数学表达式或赋值语句))

case命令

#!/bin/bash                                                                                                                                                            
testusr=zhangpan
case $testusr in
jack)
   echo "$testusr is exist";;
zhangpan)
   echo "$testusr is exist";;
*)
   echo "no usr is exist";;
esac

这个命令相信不用我做过多的介绍,大家就能明白其中的含义。
case命令的基本模式如下:

case var in
pattern1) 命令1;;
pattern2) 命令2;;
*) 默认命令;;
esac

for循环

#!/bin/bash                                                                                                                                                            
for item in Teacher Student Master
do
   echo $item
done

for命令的基本模式如下:

for var in list
do
  命令
done

如果集合中的元素有单引号或者双引号,可用转义符号进行转换,如双引号转义:

for item in Teacher\"s Student Master

集合可用list变量表示:

#!/bin/bash                                                                                                                                                            
list="Teacher Student Master"
for item in $list
do
  echo $item
done

上面集合的分隔符是空格,如果是逗号的话,需要用IFS字段分隔符:

#!/bin/bash                                                                                                                                                            
list="Teacher,Student,Master"
IFS=$,
for item in $list
do
  echo $item
done

while循环

#!/bin/bash                                                                                                                                                            
a=10
while [ $a -gt 5 ]
do
  echo "$a"
  a=$[ $a - 1 ]
done

循环打印出10大于5的数,while循环的基本模式如下:

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

推荐阅读更多精彩内容

  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 8,010评论 1 19
  • 基础 头文件 #!/bin/bash 或者#!/bin/sh #!约定的标记,如IOS的Import 执行文件时需...
    ZMJun阅读 1,219评论 1 2
  • 一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工...
    架构师小秘圈阅读 8,714评论 3 70
  • 许久不见的S小姐冷不丁给我发了条微信 “我要离开了,该不该和那个人说一声?” 我说:说你妹,你以为你在他眼里是个什...
    小山蕉阅读 415评论 0 0
  • 在朋友圈里进行运动打卡今天已经进行到第100天了。虽然不是什么大事,虽然这期间也停顿过,但还是挺值得纪念的。 曾经...
    木槿Sophia阅读 158评论 0 0