Linux中脚本的使用方法

一、前言

关于Linux中的脚本的用法,一直没有时间去好好地总结,正好今天下雨,就好好的整理一下思路吧,其实精通了一门语言,比如C语言,学习其他语言需要的成本是非常少的,同样的脚本作为一种比较简易的语言,只要知道了语法,我们在通过几个例子好好的理解和掌握一下常规的使用,这样就等于是入门了,之后要想精深的话,其实更应该学习一下Linux中的命令,比如三剑客、文件操作的命令、进程管理的命令、重定向、管道等,这样我们也算是能够登堂入室了,不管是什么语言,最重要的是使用,不用来使用的语言,学习是毫无意义的,过不了多长时间就会忘记的。

二、Linux脚本的使用

  2.1、脚本的运行

脚本可以很简单,其实就是将Linux中的命令配上一定的语法去展现出来,下面我们看一个最简单的脚本,因为笔者是在windows中操作的,安装的Git里面就自带有Linux脚本的运行环境(MinGW64),其实和Linux里面是一样的,所以大家注意区分即可。

name='zyr'
echo 'hello,zyr'

    (1)bash/sh  脚本名.sh  
      其中sh是bash这个程序的软连接,需要找到bash再执行,因此执行的要稍微慢一点,当脚本文件本身没有可执行权限时常使用的方法,使用ll命令可以看到文件权限属性x位为-号;或者脚本文件开头没有指定解释器时需要使用的方法,将重新启动一个子shell(进程)来执行命令。从运行也可以看出来,这个$name根本就不是我们设置的,只是这个系统中已经设置的,说明是重新启动了一个shell(子进程)来完成的,shell脚本执行完后子shell环境随即关闭,然后又回到父shell中。这样也好理解,因为如果凡事都需要shell自身来完成的话,有可能就阻塞了后续的执行了,这是一种折中的方法。


    (2)path/脚本名.sh  
     如果是在当前文件夹下,需要使用 ./脚本名.sh 。使用这种方式需要脚本有执行权限,具体方法为:chmod a+x script-name。然后通过执行脚本绝对路径或者相对路径就可以执行脚本了。在生产环境中,运维人员由于忘记为该脚本设置可执行权限,然后直接使用,导致出错,将重新启动一个子shell(进程)来执行命令。因此,推荐第一种 bash script-name。出乎意料的,我们在没有执行权限的时候竟然运行成功了,这说明了什么,只能说明我们使用的这个MinGw64权限太大了。在Linux环境中就需要修改权限了。同样的也是重新启动了一个子进程。


    (3)source script-name或者 . script-name
     source或者“.”命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或“.”加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令。可以看到我们使用这种命令实现了在本shell中执行该脚本的功能,正确的输出了name。

2.2、脚本规范的写法

在上面我们使用的脚本是不规范的,因为我们没有在开头描写我们要使用什么解释器来解释和执行,因此在正规的场景之中,我们需要写上这些信息,并且使用第一种方式来执行。一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux bash的编程一般为:#!/bin/bash或#!/bin/sh 。
   (1)在Shell中如果一行的第一个字母是#,则是注释,但是写在第一行,则不是脚本注释行,如果写在某个命令之后,则变成注释行。
   (2)sh为bash的软链接,大多数情况下,脚本的开头使用“#!/bin/bash”和“#!/bin/sh”是没有区别的,但更规范的写法是在脚本的开头使用“#!/bin/bash”。

#!/bin/bash
name='zyr' #定义变量
echo 'hello,zyr' #输出字符串

2.3、脚本的语法

   注意事项:

   A1、当变量名被其他字符串混淆的时候,需要加{}

   A2、对变量赋值的时候,在赋值号‘=’的左右不要留下空格

   A3、在使用echo输出的时候,需要使用双引号""才能够将变量转换成数值输出出去,不然将会按照字符串处理。单引号更严格一些,可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。

   2.3.1、分支(判断)语句的用法

   比如我们下面接收用户输入的参数,然后将这些参数显示出来并且对系统变量进行判断的脚本:

 #!/bin/sh

 #提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中
read -t -p "请输入用户名称:" name
#echo -e 处理特殊字符,如换行
echo -e "\n"
echo "用户名为:$name"
#提示“请输入密码”并等待30秒,把用户的输入保存入变量age中,输入内容隐藏
read -t -s -p "请输入用户密码:" pw
echo -e "\n"
echo "用户密码为:$pw"
#提示“请输入性别”并等待30秒,把用户的输入保存入变量sex中,只接受一个字符输入
read -t -n -p "请输入用户性别:" sex
echo -e "\n"
echo "性别为$sex" #注意if的空格以及[]里面的空格
if [ "$SHELL" = "/bin/bash" ];then
echo "SHELL is : $SHELL"
else
echo "login shell is $SHELL"
fi

   可以看到根据脚本的不同命令,shell能够正确的执行并且显示相应的结果,同样的,这里要说一下if语句,在编写shell的时候,如果是在windows里面,我们最好使用sublime来编辑,这样可以很容易的发现出现的错误,比如说if语句,如果不注意空格,那么将会出错,在sublime中是能够看到提示的,如果是在Linux之中,我们就使用vim或者gedit这些都能智能提示的。

  比如说下面的就是错误的,必须有空格才能识别完整,好的编辑器能够事半功倍:

   当然if语句也有其他的写法,比如使用&&和||来表示的,根据我们的需要,再一点点的掌握。

   2.3.2、循环语句的用法

   接下来我们看一下while循环:

 #!/bin/bash

 fileName=zyr.secret
