Linux下Shell编程

Linux的shell编程 

1、什么是shell?
当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shell(外壳)的程序。
shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。一般的Linux系统都将bash作为默认的shell。

2、几种流行的shell
目前流行的shell有ash、bash、ksh、csh、zsh等,可以用下面的命令来查看shell的类型:
echo $SHELL
SHELL是一个环境变量,它记录用户所使用的shell类型。

3、如果要执行该脚本,还必须使其可执行。
   chmod +x filename 
然后,您可以通过输入: ./filename 来执行您的脚本。

4、第一个shell程序

$vi firstscript.sh

echo “You are welcome to use base.” 
echo “Current work directory is $PWD.”
echo “You are $LOGNAME.”

增加执行权限
$chmod +x firstscript.sh
开始运行程序:
$./firstscript.sh

5、简单的运算 
$[expression]
例如:
var1=2
var2=$[$var1*10+1]
echo $var2    
返回值为21。 

-r文件名:如果文件存在且可读则为真
-w文件名:如果文件存在且可写则为真
-x文件名:如果文件存在且可执行则为真
-s文件名:如果文件存在且至少有一个字符则为真
-d文件名:如果文件存在且为目录则为真
-f文件名:如果文件存在且为普通文件则为真
-e文件名:如果文件存在则为真
-c文件名:如果文件存在且为字符型特殊文件则为真
-b文件名:如果文件存在且为块特殊文件则为真

-a 逻辑与
-o 逻辑或 
!  逻辑否

String_operator 可以为:
=:两个字符串相等
!=:两个字符串不等
-z:空串
-n:非空串 
-eq:数值相等
-ne:数值不相等
-gt:大于
-lt:小于
-le:小于等于
-ge:大于等于 

6、命令格式:read 变量名列表
功能:从键盘或文件输入数据,赋值给变量。shell用空格作为变量之间的分割符。
按回车键或者CTRL+D结束输入。
当read从文件中读取数据时候是按照行读取的,即一次读取一行。如果没有碰到回车符,则一直读到文件末尾。读取数据的方式和从键盘输入时相同。  
$read name sex age
Yangailin male 25
$echo  $name
Yangailin
$echo $sex
male
$echo $age
25

$read name sex
Yangailin male 25
$echo $name
Yangailin
$echo $sex
male 25 

$read name sex
Yangailin male 25
$echo $name
Yangailin
$echo $sex
male 25 

7、管道pipe 
可以通过管道将一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示,它的语法格式如下:
命令1  |  命令2 

8、cat 命令 
cat 命令可以用来显示文件内容,创建文件,还可以用来显示控制符号(用-v选项)。 
cat命令一下子显示整个完整的文件。
如果希望每次显示一页,可以使用more命令
 $cat filename1  filename2 > filename3   
#该命令把两个文件连成一个文件filename3

9、shell高级编程
shell 允许用户在不同的命令之间,放上特殊的排列字符。用户如果需要在一行中给出多个命令需使用分号“;”。
command1 ; command2  

command1 && command2
上面的命令表示只有当 command1 正确运行完毕后,才执行 command2 。 

command1 || command2
上面的命令表示只有当 command1 运行失败才会执行 command2 。 

在shell下面,一个新产生的进程可以通过用命令后面的符号“;”和“&”来分别以前台和后台的方式来执行,语法如下: 
command; 产生一个前台的进程,下一个命令须等该命令运行结束后才能输入。
command & 产生一个后台的进程,此进程在后台运行的同时,可以输入其他的命令。 

在shell中有两种命令分组的方法:“()”和“{}”,当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行时,就应该把这些命令放在圆括弧中
{}用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)

shell程序的调试主要是利用bash命令解释程序的选择项。调用bash的形式是:
  bash -选择项 shell程序文件名
-e:如果一个命令失败就立即退出
-n:读入命令但是不执行它们
-u:置换时把未设置的变量看作出错
-v:当读入shell输入行时把它们显示出来
-x:执行命令时把命令和它们的参数显示出来 

调试shell程序的主要方法是利用shell命令解释程序的“-v”或“-x”选项来跟踪程序的执行。“-v”选择项使shell在执行程序的过程中,把它读入的每一个命令行都显示出来,而“-x”选择项使shell在执行程序的过程中把它执行的每一个命令在行首用一个“+”加上命令名显示出来。并把每一个变量和该变量所取的值也显示出来。 

