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;
}
posted @ 2022-06-10 23:26  XDU18清欢  阅读(78)  评论(0)    收藏  举报