linux编程入门(三)-编写shell脚本

如果是短的命令我们可以手动输入,但如果命令很长一串串,就需要在shell脚本里执行了,shell脚本的功能非常强大,可以执行顺序,条件,循环语句,还可以定义函数,和编程一样。

基础知识

创建一个shell脚本

  • shell脚本的后缀名为 .sh
  • 脚本的第一行固定为#!/bin/bash,表示用/bin/bash执行这个脚本
  • 脚本用chmod +x获得可执行权限后,可以用./脚本名.sh的方式执行
  • 如果没有可执行权限,可以用sh ./脚本名.sh或bash ./脚本名.sh的方式执行

下面我们来建一个 test.sh,里面内容为

#!/bin/bash

echo "hello dafei"

执行一下看看效果

bash$ sh ./test.sh
hello dafei

bash$ bash ./test.sh
hello dafei

给test.sh加上可执行权限后再执行

bash$ chmod +x test.sh

bash$ ./test.sh
hello dafei

定义一个变量

#定义一个变量,变量的值是一个字符串
STR="this is a string"

echo $STR

运行结果

bash$ bash ./test.sh
# ... 忽略之前的打印,只写出这次新加的
this is a string

把一个命令的结果赋给变量

# 这里把pwd的结果赋给了cur_dir
# 注意pwd是的`符号(〜)那个键括起来的
cur_dir=`pwd`
echo $cur_dir

# 把路径里的'/'换成空格
str=`echo $cur_dir | sed 's/\// /g'`
echo "处理后: $str"

运行结果

bash$ ./test.sh 
/Users/dafei/samples/test_shell
处理后:  Users dafei samples test_shell

用for打印字符串中的单个单词

STR="this is a string"

for i in $STR; do
    echo $i
done

运行结果

bash$ ./test.sh 
this
is
a
string

变量自增

STR="this is a string"

# 先定义一个变量
index=0
for i in $STR; do
    echo "第 $index 个单词是 $i"
    
    #index自增
    index=$(($index+1))  
done

运行结果

bash$ ./test.sh 
第 0 个单词是 this
第 1 个单词是 is
第 2 个单词是 a
第 3 个单词是 string

字符串比较

MODE=debug

if [ "$MODE" == "debug" ]; then
    echo "debug"
else
    echo "release"
fi

运行结果

bash$ ./test.sh 
debug

注意!!!
上面的"$MODE"是用引号括起来的,如果不用引号,
当MODE=的时候,if展开就会变成
if [ == "debug" ]; then
这样就出错了

数字比较

for (( i=-1; i<2; i++ )); do
    if (( $i > 0 )); then
        echo "$i > 0";
    elif (( $i < 0 )); then
        echo "$i < 0";
    elif (( $i == 0 )); then
        echo "$i == 0";
    fi  
done

运行结果

bash$ ./test.sh 
-1 < 0
0 == 0
1 > 0

判断文件是否存在

file_name=a.txt
if test -f "$file_name"; then
    echo "$file_name 存在"
else
    echo "$file_name 不存在"
fi

运行结果

bash$ ./test.sh 
a.txt 不存在

判断文件夹是否存在

dir_name=dir
if test -d "$dir_name"; then
    echo "$dir_name 存在"
else
    echo "$dir_name 不存在"
fi

运行结果

bash$ ./test.sh 
dir 不存在

定义一个函数

# test_func是函数名, 
# 参数用$1,$2的格式获取
# $1表示第1个参数
test_func(){
    echo "call test_func $1 $2"
    return 0
}

# 调用函数
test_func 1, 2
test_func 2, 3

运行结果

bash$ ./test.sh
call test_func 1, 2
call test_func 2, 3

case多条件分支

test_case(){
    case $1 in
    1)  
        echo "$1 该吃饭了"
    ;;  
    2)  
        echo "$1 正在吃饭"
    ;;  
    3)  
        echo "$1 吃完了"
    ;;  
    *)  
        echo "$1 你说啥?"
    ;;  
    esac
}