时间: 2024-11-24 08:57:41

Linux下Shell编程的相关文章

Linux下Shell编程快捷键大全(日常整理)_linux shell

有时候,我们需要在 Bash 中重复执行先前的命令.你当然可以使用上方向键来查看之前曾经运行过的命令.但这里有一些更好的方式,例如,数量掌握以下的快捷键. 1) !!:重复执行上一条指令 2) !a:重复执行上一条以a为首的指令 3) !number:重复执行上一条在history表中记录号码为number的指令 4) !-number:重复执行前第number条指令 5) !$:表示获得上一条命令中的最后一项内容 6) 用Ctrl + r 组合键来进入历史搜索模式在history表中查询某条过

linux下shell编程中Shift的用法

位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成了$1,原来的$5现在变成了$2,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常有用的Unix命令:shift.我们知道,对于位置变量或者命令参数,其个数必须是确定的,或者当shell程序不知道其个数时,可以把所有参数一起赋值变量$*.左路用户要求Shell在不知道位置变量个数的情况下,还能逐个的把参数-处理,也就是在$1后为$2,在$2后面为$3等.在shfit命令执行前变量

Linux下shell编程实例

1. 判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录下 read -p "input a file:" filename if [ -b $filename -o -c $filename ] then cp $filename /dev/ fi 2.编写一个脚本,进行简单的减法运算,要求提示输入变量 #!/bin/bash read -p "input a number:" num1 read -p "input another nu

Linux下shell编程中数组的常见用法及示例

新版本的Bash支持一维数组. 数组元素可以使用符号variable[xx]等方式来初始化. 另外, 脚本可以使用declare -a variable语句来指定一个数组等.要引用一个数组元素(也就是取值), 可以使用大括号, 访问形式为${variable[xx]},当然了,下面是一些老男孩经常使用的方法和对数组的一点理解,如有高见,欢迎指导,先谢谢博友们了. 1.1 shell数组的常用定义方法: 1)方法一: 命令法: dir=($(ls .)) 范例1:手工命令行操作演示 [root@o

linux下Shell编程--标准的守护进程的启动脚本

一个标准的守护进程的启动脚本: #! /bin/sh WHOAMI=`whoami` PID=`ps -u $WHOAMI | gerp mydaemond | awk '{print $1}'` if (test "$1" = "") then echo "mydaemond [start][stop][version]" exit 0 fi if ( test "$1" = "status") then

Linux下shell中case命令详解

  linux下shell中的case名字和C/C++中的switch类似,但是shell中的case更强大和复杂. 1.强大主要体现在:shell中case中的关键字可以是字符串类型,而每一项中可以包含正则表达式. 2.复杂主要体现在:shell中case的每一个项后有三个选择:break(常规的break).unconditional follow up(无条件继续)和conditional follow up(有条件继续). 这篇文章的重点是上面的第2点. case的无条件继续和有条件继续

Linux下c++编程中,STL模板的使用。

问题描述 Linux下c++编程中,STL模板的使用. Linux下c++编程,使用STL模板,为什么只识别#include 而不识别#include ? 程序中只要有#include 就会报无数多个错! 解决方案 难道c++标准模板库STL中没有包含queue,你可以去根目录去看看include头文件中有没有queue.h 解决方案二: STL头文件目录是否被include进项目中,如果自己写makefile的话,查看下INCLUDE的目录,如果IDE的话就查看下项目设置中的include选项

Linux下多线程编程(C语言)

Linux下多线程编程(C语言) 2.6内核开始使用NPTL(Native POSIX Thread Library)线程库,这个线程库有以下几个目标: POSIX兼容,都处理结果和应用,底启动开销,低链接开销,与Linux Thread应用的二进制兼容,软硬件的可扩展能力,与C++集成等. 这里的线程是指用户空间的线程操作 一.线程相关操作 1.1  pthread_t      pthread_t 在头文件  /usr/include/i386-linux-gnu/bits/pthreadt

linux下串口编程read函数返回(非超时返回)问题

问题描述 linux下串口编程read函数返回(非超时返回)问题 串口编程经典应用场景:打开串口,阻塞模式,非超时返回,有数据返回,无数据死等. 简易代码为例: void* read_thread(void* param) { char szbuf[128]; int size = 0; while (running) { size = read(fd, szbuf, sizeof(szbuf)); } return 0; } int main() { fd = open(port, O_RDW