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

linux脚本编程(shell)浅介 (转载)相关推荐

  1. linux脚本编程(shell)浅介

    linux脚本编程(shell)浅介 2006-01-10 11:45 27693人阅读 评论(18) 收藏 举报 脚本shelllinux编程bash语言 linux脚本(shell)编程 啊,昨天 ...

  2. Linux脚本编程:sudo命令下设置定时任务

    Linux脚本编程:sudo命令下设置定时任务 题目要求 编程平台 本地 云端 代码实现 基本思路 解决脚本 其他说明 题目要求 让普通用户使用sudo命令编写一个脚本,脚本内容为:设置定时任务,每隔 ...

  3. linux脚本除号,Shell脚本编程(上)

    Shell脚本编程基础 Shell 脚本基础:包含一些命令或声明并符合一定格式的文本文件 Shell 脚本用途: 1. 自动化常用命令 2. 执行系统管理和故障排除 3. 创建简单的应用程序 4. 处 ...

  4. linux脚本编程延时函数,shell脚本编程之函数

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.基本的脚本函数 脚本函数出现的目的:为了解决大型处理过程中,需要将相同的重复代码封装起 ...

  5. linux脚本编程教程

    linux shell 脚本入门 参考文章位置:http://learn.akae.cn/media/ch31s05.html 1.Linux 脚本编写基础...1 1.1 语法基本介绍...1 1. ...

  6. 【Linux】Linux脚本编程

    脚本编写基础 变量和参数 变量替换 变量的名字是它的值保存的地方.引用它的值称为变量替换.如果varible1是一个变量,那么$varible1就是引用该变量的值,即这个变量包含的数据. 解释:$为变 ...

  7. linux脚本 source,Shell 的source命令

    http://www.xxlinux.com/linux/article/development/shell/2006-09-22/4499.html http://www.diybl.com/cou ...

  8. linux 脚本编程

    image.png image.png • 查看CPU信息:lscpu • 查看内存信息:free -h • 查看硬盘信息:df -h ls -lh 显示当前文件夹的大小 du -h -d 1du - ...

  9. linux脚本编程有参函数,shell脚本编程进阶:函数

    一.函数介绍 函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程: 它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一 ...

最新文章

  1. android Theme启动APP闪屏处理
  2. 慎重选型:PG还是MySQL?Uber的案例不能作为参考!
  3. rsync+inotify-tools实现文件的实时同步
  4. POJ1789简单小生成树
  5. vs 2017 建立 php,程序在VS 2017中输出的结果为什么是这样的?求助大神!谢谢!...
  6. linux新建好文件后怎么编译,使用autoconf生成Makefile并编译工程的步骤
  7. ubuntun opencv 编译成64_19、OpenCV图像平滑处理
  8. Vue组件间常用的通信方式总结
  9. 我该用 Java 12 还是坚持 Java 11?
  10. cognos安装和配置即席报表流程
  11. 杭电计算机2010年笔试真题详解
  12. 人工智能动物识别系统C语言代码,人工智能作业动物识别系统.doc
  13. 巧用PPT模板,远离翻车风险
  14. Jitsi Meet的prosody模块报错Client disconnected: ssl handshake failed
  15. 【CamtasiaStudio学习笔记】Camtasia 9后期视频剪辑以及剪辑的视频合成教程
  16. 华芯投资40亿现金收购美芯片测试设备厂商Xcerra
  17. 7.前端入门小工具之PS辅助
  18. vol.132 《流浪地球》带火了中国科幻?(嘉宾:郑军)
  19. 嵌入式STM32入门之STM32基础串口通信
  20. Python 库大全(下)

热门文章

  1. axure html尺寸,axure怎么确定尺寸
  2. 图解C语言的希尔排序
  3. html标签转换日期格式,input标签的type为date,显示的日期格式样式更改
  4. python输入的方式有几种_Python读取键盘输入的2种方法
  5. everything安装版和便携版有什么区别_国行版爱他美卓萃和普通版有什么区别,一定要选卓萃吗?...
  6. 工业交换机和工业4G路由器的区分
  7. [渝粤教育] 中国地质大学 企业文化建设与管理 复习题
  8. 【渝粤教育】电大中专电大中专职业健康与安全考试考核试题作业 题库
  9. 【渝粤题库】陕西师范大学202831 程序设计 作业(专升本)
  10. 【渝粤题库】国家开放大学2021春2175市场营销学题目