linux脚本编程(shell)浅介 (转载)

linux脚本(shell)编程

 啊,昨天上网看到一篇讲 linux/unix shell 的文章,想想自己最后写这东西也是一年前的事了,想想都快忘光了。

 还是整理一下,做一次回顾,以后说不定还用得上;帖出来,方便第一次学习这东西的同道中人。

 如果发现有错误的地方,请指出,留一句即可,我会感激的。废话少说了!!!

 linux 下最重要的脚本语言算是 bash 了,我也就写点这个吧(我也只会这个:))。跟其他开发语言(如C)比,bash 是比较简单的一种语言,主要用于写一些脚本代码,一些批处理或安装程序。你可以看看在/etc/init.d/目录下,那里就有很多用来控制各个服务的脚 本文件。

 先看一个“hello world!”的例子:
 在某个目录下新建一个文件,叫hello.sh,敲入以下代码:

#!/bin/sh
echo "hello world!"

 好,就这些。保存,在命令提示符下进入保存“hello.sh”的目录,这样执行:
 
#sh hello.sh(回车)
 看到了吧?哈哈,不过你高兴的不要太早了,只并不能说明什么,就象你在其他编程环境中做的“hello world.”一样,离高手的距离还远着呢。

 我们先看看bash脚本中变量的使用。
 修改上面的“hello world!”的例子,改成下面的样子:

#!/bin/bash
# This is a very simple example
str="hello world!"
echo $str

 保存后按照上面的方法执行该脚本,你将看到和以前一样的效果。我们看看每一句的意义:
 第 一行,#! 是说明 hello.sh 这个文件的类型的,有点类似 Windows 系统下用文件后缀来表示不同文件类型的意思。Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型。在 BASH 中 第一行的 "#!" 及后面的 "/bin/bash" 就表明该文件是一个 BASH 程序,需要由 /bin 目录下的 bash 程序来解释执行。BASH 这个程序一般是存放在 /bin 目录下。这一行的写法是固定的。
 第二行的 "# This is a ..." 就是 BASH 程序的注释,在 BASH 程序中从“#”号(没有“!”号)开始到行尾的部分均被看作是程序的注释,相当于C/C++语言中的“//”。
 第三行是为一个名称为 str 的变量赋值。
 第四行的 echo 语句的功能是把 echo 后面的字符串或变量的内容输出到标准输出中去。需要注意的是 BASH 中的绝大多数语句结尾处都没有分号。

 对 于第三行,可能有人会问:在C/C++中,变量都属于某个类型,在这变量 str 的类型是什么呢?在 BASH 中变量定义是不需要的,没有 "int i" 这样的定义过程。如果想用一个变量,只要他没有在前面被定义过,就直接可以用,当然你使用该变量的第一条语句应该是对他赋初值了,如果你不赋初值也没关 系,只不过该变量是空( 注意:是 NULL,不是 0 )。

 关于变量的使用,要注意以下几点:
 一,变量赋值时,“=”左右两边都不能有空格;
 二,BASH 中的语句结尾不需要分号(";");
 三,除了在变量赋值和在FOR循环语句头中,BASH 中的变量使用必须在变量前加"$"符号。

 在比较详细的 bash 文档中,会规定使用变量要采用这样的形式:${STR},如果你的脚本出了莫名其妙的错误,不妨看看是不是这个问题造成的。

 BASH 中的变量既然不需要定义,也就没有类型一说,那是不是一个变量既可以存放整数,也可以存放字符串呢?对!
 一个变量即可以被定义为一个字符串,也可以被再定义为整数。如果对该变量进行整数运算,他就被解释为整数;如果对他进行字符串操作,他就被看作为一个字符串。请看下面的例子:

