linux借用外部命令expr,实现计算器功能,利用管道,进程

linux借用外部命令expr,实现计算器功能,利用管道,进程,第1张

test指令(使用指令man查询)

功能:检查文件类型,值比较。

test的各种参数和使用。

test EXPRESSION1 –a EXPRESSION2

当表达式1和表达式2同时为真时值为真

test EXPRESSION1 –o EXPRESSION2

当表达式1或者表达式2为真时值为真

test –n STRING

或者

test STRING

当STRING串的长度不为零时值为真

test –z STRING

当STRING串长度为零时值为真

test STRING1 = STRING2

当STRING1和STRING2相同时值为真

test STRING1 != STRING2

当STRING1 和 STRING2不同时值为真

test INTEGER1 –eq INTEGER2

当INTEGER1等于INTEGER2时值为真

test INTEGER1 –ge INTEGER2

当INTEGER1大于或者等于INTEGER2时值为真

test INTEGER1 –gt INTEGER2

当INTEGER1 大于INTEGER2时值为真

test INTEGER1 –le INTEGER2

当INTEGER1小于等于INTEGER2时值为真

test INTEGER1 –lt INTEGER2

当INTEGER1 小于INTEGER2时值为真

test INTEGER1 –ne INTEGER2

当INTEGER1不等于INTEGER2时值为真

test FILE1 –ef FILE2

当FILE1和FILE2有同样的device和inode号时为真(详细见linux文件学习笔记)

test FILE1 –nt FILE2

当FILE1修改时间比FILE2新时值为真

test FILE1 –ot FILE2

当FILE1修改时间比FILE2旧时值为真

test –b FILE

FILE存在并且内容是block类型的

test –c FILE

FILE存在并且是字符类型的

test –d FILE

FILE存在并且是一个目录

test –e FILE

FILE是否存在

test –f FILE

FILE存在并且是一个正则表达式类型的文档

test –g FILE

FILE存在并且是 set-group-ID也就是SGID(详细见后文学习笔记)

test –G FILE

FILE存在并且由有效的GROUP ID所拥有(详细见后文学习笔记)

test –h FILE

FILE存在并且是一个符号链接(详细见后文学习笔记)

test –k FILE

FILE存在并且设置了sticky bit set(详细见后文学习笔记)

test –L FILE

FILE存在并且是一个符号链接

test –O FILE

FILE存在并且由一个有效的USER ID所拥有

test –p FILE

FILE存在并且是一个命名管道(命名管道见后文学习笔记)

test –r FILE

FILE存在并且授予了可读的权限

test –s FILE

FILE存在并且size大于0

test –S FILE

FILE存在并且是一个socket

test –t FD

文件的描述符FD在终端打开

test –u FILE

FILE存在并且SUID已经被设置

test –w FILE

FILE存在并且授予了写 *** 作权限

test –x FILE

FILE存在并且授予了可执行的权限

----------------------------------------------------------------------------------------------------------------------------------------------------

expr

expr是linux的手工命令行计数器,它可以帮助我们完成一些基本的表达式值运算。同时它也是一个字符串处理工具

(1) 整数运算

$expr ARG1 | ARG2

$expr ARG1 &ARG2

$expr ARG1 <ARG2

$expr ARG1 <= ARG2

$expr ARG1 = ARG2

$expr ARG1 != ARG2

$expr ARG1 >= ARG2

$expr ARG1 >ARG2

$expr ARG1 + ARG2

$expr ARG1 – ARG2

$expr ARG1 * ARG2

使用乘法时,需要使用反斜杠进行转义

$expr ARG1 % ARG2

(2) 字符串 *** 作

$expr length “xxx” //计算字符串长度

$expr substr “this is a”pos length //从第pos位开始截取length长度的子串

$expr index “tesr”e //获取e在主串中首次出现的位置

(3) 增量计数

例子

loop=3

loop=`expr $loop + 1`

echo $loop

结果是4,在第二行代码中,使用反引号,shell会将反引号中的内容作为一个系统命令,这样一来,就好像我们在命令行内输入了expr $loop + 1然后这个命令的返回结果被赋值到loop。

(4) 模式匹配(按照正则表达式模式匹配串)

通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次。

>VALUE=account.doc

>expr $VALUE : ’.*’

8

在expr中可以使用字符串匹配 *** 作,这里使用模式抽取.doc文件附属名。

$expr $VALUE : ‘\(.*\).doc’

accounts

(5) 其他

+ TOKEN

将TOKEN解释为串,不管它是一个关键字或者一个 *** 作符

延伸知识:

引号的作用

1 双引号(“”)

