linux shell脚本编程学习总结

0.linux shell脚本编程

对于一些简单的操作,我们可以直接通过在linux 命令行执行就可以了,比如列出文件命令ls -l,但是有时候我们需要完成的任务需要连续执行多条linux命令,而且他们之间具有一定的执行逻辑,这时候直接通过命令行输入就不是一种比较好的办法了。
这时候我们可以利用linux shell的语法,编写脚本,主要的好处有俩点,一方面可以编写复杂的执行逻辑,实现自动化,另一方面通用的脚本可以重复利用,而无需每次都手动编写命令。
开始linux shell编程非常简单,只需新建后缀名为.sh的文本文件第一行加

#!/bin/bash 指定解释器,一般默认就是这个

然后执行

chmod +x test.sh # 给予test.sh可执行的权限
./test.sh        # 执行test.sh 也可以用bash test.sh

1.变量

1.1 变量定义及使用

linux shell变量定义不需要使用美元符,但使用的时候需要,{}可选但一般建议加,用在if判断的时候最好加双引号

a="hello world!"
echo $a
# 如果不加{}就被当$namescript了
name="java"
echo ${name}script
# 这里$str必须加双引号,否则会报错,因为$str为空的时候就变成了 if [ -n ]
if [ -n "$str" ] ;then
    echo "$str为空"
fi 

单引号中的字符会原样输出,变量会失效,而双引号不会
变量也可以接受linux命令的结果,关键是要把命令用反引号包围起来
如将ping的结果赋值给变量

HOSTNAME=abc.com
ping_str=`ping -c 4 ${HOSTNAME}` #-c 指定ping几次

1.2 一些常用特殊变量

$JAVA_HOME # java的环境变量如/usr/local/java/jdk1.8.0
$# #可以表示传入脚本的参数个数,也可以表示传入函数的参数个数
$? 显示最后命令的退出状态,0表示上一条命令执行正确无错误

值得注意的是$?表示的是上一条命令的退出状态,用它可以判断上一条命令执行是否成功,但是当函数中有多条命令的时候,用它无法判断函数是否出错,因为函数中间的语句出错【不影响】脚本会继续执行的时候,只要函数的最后一句没有出错,那么$?就会返回0

2.字符串和数组

2.1 字符串

shell中字符串可以不加引号,如直接

echo hello

也可以使用单引号

echo 'hello'
var="world"
echo 'hello,$var'
# 结果为 hello,$var

当然也可以双引号

echo "hello"
var="world"
echo "hello,$var"
结果为 hello,world

单引号中变量不会被解析,因此单引号不可以输出变量,双引号中可以输出变量
对字符串的常用操作

# 获取字符串长度
str="abcdef"    
${#str} 
# 截取字符串
${str:1:3}
# 查找子字符串位置
index=`expr index $str bc` #注意是反引号

2.2 数组

数组定义

arr=(1 2 3 4 5)
# 或者
arr[0]=1
arr[1]=2
arr[2]=3

对数组的常用操作

#取元素
${arr[0]} # 取第0个元素
${arr[@]} # 取全部元素
#获取数组长度
${#arr[@]}
# 将某些命令返回的结果转为数组
arr=(`fdisk -l | grep -v identifier | grep Disk`)
#遍历数组
for var in ${arr[@]}
do
    echo $var
done

3.运算符

3.1 算术运算符

+ - * / = == !=
= == !=和其他语言没什么区别,关键是+ - * /不大一样,直接a=1+1没什么卵用,通常有三种做法

 var=`expr 1 + 1 ` #注意数字和操作符之间要有空格
 let var='1+1'     # 用let语法 数字和操作符之间不需要空格 不加引号也可以
 var=$((1+2))      # 注意加$

用expr 这种方法时候*要加反斜杠转义

3.2关系运算符

-eq 相等返回true
-gt 前边大返回true -ge 大于等于
-lt 前边小返回true -le 小于等于
关系运算符只支持数字

3.3布尔运算符和逻辑运算符

! 不等
-o 或
-a 与
&& 且
|| 或
使用&&和||的时候,条件要用俩个[],如[condition1] && [condition2] 或者[[ condition1 && condition2 ]]

3.4 shell特有运算符

有关字符串的
-z 字符串长度为0 返回true
-n 字符串长度不为0 返回true
判断相等与不等 可以用==和!=
有关文件的
-f 判断文件是否为普通文件 是返回true
-x 判断文件是否可执行 是返回true
-d 判断文件是否为目录 是返回true
-w 判断文件是否可写 是返回true
-r 判断文件是否可读 是返回true

if [ -n $str ]
then
    echo "str不为空"
fi
# 也可以不用任何运算符
if [ $str ]
then
    "$str不为空"
fi
# 目录不存在则创建
if [ ! -d /usr/local/test ]
then
    mkdir /usr/local/test
fi    

4.函数

函数定义:可以省略function关键字,且参数不必在定义中体现,"#"表示传进来的参数个数,"1"表示第一个参数,"$2"表示第二个参数...

function doSomething(){
      
}

linux shell 的函数只能返回[0-255]的整数值,如果你想返回其他东西,如字符串,不要用return,要用echo,但是要注意,你拿变量接收echo的值的时候会接收你函数中所有echo的值,但很多时候这不是你想要的,所以需要注意。

5.流程控制

5.1 if-else

if [ $num -gt 100 ] && [ $num -lt 1000 ]
then
     echo "num大于100小于1000"
elif [ $num -gt 1000 ]
then
     echo "num大于1000"
else
     echo "小于100"
fi

完整语法如上,也可以像其他语言一样,只用if

if [ $num -eq 100 ]
then
    echo "num等于100"
fi

要注意的是语法与我们常见的不同,then,fi都不要忘
[   条件一   ] 条件不能与放括弧挨着,否则会报错
使用 && 是[   条件一    ] &&
[    条件二    ] 而不是 [    条件一 && 条件二    ]

5.2 for循环和while循环

for循环形式一

for var in 1 2 3 4 5
do
   echo "$var"
done

for循环形式二

for ((i=0;i<$num;i++))
do
    echo "$i"
done

注意形式二中圆括号是俩个,想不懂为什么要这样
while循环形式一

while (($i<5))
do
   echo "$i"
   i=$(($i+1))
done

while循环形式二

while [  condition ]
do
   echo "i am a while circle"
done

注意第一种while循环中变量赋值

6.其他技巧

echo输出太单调?可以先定义几个日志函数,不同级别输出不同的颜色,如最基本的info输出蓝色,错误输出红色

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

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,362评论 0 5
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,718评论 0 10
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • 我以为, 一个人的日子已经习惯。 我以为, 早就厌倦回忆那些不堪。 一场雨, 只是一场秋夜的雨, 便能把思绪敲打得...
    二维蚂蚁阅读 181评论 0 7
  • ****变美、变好、变优秀,等你来关注。**** 关注成长与变好,遇见更豁达更优秀的自己。 ▲文/柯锦川 本文大概...
    柯锦川阅读 894评论 2 8