#!/bin/bash
x=2006
let "x = $x + 1"
echo $x
x="a string."
echo $x

 执行一下看看?

 又 出现了新的关键字:let。关于整数变量计算,有如下几种:" + - * / % ",他们的意思和字面意思相同,在*和/之前必须冠以反斜线,已防被SHELL先行解释。整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let "x = $x + 1" 或者 x=`expr $x + 1`


 关于运行时参数,我们在执行脚本时有时很想传个参数进去,如:#sh mysh.sh hdz(回车)好,很简单,在 bash 中,使用这样传进来的变量时也要在前面加“$”符号。

$# 传入脚本的命令行参数个数;

$* 所有命令行参数值,在各个参数值之间留有空格;

位置变元

$0 命令本身(shell文件名)

$1 第一个命令行参数;

$2 第二个命令行参数;

...

 好,编辑以下脚本:
#!/bin/sh

echo "number of vars:"$#

echo "values of vars:"$*

echo "value of var1:"$1
echo "value of var2:"$2
echo "value of var3:"$3
echo "value of var4:"$4

 保存文件名为 my.sh,执行时传入参数:#sh my.sh a b c d e(回车),看到结果你就会更清楚各个变量的意思。如果访问的参数在执行时没有传入,如有一条这样的代码:
 echo "value of var4:"$100

 而在执行时并没有输入100个参数,那取得的值为 NULL。

在 BASH 程序中如果一个变量被使用了,那么直到该程序的结尾,该变量都一直有效。为了使得某个变量存在于一个局部程序块中,就引入了局部变量的概念。BASH 中,在变量首次被赋初值时加上 local 关键字就可以声明一个局部变量,如下面这个例子:

#!/bin/bash
HELLO="var1"
echo $HELLO
function hello {
  local HELLO="var2"
  echo $HELLO
}

echo $HELLO

该程序的执行结果是:

var1
var2
var1

这个执行结果表明全局变量 $HELLO 的值在执行函数 hello 时并没有被改变。也就是说局部变量 $HELLO 的影响只存在于函数那个程序块中。

BASH 中的变量与 C 语言中变量的区别
    这里我们为原来不熟悉 BASH 编程,但是非常熟悉 C 语言的程序员总结一下在 BASH 环境中使用变量需要注意的问题。

        1,BASH 中的变量在引用时都需要在变量前加上 "$" 符号( 第一次赋值及在For循环的头部不用加 "$"符号 );
        2,BASH 中没有浮点运算,因此也就没有浮点类型的变量可用;
        3,BASH 中的整形变量的比较符号与 C 语言中完全不同,而且整形变量的算术运算也需要经过 let 或 expr 语句来处理;

 下面我们来看看变量之间的比较操作:
 在比较操作上,整数变量和字符串变量各不相同,详见下表:

对应的操作   整数操作 字符串操作
相同          -eq         =
不同          -ne        !=
大于          -gt         >
小于          -lt         <
大于或等于    -ge
小于或等于    -le
为空                      -z
不为空                    -n


比如:
 比较整数 a 和 b 是否相等就写做  if [ $a = $b ]
 判断整数 a 是否大于整数 b 就写做  if [ $a -gt $b ]
 比较字符串 a 和 b 是否相等就写作:if [ $a = $b ]
 判断字符串 a 是否为空就写作: if [ -z $a ]
 判断整数变量 a 是否大于 b 就写作:if [ $a -gt $b ]

注意:在“[”和“]”符号的左右都留有空格。

 BASH 是 Linux 操作系统的 Shell,因此系统的文件必然是 BASH 需要操作的重要对象
运算符,下面说说对文件的操作:

含义( 满足下面要求时返回 TRUE )

-e  文件已经存在
-f  文件是普通文件
-s  文件大小不为零
-d  文件是一个目录
-r  文件对当前用户可以读取
-w  文件对当前用户可以写入
-x  文件对当前用户可以执行
-g  文件的 GID 标志被设置
-u  文件的 UID 标志被设置
-O  文件是属于当前用户的
-G  文件的组 ID 和当前用户相同
file1 -nt file2 文件 file1 比 file2 更新
file1 -ot file2 文件 file1 比 file2 更老