1)使用””可引用除字符$(美元符号)、`(反引号)、\(反斜线)外的任意字符或字符串。双引号不会阻止shell对这三个字符做特殊处理(标示变量名、命令替换、反斜线转义)。

Eg:name=geznecho “User name:$name”//将打印User name :gezn

Echo “The date is:`date +date-%d-%m-%Y`”//将打印The date is: 03-05-2009

Echo –e “$USER\t$UID” //将打印gezn 500

2)如果要查新包含空格的字符串经常用到双引号

2 单引号(’’)

1) 如果用单引号把字符串括起来,则dayi9nhao内字符串中的任何特殊字符的特殊含义均被屏蔽。

2) 举例:echo –e ‘$USER\t$UID’//将打印$USER $UID(没有屏蔽\t,是因为选项“-e”的缘故)

echo ‘USER\t$UID’ //将打印$USER\t$UID

3 反引号(``)

1) shell将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量

2) 举例:a=`date + date-%d-%m-%Y` //将打印The date is: 03-05-2009

4.反斜线(\)

1)如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。

2)下属字符包含有特殊含义:&* + $ ` “ | ?

3) 在打印字符串时要加入八进制字符(ASCII相应字符)时,必须在前面加反斜线,否则shell作普通数字处。

举例: bj=Beijingecho ”variable\$bj=$bj”//将打印variable $bj = beijing

------------------------------------------------------------------------------------------------------------------------------------------------

Shell特殊变量

在Shell中,预先定义了几个有特殊含义的Shell变量,它们的值只能由Shell根据实际情况进行赋值,而不能通过用户重新设置。shell的特殊变量包括它的位置和一些系统变量.

(一)常用位置变量:

$# 命令行上实际参数的个数,但不包含Shell脚本名。

$? 上一条命令执行后的返回值(也称作 “退出码”)。它是一个十进制数。多数Shell命令执行成功时,则返回值为0;如果执行失败,则返回非0值。

$$ 当前进程的进程号。

$! 上一个后台命令对应的进程号,这是一个由1~5位数字构成的数字串。

$- 由当前Shell设置的执行标志名组成的字符串。例如:

set -xv 这个命令行给Shell设置了标志-x和-v(用于跟踪输出)。

$* 表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。

$@ 它与$*基本功能相同,但是使用时加引号,并在引号中返回每个参数

$0 脚本名称

$1..$9 第N个参数

下面的aaa bbb 为变量名

${aaa:-bbb} 如果$aaa为空或未定义,则取值$bbb.否则取值$aaa

${aaa:+bbb} 如果$aaa非空,则取值$bbb,否则取值为空

${aaa:=bbb} 如果$aaa非空,则取值$aaa,否则取值$bbb而且赋值(aaa=bbb)

${aaa:3} 如果aaa=abcdefg,则${aaa:3}的值为:defg ,相当于substr,计数从0开始

${aaa:3:2} 如上${aaa:3:2}取值为: de.相当于substr

