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
运行可知, $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 程序的异曲同工之妙!
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 程序的异曲同工之妙!
相关文章推荐
- android wifi 无线调试
- 运维入门
- 动态清空 nohup 输出文件
- install scrapy with pip and easy_install
- Linux Shell常用技巧
- 肯特·贝克:改变人生的代码整理魔法
- 你应该学习哪种编程语言?
- Shell 脚本编程陷阱
- [转]我们需要一种其他人能使用的编程语言
- Mootools 1.2教程 函数
- DB2编程序技巧(1)
- DB2编程序技巧 (四)
- autoit InputBox 函数
- 女人VS编程_国庆快乐
- DB2编程序技巧 (六)
- DB2编程序技巧 (三)
- DB2编程序技巧 (九)
- DB2编程序技巧 (七)
- DB2编程序小小技巧
- DB2编程序技巧 (五)