如 if [ -x /root ] 可以用于判断 /root 目录是否可以被当前用户进入。


 上面有进行比较的 if 关键字,是的,bash 中有和 C 语言相似的流程控制语句,主要有:if、for、while、until、case 等语句。下面较详细的介绍一下。
 if 语句用于判断和分支,其语法规则和 C 语言的 if 非常相似。其几种基本结构为:

if [ expression ]
then
  #code block
fi

或者

if [ expression ]
then
  #code block
else
  #code block
fi

或者

if [ expression ]
then
  #code block
else if [ expression ]
  then
    #code block
  else
    #code block
fi

或者

if [ expression ]
then
  #code block
elif [ expression ]
  then
    #code block
  else
    #code block
fi

 如 果您为了简洁,想把 then 和 if 放在一行,那就要这样写了:if [ expression ]; then。即在 then 前加一个“;”号(bash 里面每行的结束处没有分号,那要把两行的内容写到一行,是不是要用“;”号隔开啊?哈哈,对!这样说来,“if [ expression ]; then”只是把两行内容写到了一行,没有什么新的东西。)。

for 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是:

for $var in [list]
do
  #code block
done

其 中 $var 是循环控制变量,[list] 是 var 需要遍历的一个集合,do/done 对包含了循环体,相当于 C 语言中的一对大括号。另外如果do 和 for 被写在同一行,必须在 do 前面加上 ";"。如: for $var in [list]; do 。下面是一个运用 for 进行循环的例子:

#!/bin/bash

for day in Sun Mon Tue Wed Thu Fri Sat
do
  echo $day
done

# 如果列表被包含在一对双引号中,则被认为是一个元素
for day in "Sun Mon Tue Wed Thu Fri Sat"
do
  echo $day
done

exit 0

    注意上面的例子中,在 for 所在那行的变量 day 是没有加 "$" 符号的,而在循环体内,echo 所在行变量 $day 是必须加上 "$" 符号的。另外如果写成 for day 而没有后面的 in [list] 部分,则 day 将取遍命令行的所有参数。如这个程序:

#!/bin/bash

for param
do
  echo $param
done

exit 0

    上面这个程序将列出所有命令行参数。for 循环结构的循环体被包含在 do/done 对中,这也是后面的 while、until 循环所具有的特点。

while 循环的基本结构是:

while [ condition ]
do
  #code block
done

这个结构请大家自己编写一个例子来验证。

until 循环的基本结构是:

until [ condition is TRUE ]
do
  #code block
done

这个结构也请大家自己编写一个例子来验证。

case
BASH 中的 case 结构与 C 语言中的 switch 语句的功能比较类似,可以用于进行多项分支控制。其基本结构是:

case "$var" in
 condition1 )
  ;;
 condition2 )
  ;;
 * )
  default statments;;
esac

下面这个程序是运用 case 结构进行分支执行的例子:

#!/bin/bash

echo "Hit a key, then hit return."
read Keypress

case "$Keypress" in
 [a-z] ) echo "Lowercase letter";;
 [A-Z] ) echo "Uppercase letter";;
 [0-9] ) echo "Digit";;
 * ) echo "Punctuation, whitespace, or other";;
esac

exit 0

    上面例子中的第四行 "read Keypress" 一句中的 read 语句表示从键盘上读取输入。这个命令将在本讲义的 BASH 的其他高级问题中讲解。

break/continue
    熟悉 C 语言编程的都很熟悉 break 语句和 continue 语句。BASH 中同样有这两条语句,而且作用和用法也和 C 语言中相同,break 语句可以让程序流程从当前循环体中完全跳出,而 continue 语句可以跳过当次循环的剩余部分并直接进入下一次循环。

 
关于bash在控制台下的快捷键