${#aaa} 字符串$aaa的长度.

(二)常用系统变量:

$HOME 用户的主目录

$USER 用户名称

$GROUP 用户所属组名

$PATH 默认的搜索路径

$HOSTNAME 主机名称

$TZ 时区

$MAIL 存放邮件的路径名

练手:

#!/bin/bash

echo $0

echo $*

echo $@

echo $#

echo $$

echo $_

在terminal窗口中执行:

./test.sh -a -b –c /home

./test.sh

-a -b -c /home

-a -b -c /home

4

3250

/home

区别$*和$@编写如下test.sh脚本:

#!/bin/bash

function testargs

{

echo "$# args"

}

testargs "$*"

testargs "$@"

unset -f testargs

在terminal窗口中执行:

./test.sh -a -b /home

1 args //很明显就一个嘛,传入的是$*这个串,不是解释后的参数

3 args //$@必须和引号搭配,所以结果正确

#!/bin/bash

function testargs

{

echo "$# args"

}

testargs $*

testargs $@

unset -f testargs

再次执行有:

./test.sh -a -b /home

3 args

3 args

作者:Aga.J

出处:http://www.cnblogs.com/aga-j

1.什么是嵌入式Linux系统?

嵌入式Linux系统就是利用Linux其自身的许多特点,把它应用到嵌入式系统里。

Linux做嵌入式的优势,首先,Linux是开放源代码的,不存在黑箱技术,遍布全球的众多Linux爱好者又是Linux开发者的强大技术支持;其次,Linux的内核小、效率高,内核的更新速度很快;第三,Linux是免费的OS,在价格上极具竞争力。

Linux还有着嵌入式 *** 作系统所

需要的很多特色,突出的就是Linux适应于多种CPU和多种硬件平台,是一个跨平台的系统。到目前为止,它可以支持二三十种CPU。而且性能稳定,裁剪

性很好,开发和使用都很容易。很多CPU包括家电业芯片,都开始做Linux的平台移植工作。移植的速度远远超过Java的开发环境。也就是说,如果今天

用Linux环境开发产品,那么将来换CPU就不会遇到困扰。同时,Linux内核的结构在网络方面是非常完整的,Linux对网络中最常用的

TCP/IP协议有最完备的支持。提供了包括十兆、百兆、千兆的以太网络,以及无线网络,Toker ring(令牌环网)、光纤甚至卫星的支持。所以

Linux很适于做信息家电的开发。

还有使用Linux为的是来开发无线连接产品的开发者越来越多。Linux在快速增长的无线连接应用主场中有一个非常重要的优势,就是有足够快的

开发速度。这是因为LInux有很多工具,并且Linux为众多程序员所熟悉。因此,我们要在嵌入式系统中使用Linux *** 作系统。

Linux的大小适合嵌入式 *** 作系统——Linux固有的模块性,适应性和可配置性,使得这很容易做到。另外,Linux源码的实用性和成千上万的程序员热切其望它用于无数的嵌入式应用软件中,导致很多嵌入式Linux的出现,包括:Embedix,ETLinux,LEM,Linux Router Project,LOAF,uCLinux,muLinux,ThinLinux,FirePlug,Linux和PizzaBox Linux

看[url]www.linuxdevices.com/links/ www.linuxdevices.com/links/ [/url]

相对,Linux的图形界面还相对较弱,但近年Linux的图形界面发展也很快,这也就不是问题。

2.什么是嵌入式Linux

嵌入式linux 是将日益流行的Linux *** 作系统进行裁剪修改使之能在嵌入式计算机系

统上运行的一种 *** 作系统嵌入式linux既继承了Interlnet上无限的开放源代码资源又具有嵌

入式 *** 作系统的特性

2 嵌入式Linux的特点是版权费免费购买费用媒介成本技术支持全世界的自由软件

开发者提供支持网络特性免费而且性能优异软件移植容易代码开放有许多应用软

件支持应用产品开发周期短新产品上市迅速因为有许多公开的代码可以参考和移植

实时性能RT_Linux Hardhat Linux 等嵌入式Linux支持实时性能稳定性好安全性好

3 嵌入式Linux有巨大的市场前景和商业机会出现了大量的专业公司和产品如Montavista

Lineo Emi等有行业协会如Embedded Linux Consortum等得到世界著名计算机公司和OEM

板级厂商的支持例如IBM Motorola Intel等 传统的嵌入式系统厂商也采用了Linux策略 如

Lynxworks Windriver QNX等还有Internet上的大量嵌入式Linux爱好者的支持嵌入式Linux

支持几乎所有的嵌入式CPU和被移植到几乎所有的嵌入式OEM板

4 嵌入式Linux的应用领域非常广泛主要的应用领域有信息家电PDA 机顶盒Digital

Telephone Answering Machine Screen Phone 数据网络Ethernet Switches Router Bridge

Hub Remote access servers ATM Frame relay 远程通信医疗电子交通运输计算机外

设工业控制航空航天领域等

3.如果分别让10位工程师给出嵌入式系统的定义,将得到10个不同的答案。一般来说,大部分的嵌入式系统执行特定的任务。我们假定最简单的嵌入

式系统包括输入/输出功能,以及一些控制逻辑,该系统基于它的配置执行某些类型的功能。按照这个标准,可以认为一个包含实现控制逻辑74123计数器以

及一个状态是一个嵌入式系统。也许可以补充说,该系统必须可通过存储在固件中的软件进行编程。这个新的嵌入式系统定义包括输入/输出(I/O),以及存储

在系统固件中的控制逻辑。一个带有鼠标、键盘、网络连接并运行图形用户界面(GUI,graphical user interface)多任务 *** 作系统

的桌面计算机显然满足这些要求,但我们能认为它是一个嵌入式系统吗?

如果桌面计算机不是一个嵌入式系统,那么手持设备呢?它们有I/O功能,可以运行存储在固件中的控制逻辑。有人说,桌面计算机和手持设备都有通用计算机设备,可以运行软件来执行许多不同的任务,与之不同的是,嵌入式系统(例如,洗碗机控制器或飞行导航系统)主要是为特定任务而设计的。这种特定的功能限定使嵌入式设备有功能上的唯一性。如果是这样,为什么一些嵌入式系统设计成具有附加的功能,如存储在非易失性存储器中的程序,并且具有运行可以完成原始设计范围之外的任务的多任务 *** 作系统的能力呢?

在过去,区分嵌入式系统和通用计算机比现在简单的多。例如,可以很容易地区分出一个基于8051的T1分幅卡嵌入式系统和一台Sun UNIX工

作站。而现在,从功能方面很难区分一台Sun工作站和一个包含PowerPC以及32MB内存和16MB闪存的机顶盒。这样的机顶盒可以运行带GUI的多

任务 *** 作系统,可现场升级,可以同时运行多个程序(如视频控制器、数字录像和Java虚拟机),还可以进行安全的因特网在线交易。很难判断这种机顶盒是否是一个嵌入式系统。显然,硬件性能的提升和价格的下降使通用计算机和嵌入式系统之间的界限变得很模糊,技术的进步使得我们很难定义什么是嵌入式。

using System

using System.Collections.Generic

using System.ComponentModel

using System.Data

using System.Drawing

using System.Text

using System.Windows.Forms

namespace WindowsApplication4

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent()

txtHidden1.Text = ""

txtHidden1.Visible = false

txtHidden2.Text = ""

txtHidden2.Visible = false//txtHidden1和txtHidden2的功能都是临时存放 *** 作符

txtTemp.Text = ""//txtTemp的功能是存放临时结果

txtTemp.Visible = false

txtResult.Text = "0"

txtResult.ReadOnly = true//txtResult的功能是结果的显示以及数字的输入

}

