天天看點

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

顯示目前的時,分,秒, 有趣嘛!