# 调用函数
test_case 1
test_case 2
test_case 3
test_case 4

运行结果

bash$ ./test.sh
1 该吃饭了
2 正在吃饭
3 吃完了
4 你说啥?

综合练习

下面我们要实现一个装机脚本,比如每次我们装了个新机器的时候,需要安装大量的软件,手动一个一个装也太麻烦了,这时候我们可以定制一个装机脚本,就叫install_ubtuntu.sh吧,shell脚本的后缀名为 .sh。

install_ubuntu.sh脚本的需求是:

  • 脚本执行完成的时候,所有需要的软件都被安装好了
  • 安装的时候,需要显示出被安装的是第几个软件

脚本需要接收的参数:

  • -l 显示所有可安装的软件名列表
  • -y 表示静默安装,不要提示
  • -h 显示该帮助

好,下面我们一步一步实现这个脚本。

  • 新建install_ubuntu.sh脚本文件
bash$ touch install_ubuntu.sh
  • 用vim编辑install_ubuntu.sh,写入内容:
#!/bin/bash        #这行指出用bash执行该文件

echo "hello dafei";
  • 用chmod给install_ubuntu.sh一个可执行权限
bash$ chmod +x install_ubuntu.sh
  • 运行一下,看看效果
bash$ ./install_ubuntu.sh
hello dafei

# 当脚本没有可执行权限时候,也可以指定用sh执行脚本
bash$ sh ./install_ubuntu.sh
hello dafei

或者用bash执行
bash$ bash ./install_ubuntu.sh
hello dafei
  • 获取参数的个数,和参数列表
#!/bin/bash

#下面两行是取参数个数和参数列表,类似于c语言里的int main(int argc, char** argv)
ARGC=$#
ARGV=$@

echo "共有 $ARGC 个参数"
echo "参数列表是: $ARGV"
  • 下面是完整的脚本,代码很简单,主要是看一下shell的格式
#!/bin/bash

#需要安装的软件列表,各软件名之间用空隔隔开
SOFT_LIST="vim"
SOFT_LIST+=" gcc"
SOFT_LIST+=" g++"
SOFT_LIST+=" gdb"

#下面两行是取参数个数和参数列表,类似于c语言里的int main(int argc, char** argv)
ARGC=$#

# 如果没有参数,默认显示帮助,然后退出脚本
if (( $ARGC < 1 )); then
    help="请输入运行参数:"
    help+="\n-l 显示所有可安装的软件名列表"
    help+="\n-y 表示静默安装,不要提示"
    help+="\n-h 显示该帮助"
    echo -e $help
    exit -1
fi

ARGV=$@
echo "共 $ARGC 个参数,参数列表是: $ARGV"

#挨个打印出参数
index=1
is_silence=false
for arg in $ARGV; do
    echo "第 $index 个参数是: $arg"
    index=$(($index+1))

    # 比如参数是否为-y,如果是
    if [ "$arg" == "-y" ]; then
        is_silence=true
    fi
done

index=1
for soft in $SOFT_LIST; do
    echo "准备安装第 $index 个软件 $soft"

    if $is_silence; then
        # sudo apt install $soft -y
        # 这里因为是测试,所以只echo一下命令
        echo "sudo apt install $soft -y"
    else
        echo "sudo apt install $soft"
    fi

    index=$(($index+1))
done

运行一下看看效果

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

推荐阅读更多精彩内容

  • Linux习惯问题: 在vim编辑时,按了ctrl + s后,再按ctrl + q就可以继续执行了。ctrl + ...
    光着脚的鞋阅读 4,515评论 0 16
  • 第 2 章 SHELL 基础知识2.1 shell脚本我们在上面简单介绍了一下什么是shell脚本,现在我们来进一...
    LiWei_9e4b阅读 1,574评论 0 0
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,746评论 0 10
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,392评论 0 5
  • 什么是Shell     简单来说Shell其实就是一个命令解释器,而它的作用就是解释并执行用户输入的命令及程序。...
    Surpassme阅读 2,719评论 1 24