private void btn0_Click(object sender, EventArgs e)//按钮0

{

PressNumBtn(sender)

}

private void btn1_Click(object sender, EventArgs e)//按钮1

{

PressNumBtn(sender)

}

private void btn2_Click(object sender, EventArgs e)//按钮2

{

PressNumBtn(sender)

}

private void btn3_Click(object sender, EventArgs e)//按钮3

{

PressNumBtn(sender)

}

private void btn4_Click(object sender, EventArgs e)//按钮4

{

PressNumBtn(sender)

}

private void btn5_Click(object sender, EventArgs e)//按钮5

{

PressNumBtn(sender)

}

private void btn6_Click(object sender, EventArgs e)//按钮6

{

PressNumBtn(sender)

}

private void btn7_Click(object sender, EventArgs e)//按钮7

{

PressNumBtn(sender)

}

private void btn8_Click(object sender, EventArgs e)//按钮8

{

PressNumBtn(sender)

}

private void btn9_Click(object sender, EventArgs e)//按钮9

{

PressNumBtn(sender)

}

private void btnDian_Click(object sender, EventArgs e)//按钮小数点

{

if (txtResult.Text == "")

{

return

}

else if (txtResult.Text.Contains("."))

{

return

}

else

{

txtResult.Text = txtResult.Text + "."

}

}

private void BtnJia_Click(object sender, EventArgs e)//按钮+

{

PressOperBtn(sender)

}

private void btnJian_Click(object sender, EventArgs e)//按钮-

{

PressOperBtn(sender)

}

private void btnCheng_Click(object sender, EventArgs e)//按钮*

{

PressOperBtn(sender)

}

private void btnChu_Click(object sender, EventArgs e)//按钮除

{

PressOperBtn(sender)

}

private void btnEqual_Click(object sender, EventArgs e)//按钮=

{

if (txtHidden2.Text != "" &&txtTemp.Text != "")

{

txtResult.Text = WorkOut()

}

txtHidden1.Text = ""

txtHidden2.Text = ""

txtTemp.Text = ""

}

private void btnCE_Click(object sender, EventArgs e)//按钮清0

{

txtResult.Text = "0"

txtHidden1.Text = ""

txtHidden2.Text = ""

txtTemp.Text = ""

}

private void PressNumBtn(object sender)// *** 作数字键从0到9

{

Button btn = sender as Button

string tag = btn.Text

if (txtHidden1.Text == "")

{

if (txtResult.Text == "0")

{

txtResult.Text = tag

}

else

{

txtResult.Text = txtResult.Text + tag

}

}

else

{

txtHidden2.Text = txtHidden1.Text

txtHidden1.Text = ""

txtResult.Text = tag

}

}

private void PressOperBtn(object sender)// *** 作加、减、乘、除

{

Button btn = sender as Button

string tag = btn.Text

if (txtHidden2.Text != "" &&txtTemp.Text != "")

{

txtResult.Text = WorkOut()

}

txtHidden1.Text = tag

txtTemp.Text = txtResult.Text

}

private string WorkOut()//核心功能:计算

{

string oper = txtHidden2.Text

double num1 = Convert.ToDouble(txtTemp.Text)

double num2 = Convert.ToDouble(txtResult.Text)

double result=0

switch (oper)

{

case "+": result = num1 + num2break

case "-": result = num1 - num2break

case "*": result = num1 * num2break

case "/": result = num1 / num2break

default: break

}

string Result = result.ToString()

return Result


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8681377.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存