pro bash programming学习笔记——第二章

本文是关于Pro Bash Programming的第二章学习笔记,涵盖了参数和变量、实参与选项、printf用法、标准输入输出及重定向、读取输入和使用管道等核心概念,是深入理解Bash脚本控制流的关键。

输入、输出相关

参数和变量

运行脚本时所输入的参数叫做位置参数(positional parameters),在脚本中可以用$1来获得第一个参数,$2获得第二个参数,以此类推。
比如说,有这样一个脚本hello:
#: Description: print Hello and the first command-line argument
printf "Hello, %s!\n" "$1"
那么,当你在命令行下输入
hello John
将会输出
Hello, John!

注意:在bash中,$10将会被解释为$1后接一个0,如果要获得第9个参数以后的参数,参数号要用大括号括起来,如${10}。

在脚本中有时可能会要用到一些特殊参数(special parameters),如:
$*:所有的位置参数(一个单词)
$@:所有的位置参数(每个参数一个单词)
$#:位置参数的个数
$$:当前进程的PID
$?:上一条命令的执行返回值(0为正常执行)$_为该命令的最后一个参数
$!:上一条在后台执行的命令对应的进程PID
$-:

变量的命名规则与大部分程序语言一样,只能包含字母、数字和下划线,且只能以字母和下划线开始。变量赋值形式为
name=VALUE(注意等号两边都没有空格)
有些变量是被shell自动赋值的,如HOME、PATH、PWD等,除了auto_resume 和 histchars,这些变量都是由大写构成的。

实参与选项

在任意一条命令中,实参都是用一个或多个空格(或tab)隔开的,如果空格也要包括到参数中,则可以用转义符‘\‘或用单引号将整个参数引起来,如:
echo 1 '2  3' 4 5中‘2  3’就是一个参数
echo 1 2\ 3 4 5和上面一样,也是只包含四个参数

选项如果是单个字母的话,则以‘-’开头,如
echo -n 1 2 3 4 5
否则以‘--’开头,如--version

由于echo在AT&T系统和BSD系统下某些执行会有不同的输出结果,所以对于一些复杂的、需要格式的输出,最好使用printf

printf

与C类似,格式为:
printf FORMAT ARG ...

printf "Q\t\141\n\x42\n"
输出将会是
Q a
B

这是因为\t为tab,\141表示一个字符,其ASCII码在八进制下为141,\x42也表示一个字符,其ASCII码在十六进制下为42,\n为换行。
如果printf的ARG部分的实参超过了FORMAT中的形参,则FORMAT将会被重复使用,直到输出所有的ARG。

%b与%s类似,不同的是%s不会翻译ARG中出现的转义符,而%b会。
%d会将以0开头的数字认为是八进制,以0x开头的数字认为是十六进制,如果不是合法数字(如有小数点),则会输出错误信息。
%f会将浮点数保留到小数点后六位。

‘%’后接整数表示宽度,正数表示右对齐,负数表示左对齐。
‘%'后接小数则整数部分表示宽度,小数部分表示精度。

例:report
#!/bin/bash
#: Description : print formatted sales report
## Build a long string of equals signs
divider=====================================
divider=$divider$divider
## Format strings for printf
header="\n %-10s %11s %8s %10s\n"
format=" %-10s %11.2f %8d %10.2f\n"
## Width of divider
totalwidth=44
## Print categories
printf "$header" ITEM  "PER UNIT" NUM TOTAL
## Print divider to match width of report
printf "%$totalwidth.${totalwidth}s\n" "$divider"
## Print lines of report
printf "$format" \
    Chair 79.95 4 319.8 \
   Table 209.99 1 209.99 \
   Armchair 315.49 2 630.98

最后一个printf中的‘\'表示单行

在bash 3.1中,printf添加了-v选项,类似于赋值,如
printf -v num4 "%04d" 4
就是将num4的值设为0004。

标准输入输出和重定向

标准输入、输出、错误都是默认下与终端相关联的,它们的文件描述符分别为0,1,2。可以通过‘>>’、‘>’和‘<’来对这些流进行重定向。

如果要忽略某个流,可以将其重定向到/dev/null,如:
printf '%s\n%v\n' OK? Oops! 2>/dev/null    忽略了标准错误流。

注意
printf '%s\n%v\n' OK? Oops! > FILE 2>&1      与
printf '%s\n%v\n' OK? Oops! 2>&1 > FILE      的区别。

可以用&>>FILE将标准输出和错误都重定向到FILE文件中。

读入

read a b c d
如果输入
1 2 3 4 5 6 7 8,则
a为1,b为2,c为3,d为4 5 6 7 8
read也可以重定向,如:
read var < FILENAME

管道

因为每条命令的执行结果都是流,所以可以通过管道,将一条命令的输出作为另一条命令的输入。
printf "%s\n" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" | tee FILENAME
会参生四个随机数输入到文件FILENAME中去。

如果要将命令的执行结果赋给一个变量,可以:
var=`command`,注意`不是单引号,是~下的那个符号,也可以
var=$(command),但这两者执行速度会比较慢,这也是为什么要对printf添加-v选项,通过它对变量赋值速度会比上述两种方法快。

总结

用到的相关命令行:
cat:将一个或多个文件的内容输出到标准输出。
tee:将标准输入输出到标准输出和一个或多个文件。
read:在shell中读取标准输出。
date:输出当前时间。


【SCI一区复现】基于配电网韧性提升的应急移动电源预配置和动态调度(下)—MPS动态调度(Matlab代码实现)内容概要:本文档围绕“基于配电网韧性提升的应急移动电源预配置和动态调度”主题,重点介绍MPS(Mobile Power Sources)动态调度的Matlab代码实现,是SCI一区论文复现的技术资料。内容涵盖在灾害或故障等极端场景下,如何通过优化算法对应急移动电源进行科学调度,以提升配电网在突发事件中的恢复能力与供电可靠性。文档强调采用先进的智能优化算法进行建模求解,并结合IEEE标准测试系统(如IEEE33节点)进行仿真验证,具有较强的学术前沿性和工程应用价值。; 适合人群:具备电力系统基础知识和Matlab编程能力,从事电力系统优化、配电网韧性、应急电源调度等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于复现高水平期刊(SCI一区、IEEE顶刊)中关于配电网韧性与移动电源调度的研究成果;②支撑科研项目中的模型构建与算法开发,提升配电网在故障后的快速恢复能力;③为电力系统应急调度策略提供仿真工具与技术参考。; 阅读建议:建议结合前篇“MPS预配置”内容系统学习,重点关注动态调度模型的数学建模、目标函数设计与Matlab代码实现细节,建议配合YALMIP等优化工具包进行仿真实验,并参考文中提供的网盘资源获取完整代码与数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值