Shell编程技巧
说明
指定默认shell + 一些别的东西
否则会出现一些版本问题,加在脚本开头
#!/bin/bash
bash ./mzb .mzb对环境变量的操作不会影响bash环境
sh = /bin/bash --posix
zsh 没用过
source ./mzb 这三的区别就是source,会使得脚本内对环境变量的赋值作用在bash中(也就是共用环境)
数组 + 变量
' ' 和 " "的区别 (ls -al
用来获取命令的执行结果)
typeset = declare # 声明变量类型,注意默认类型都是string,1 + 1 = 11
name="mzb"
unset name # 销毁变量
vector=(1 2,3 4 5 6) # 注意空格
echo ${vector[0]} # 1
echo ${vector[1]} # 2,3 注意,不是分隔符
vector=(`cat 'names.txt'`) # 将每一行读取为数组的一个元素
vec[*] vec[@] # 使用@ 或 * 可以获取数组中的所有元素
echo ${vec[@]:1:3} # 截取数组的某一部分
echo ${#vector[@]} # 数组转列表,再求数组长度,其中没有定义的数组下标不占长度
for
for遍历数组注意遍历数组的格式,某些格式也可以运行,但仅枚举arr[0]
for it in ${vec[@]}
do
echo ${it}
done
读取环境变量
msg{msg} \((msg)
\)msg = msg,区别就是msg后面必须加一个分隔符
$(msg) = 获取执行命令msg的结果
获取脚本参数
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
bash $@, $*
相同点:都是引用所有参数
不同点:$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "\(2" … "\)n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … \(n"的形式输出所有参数;"\)@" 会将各个参数分开,以"$1" "\(2" … "\)n" 的形式输出所有参数。
字符串比较
yn=y
[ "$yn" == "y" ] && echo "true"
[]比较字符串的时候需要加空格,否则会出现[y: command not found的错误
获取命令返回值
获取命令的内容和返回值
返回值echo $?
脚本中result=ls -al即可 /// `:左上角和~一起的符号
echo不换行
-n
c++获取执行shell命令的所有显示
system仅能返回bool值
#include <string>
#include <iostream>
#include <vector>
using namespace std;
vector<string> ExecuteCmd(string const& cmd){
vector<string> ret;
FILE* ptr = popen(cmd.c_str(),"r");
if(ptr != NULL){
static char buf[1024];
while (fgets(buf,1024,ptr) != NULL){
ret.emplace_back(buf);
}
pclose(ptr);
return ret;
}
else{
ret.emplace_back(string("popen(") + cmd + ") failed!\n");
return ret;
}
}
int main(){
auto ret = ExecuteCmd("ls -al");
cout << "------------------\n";
for (auto it : ret){
cout << it;
}
cout << "------------------\n";
return 0;
}
本文来自博客园,作者:XDU18清欢,转载请注明原文链接:https://www.cnblogs.com/XDU-mzb/p/16364976.html