ctrl+u 删除光标以前的所有字符
ctrl+d 删除光标以前的一个字符
ctrl+k 删除光标以后的所有字符
ctrl+h 删除光标以后的一个字符
ctrl+t 调换光标前两个字符的次序
ctrl+a 移动光标到最前面
ctrl+e 移动光标到最后面
ctrl+p 上一个命令
ctrl+n 下一个命令
ctrl+s 锁定输入
ctrl+q 解除锁定
ctrl+f 移动光标到后一个字符
ctrl+b 移动光标到前一个字符
ctrl+x 标记一个位置
ctrl+c 清除当前的输入

 

 

原文链接

http://blog.csdn.net/compiler_hdz/article/details/575113

转载于:https://www.cnblogs.com/hdu-2010/p/4536429.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postman插件下载安装教程(详细)

一、前言 postman是一款强大网页接口调试工具&#xff0c;我们在平时开发过程中经常会使用到&#xff0c;一般使用最多的是postman的客户端&#xff0c;实际上postman在谷歌浏览器上也提供了插件&#xff0c;可以不必要安装客户端进行接口测试工作。 建议更新到最新谷歌浏览器&…

java显示星期几_Java 使用日历显示星期几

import java.util.Calendar;/*nowjava.com 提 供*/public class Main {public static void main(String[] args) {//create Calendar instanceCalendar now Calendar.getInstance();System.out.println("Current date : " (now.get(Calendar.MONTH) 1) "-&qu…

SharePoint 2013 workflow cannot start automatically when you logged in site as a system account

I have created one simple workflow on custom list using SharePoint designer 2013.While designing workflow, I have unchecked the “Allow this workflow to be manually started” and select rest two options like “Start workflow automatically when an item is c…

10个 IDEA 插件来解放你的双手

不知道喜欢IDEA的你装了没有? 1、GenerateAllSetter 实际的开发中,可能会经常为某个对象中多个属性进行 set 赋值,尽管可以用BeanUtil.copyProperties()方式批量赋值,但这种方式有一些弊端,存在属性值覆盖的问题,所以不少场景还是需要手动 set。如果一个对象属性太多 s…

哥斯拉Godzilla shell管理工具

各大厂商的waf不断&#xff0c;在静态查杀、流量通信等方面对webshell进行拦截&#xff0c;众红队急需一款优秀的权限管理工具&#xff0c;冰蝎3.0的发布可能缓解了流量加密的困境&#xff0c;但是冰蝎3.0的bug众多&#xff0c;很多朋友甚至连不上冰蝎的shell&#xff0c; 于是…

使用Fabric8在Kubernetes中使用Camel和CDI

序幕 我最近在博客上发表了使用CDI注入Kubernetes服务的信息 。 在本文中&#xff0c;我将更进一步&#xff0c;将Apache Camel带入图片。 因此&#xff0c;我将使用Camel的CDI支持来连接我的组件和路由&#xff0c;以及Fabric8的CDI扩展来自动将Kubernetes服务注入到我的组件中…

sql双表查询java代码_原生sql 多表查询

Session session Session session super.getSession();session.flush();Connection con session.connection();String uid"";StringBuffer sql new StringBuffer();sql.append("select a.user_Id from user_info as a");//user用户表sql.append( left j…

写lua时需要注意的地方

条件语句判断时&#xff0c;只有false和nil会导致判断为假&#xff0c;其他的任何值都为真。 Lua 的字符串与编码无关&#xff1b; 它不关心字符串中具体内容。标准 Lua 使用 64 位整数和双精度&#xff08;64 位&#xff09;浮点数&#xff0c; 但你也可以把 Lua 编译成使用 3…

免费的人脸识别SDK(基于 Java 实现的人脸识别功能)

人脸识别技术是很复杂的&#xff0c;自己用Java手撕一个识别算法有点不切实际&#xff0c; 毕竟实力不允许我这么嚣张&#xff0c;还是借助三方的SDK吧&#xff01; 免费的人脸识别SDK&#xff1a; ArcSoft:&#xff0c;地址&#xff1a;https://ai.arcsoft.com.cn 基于 Jav…

git信息泄露漏洞

git信息泄露漏洞 当前大量开发人员使用git进行版本控制&#xff0c;对站点自动部署。如果配置不当&#xff0c;可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。 危害 攻击者可以利用该漏洞下载git文件夹里的所有内容。如果文件夹内有敏感信息比如站点源码、数据…

java实验文法报告_西安邮电大学编译原理LL文法分析器实验(java).doc

西安邮电大学编译原理LL文法分析器实验(java)《编译原理》实验报告题目: 语法分析器的制作学生姓名:班 级: 软件1202学 号:指导教师:成 绩:西安邮电大学计算机学院2015 年 6 月 7 日一&#xff1a;实验目的熟悉语法分析的过程&#xff1b;理解相关文法的步骤&#xff1b;熟悉Fi…

PHP 数据库 ODBC

PHP 数据库 ODBC ODBC 是一种应用程序编程接口&#xff08;Application Programming Interface&#xff0c;API&#xff09;&#xff0c;使我们有能力连接到某个数据源&#xff08;比如一个 MS Access 数据库&#xff09;。 创建 ODBC 连接 通过一个 ODBC 连接&#xff0c;您可…

bash简介

目录 Shell 的含义 Shell 的种类 命令行环境 终端模拟器 命令行提示符 进入和退出方法 Shell 和 Bash 的历史 <

功能项目拼图将Java 9引入

因此&#xff0c;拼图项目...我们已经对此颇为了解&#xff0c;但尚未看到计划如何兑现其承诺的细节。 这篇文章将精确地做到这一点&#xff0c;并介绍项目的核心概念和功能。 系列 这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序&#xff08;不同于发布顺序…

2021Kali -- 木马免杀制作

​知道为什么梦里的人都看不清脸么&#xff1f;因为怕你当真。。。 ---- 网易云热评 一、通过MSF生成shellcode 1、启动MSF&#xff0c;演示版本是6.0.36 2、通过msfvenom生成相关代码 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 12 -b \x00 l…

Bash脚本教程之基本语法

目录 echo 命令 -n参数 -e参数 命令格式 空格 分号 命令的组合符&&和|| type 命令 快捷键

qq音乐mp3解析php源码,QQ音乐API

QQ音乐API搜索歌曲API&#xff1a;&aggr1&cr1&loginUin{3}&formatjson&inCharsetGB2312&outCharsetutf-8&notice0&platformjqminiframe.json&needNewCode0&p{1}&catZhida0&remoteplacesizer.newclient.next_song&w{0}{0}需…

OpenCV与YOLO学习与研究指南

引言 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;而YOLO&#xff08;You Only Look Once&#xff09;是一个流行的实时对象检测系统。对于大学生和初学者而言&#xff0c;掌握这两项技术将大大提升他们在图像处理和机器视觉领域的能力。 基础知识储备 在深入…

2015年 六·一 儿童节——我

现是2015年的六一儿童节。按说儿童节对于一个己20岁的成年女生来讲已毫无渊渊&#xff0c;于是乎&#xff0c;我花费了将近半个下午的时间来解析自己&#xff1a;是否真的已经成人&#xff1f; 首先在外形上&#xff0c;毋庸置疑&#xff0c;已长成了大人的样子。158cm身高&…

目录爆破工具 -- dirsearch

我记得&#xff0c;以前总会和你聊的很晚很晚&#xff0c;现在我们不再说话了&#xff0c;我还是会熬夜&#xff0c;但我想&#xff0c;不如从今天开始早点睡吧。。。 一、环境&#xff1a;Kali2020.01、Python3.0 二、安装过程&#xff1a; 1、复制dirsearch到本地安装包 gi…