您的位置:首页 > 运维架构 > Shell

bash 编程杂项

2016-07-13 15:48 621 查看
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 全局变量.

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

附sh 实例:

#!/bin/bash -xv

# 用return 做函数返回值,返回的是shell 状态码,

# 由于状态码最大是255, 超过255 将会被取余数。

#

function getVer()

{

    return 255

}

# 用echo 向控制台输出, 用反引号执行函数并收集函数输出

function getVer2()

{

    echo 12345;

}

getVer

ver="abcd"$?

echo $ver

ver2=`getVer2`

echo ver2=$ver2

而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 程序的异曲同工之妙!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息