PGStudy-Linux脚本语言Part
Shell Script
Useful Features
对赋值变量时,需要不留空格
脚本中的代码每一行或分号隔开均当作单独的命令执行(控制语句除外)
这导致一种很常见的用法即. /source_path/file 直接运行文件
script是运行时检查的,因此即使存在语法错误,script文件也可能是可以运行的,并且不会在错误时停止
#!/bin/sh通常指定脚本所用shell名称,类似的有#!/bin/bash…,该行也叫shebang行
默认变量
?该变量表示上一个运行程序的返回值
$ - 该变量表示脚本的运行PID
# - 该变量表示传递给脚本的参数数量, <=>等同于argc
@ - 该变量表示所有传递给脚本的参数
1,2,3… - 表示将传递给脚本的参数分离到不同的变量中去,值得注意的是当参数大小大于10时,需要${10}这样的形式调度,常见的stdout(1),stderr(2)
PWD - 表示pwd命令的输出内容
语法相关
echo ‘$variable’是错误的,并不会输出value of variable,而是‘$variable’,正确的使用方式是”$variable”,同样正确的写法还有”${variable}”
变量赋值时等号两边不能加
,否则脚本会解析为命令
{…}的用法
1
2echo {a...z} # => a b c d e f g h i j k l m n o p q r s t u v w x y z
echo {$from...$to}会输出所有the range from the start value to the end value
通过
(command)
可以执行command
并将输出转化为一个匿名变量通过``的的方式可替代$(),但不能嵌套,因此并不推荐这样做
1
2echo $(pwd) # => 输出当前路径
echo $PWD # 与上一行输出相同通过
$(())
可以运行表达式并将结果转化为一个变量1
echo $(( 10 + 5 )) # => 15
读入语法为调用read命令
1
2
3
4
5Reading a value from input:
echo "What's your name?"
read name
Note that we didn't need to declare a new variable.
echo "Hello, $name!"在对变量本身操作或判断时不需要使用$,而读取值时需要
进程替换Process Subsititution
对一个简单的进程替换示例如下
1
echo <(echo "#helloworld")
<(echo "#helloworld")
:这部分是一个进程替换。它创建了一个临时的文件描述符,相当于一个临时文件,其中包含了echo "#helloworld"
命令的输出。在这个例子中,输出就是字符串#helloworld
。echo
:这是Linux系统中的一个命令,用于在终端打印字符串。
所以,整个命令
echo <(echo "#helloworld")
的含义是:首先执行echo "#helloworld"
命令,将输出存储在一个临时文件中,然后echo
命令读取这个临时文件的文件描述符,并将其打印到终端。而cat则会输出
#helloworld
流程控制相关
条件控制语句
语法
简单的条件控制语句示例如下
1 | read name |
可见
- 条件控制语句中的条件判断由
[[]]
限定范围 - 条件后有
;
then
表示条件描述完毕,也可以不要;
,转而吧then新开一行 - 与python不一样,这里的缩进是任意的
- 结尾的
fi
是必要的,表示条件控制块结束 - 这里非常需要注意的是
的使用,这里的
if
,[[]]
$name
$USER
之间都一定需要空格
运算符
一些运算符与条件控制语句的组合操作
1 | read ags |
补充一些比较运算符如下:
1 | -ne - not equal |
有一个特殊运算符=~
,该运算符将字符串与正则表达式作比较
一个简单的示例如下:
1 | read email |
这个正则表达的含义为@
前必须有至少一个英文字母@
后至少有两个,.
后为com
or net or org。
简化版条件语句
1 | echo "Always executed" || echo "Only executed if first command fails" |
以上是一个条件控制语句的简单示例
case语句
该语句相当于switch…case..,一个基本的用法如下
1 | case "$Variable" in # 这里的"依旧可以省略 |
值得注意的语法如下
- 代替 case value: 的是
value)
- 每个case后都需要两个
;;
- esac作为标记结尾
循环语句
for循环
1 | for Variable in {1..3} |
这样的语句十分类似python,但不同的是
do
和done
无法省略用于标志循环体内的逻辑代码
传统的for循环如下
1 | for ((a=1; a <= 3; a++)) |
与一些特殊类型——如文件、正则表达、命令、的输出进行交互
1 | for Variable in file1 file2 |
while循环
1 | while [ true ] |
- 循环体与条件退出的语法与for、if中的形式相似
- 同样存在continue、break
字符串相关
- ${variable:
a
:b
}表示截取子字符串起始a
长度b
下标下的值(由0开始) - ${variable/
string
/string1
}表示更换第一个string为string1 - ${variable:-
a
}表示最后a
位截取 - ${ #variable}表示获取variable长度
- ${!other_variable}表示获取other_variable值变量名得变量值
初始化相关
- ${foo:-“DefaultValueIfFooIsMissingOrEmpty”}默认空字符或0时返回DefaultValueIfFooIsMissingOrEmpty
数组相关
定义
1 | array=(one two three four five six) |
定义了一个六个元素得数组
下标索引
1 | echo "${array[0]}" |
one
one two three four five six
6
5
four five
one two three four five six
基本用法类似字符串以及常规高级语言
不同点在于表示所有数组时为@
函数定义
一个简单的函数定义如下
1 | function foo () |
文件相关
文件IO
常用写入文件示例
1 | cat > hello.py << EOF |
该操作将脚本后的内容读入EOF前将内容写进hello.py
参考资料
- 鸟哥的Linux私房菜:基础学习篇 第四版 | 鸟哥的 Linux 私房菜:基础学习篇 第四版 (gitbooks.io)
- Shell - CSBasicKnowledge (cs-baoyan.github.io)
- Bash scripting cheatsheet (devhints.io)
- Learn X in Y Minutes: Scenic Programming Language Tours