count=`cat $fileName | wc -l`
#下面是一个管道,下面循环读文件中的每一行
cat $fileName |
while read line
do
user=`echo $line|awk -F ':' '{print $1}'`
#代表以 :分段$1就是取第1段
uid=`echo $line|awk -F ':' '{print $3}'`
echo "hello, $user Your UID is $uid"
done
echo "====User_count:$count===="
#前面求得的用户数
zyr::pw23
lsx::pw123
default::pw223

当然也可以使用for语句,比如下面的语句是创建文件夹,并且在文件夹里循环创建文件。

#!/bin/sh
cd /d/LinuxScript
mkdir shell_make
cd shell_make
for ((i=; i<; i++)); do
touch test_zyr_$i.txt
done

   掌握了顺序、分支、循环语句,在任何一个语言之中,我们都能够游刃有余了,这是因为程序最基本的三个元素就是这些语句了,只要我们多加熟悉,掌握其中的精妙之处,注意标点符号、空格、特殊字符的用法,再加上Linux中的一些基本的命令,我们就能很好的使用脚本来完成我们想要做的工作了。

   2.4、Linux之中命令的一些基本技巧

     使用curl抓取网页:

curl www.baidu.com

    抓取并保存文件:

curl -o zyr.baidu www.baidu.com

#!/bin/bash
response=$(curl www.baidu.com)
echo $response

 三、总结

   其实Linux脚本很容易学习,最重要的是多练习,并且有参考资料,可以及时去查阅,总体来说,使用Linux脚本的前提就是要掌握好Linux的命令,特别是那些常用的命令,之后将自己任务中常用的操作设计成脚本,然后使用起来就很方便了。当然还有很多东西都没有讲到,比如case语句,一些基本的符号表示的含义等等,但是这些在使用的时候还是很常用的,我们需要经常练习才行。

Linux中脚本的使用方法的更多相关文章

  1. linux中shell截取字符串方法总结

    截取字符串的方法一共有八种,主要为以下方法 shell中截取字符串的方法有很多中, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=wo ...

  2. Linux中执行 .sh 的方法

    linux下执行.sh文件的方法 .sh文件就是文本文件,如果要执行,需要使用chmod a+x xxx.sh来给可执行权限. 是bash脚本么 可以用touch test.sh #创建test.sh ...

  3. linux中脚本在任意目录执行

    完成了一个脚本,find.sh 如果希望可以再linux系统中任何位置都可以执行该脚本,可以执行下面操作 1. chmod 775 find.sh 给该脚本增加可执行权限 2. export PATH ...

  4. linux中wget的使用方法介绍

    wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能和特点:(1)支持断点下传功能:这一点,也是网络蚂蚁和Fl ...

  5. linux中脚本扑捉(trap)信号问题

    扑捉ctrl+c信号: #!/bin/bash trap ; function trap() { echo "You press Ctrl+C."; echo "Exit ...

  6. linux中sed的使用方法具体解释(对行数据的加入、删除等)

    sed使用语法 [root@fwq test]# sed --help 使用方法: sed [选项]... {脚本(假设没有其它脚本)} [输入文件]... -n, --quiet, --silent ...

  7. linux中安装软件的方法

    1. apt-get 安装方法ubuntu 世界有许多软件源,在系统安装篇已经介绍过如何添加源, apt-get 的基本软件安装命令是: sudo apt-get install 软件名 2. 编译安 ...

  8. Linux中脚本运行错误(坏的解释器:没有那个文件或目录)

    原因: 在Linux中有时候我们将在Windows下编写的脚本拷贝到Linux环境中运行时会出现运行不了的情况. 主要还是Windows的换行符为\r\n,而Linux环境中的换行符号为\n. 解决办 ...

  9. linux中无法使用sudo的方法

    xxx is not in the sudoers file.This incident will be reported.的解决方法 1.切换到root用户下. 2.添加sudo文件的写权限,命令是 ...

随机推荐

  1. SOA与微服务

    SOA 面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署.组合和使用.服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性. SOA是一种 ...

  2. Debian9安装SSH并允许root用户SSH登录

    安装SSH # apt install openssh-server openssh-client 启动SSH服务 # /etc/init.d/ssh start 添加SSH开机启动 # update ...

  3. nginx 反向代理https

    nginx 反向代理https   原来我用vertx创建了一个https apiserver,想着用nginx反向代理一下.证书是阿里云上免费一年的. 后来发现nginx要反向代理https自己也必 ...

  4. MTCNN 实现人脸识别

    MTCNN(Multi-task CNN) MTCNN难点 WIDER FACE等数据集为我们提供的图片并不是MTCNN支持的训练样本, 需要通过几个脚本将其转为MTCNN可以接受的数据集, 这些脚本 ...

  5. Scrum 冲刺博客第三篇

    一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 基本的页面设计 各个页面之间的跳转 背景音乐模块设计 今天计划完成的工作 ...

  6. Mysql工作流程分析

    Mysql工作流程图 工作流程分析 1. 所有的用户连接请求都先发往连接管理器 2. 连接管理器    (1)一直处于侦听状态    (2)用于侦听用户请求 3. 线程管理器    (1)因为每个用户 ...

  7. JAVA练手--集合

    集合框架体系如图所示 Collections:是一个工具类java.util.Collections(可以使用它对集合对象进行操作) Collection:除了map(键值对)其他集合的父类 1. S ...

  8. html之内容解析

    首先我们知道了HTML和css用途,那么今天就来看看HTML的一部分功能和用途. 简单的说HTML就是灵活使用标签,标签就相当于一个网页的骨架,有了这个骨架才能使网页更能区域色彩化. 首先来说HTML ...

  9. wpf 子窗体调用主窗体中函数的实现

    子窗体(Win_Set): MainWindow m;                m = (MainWindow)this.Owner;                m.showText(&qu ...

  10. 个人开源项目之异步Http线程池框架

    项目开源于:https://github.com/HouZhiHouJue/AsyncHttpThreadPool 示意图: