bash 编程杂项(函数及其它)

bash 编程可以简化通常的命令行操作。 bash 脚本是命令行程序的粘合剂。 bash 可以完成自动化处理

1. bash 可以用反引号执行 shell 命令,并收集标准输出到变量,然后进行处理。

2. bash 支持函数操作。 下面是关于函数返回值的知识点。

   bash 把函数也当成命令行程序执行, 函数的参数传递与命令行参数传递方式相同

   函数的返回值就等同于程序的退出码,所以,   return 语句不会超过255, 就是人为超过也会被取余变为不超过.

  函数的调用可以用反引号来调用,   函数向控制台输出(例如通过echo 语句,printf 语句等),可以收集信息到变量

    函数的使用当然应该先定义,后使用。

  所以,当没有一个程序能完成你的功能时,可以定义一个函数来完成。

3. bash 内置命令set, declare 可以观察已经定义的变量和函数, 最然内容有点乱,例如declare -F 可看到函数名, 似乎没有很有效的办法过滤出本shell全局变量,而需要用decare ,decare -f 生成两个文件, 比较二文件不同找到全局变量, 再去除env 环境变量,剩下才是本shell 全局变量.

 虽然没有多少实际意义,但有了全局感!

用declare -p 可以看到变量!不要用上面那种笨方法了。

 

附sh 实例:

#!/bin/bash -xv
# 用return 做函数返回值,返回的是shell 状态码,
# 由于状态码最大是255, 超过255 将会被取余数。
#
function getVer  或者 getVer()
{
    return 255
}

# 用echo 向控制台输出, 用反引号执行函数并收集函数输出
function getVer2 或者 getVer2()
{
    echo 12345;
}
getVer
ver="abcd"$?
echo $ver

ver2=`getVer2`
echo ver2=$ver2

由此我们知道, 直接写函数名称,就是调用函数,

如果将函数输出付给一个变量,需要用=变量声明及赋值语句,函数名称需要用反引号引住表示调用函数.

与c语言不同的是,付给变量的并不是函数返回值,而是函数向控制台输出的内容, 函数的返回值仍然在$?中,0-255区间.

所以赋值实际上是收集了函数或命令向 stdout文件指针输出的内容.

 

linux 下 c语言收集另一个进程的输出,需要用到popen,pclose 函数。

例如:    某嵌入式系统, 用以下语句查找protect 进程的pid.

   因为shell 下 $ps -ef |grep "protect"|grep -v "grep"|awk '{print $1}" 可以输出Pid 值,

   所以,c 用popen 来打开这个管道,读取数值。

   FILE *fp = popen("ps -ef |grep \"protect\"|grep -v \"grep\"|awk '{print $1}'","r");
    if(fp)
    {
        fgets(buf,sizeof(buf),fp);
        sscanf(buf,"%d",&gProtectPid);
        printf("protect pid:%d\n",gProtectPid);
        pclose(fp);

    }

 

实例应用1: bash将字符串变为数组程序

string.sh

#!/bin/bash
str="long string"
for((i=0;i<${#str};i++))
do a[i]=${str:$i:1}
    echo ${a[i]}
done;
echo "\$a is:"$a
echo "\$a[*] is:"${a[*]}
echo "\$a[@] is:"${a[@]}


运行可知, $a 只相当于 $a[0]

 

//这个myShell给两个范例: 一个是脚本,如下:
#!/bin/bash
echo "hello! say Something"
read
echo "you say:$REPLY,bye bye!"

//另一个是c 程序,如下:
$ cat myShell.cpp
#include <stdio.h>
//注: "\n" 很重要. 保证己方能发出,对方能收到。
int main()
{
    char buf[1024];
    printf("hello, say something!\n");
    fflush(stdout);  //该句很重要,否则对方收不到信息
    fgets(buf,sizeof(buf),stdin);
    printf("you say:%s",buf);
    printf("bye,bye!\n");
    fflush(stdout);
    return 0;
}

体会一下bash 脚本和c 程序的异曲同工之妙!

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

bash PROMPT_COMMAND 设置.

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

PROMPT_COMMAND="blah blah blah"
当每次出现bash 命令提示符前, 都会运行这个"blah,blah,blah" 命令. 第一个blah是命令,后面的blah 是参数
这给统计用户的命令提供了方便.

为了理解该命令,我们做个小实验:
export PROMPT_COMMAND="date +%H:%M:%S"
然后,你输入任何shell 命令, 都会首先执行$PROMPT_COMMAND
显示当前的时,分,秒, 有趣嘛!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值