linux shell 编程语法小记
有些详细的地方见前辈写的博文:一篇文章让你彻底掌握 shell 语言
一、变量/变量转义
shell变量种类
-
普通变量:
a=b
(两边没有等号) -
bash变量:
$?
/$$
/$0
/PS1
-
环境变量:
export editor=vim
-
下表为shell中常用的环境变量:
环境变量 说 明 环境变量 说 明 EDITOR、FCEDIT bash、fc命令的默认编辑器 PATH bash寻找可执行文件的搜索路径 HISTFILE 用于储存历史命令的文件 PS1 命令行的一级提示符 HISTSIZE 历史命令列表的大小 PS2 命令行的二级提示符 HOME 当前用户的用户目录 PWD 当前工作目录 OLDPWD 前一个工作目录 SECONDS 当前shell开始后所流逝的秒数 -
不同类型的shell的环境变量有不同的设置方法。在bash中,设置环境变量用set命令,命令的格式为:
set envname=value
-
-
变量的引用:使用
$
符号,使用花括号可以帮助明确变量的边界。例子:variable_name="world" echo "Hello, ${variable_name}!"
变量要点
- 默认变量是全局的,如果需要局部使用
local
(特别是在函数内部)。- 局部变量的作用范围仅限制在其命令行所在的shell或shell脚本文件中;
- 全局变量的作用范围则包括本shell进程以及其所有子进程。
- 单引号、双引号的区别
- 双引号会把引号里面的变量自动替换,转义成变量的值
- 例子:
echo '$PS1'
和echo "$PS1"
- 变量无需声明类型:整形,字符串等
交互式读入变量
使用 read
关键字(命令)。-t
:超时时间 -p
:提示语句
格式:read -t timeout -p prompt varname
数组
- 声明:
array=(e1 e2 e3)
- 所有数组元素:
${array[@]}
- 数组长度:
${#array[@]}
- 遍历,使用下标:
${array[index]}
就地求值
$(expr)
或者 `expr`
,注意和变量引用使用的花括号是不同的。
算术求值
$((expr))
或者 let var=expr
二、条件语句
if/else语句
if cond; then
do_sth
# elif cond; then
# do_sth
else
do_sth
fi
cond
一般为 由一对 []
括起来的条件表达式,如 [ 1 -eq 2]
。
case语句
case $varname in
cond1)
do_sth
;;
cond2)
do_sth
;;
*) # 通配符,用作默认分支
do_sth
;;
esac
!!!注意 !!!
cond的返回值为0,cond条件为真
[
和]
两边需要空格,否则语法错误。例如,if [ $a -eq $b ]
是正确的,而if[$a-eq$b]
是错误的。
[
是一个shell命令。另外一个shell的关键字是 Bash 中的
[[
,支持正则匹配。例如,[[ $string =~ ^[0-9]+$ ]]
检查$string
是否完全由数字组成。(如果是一般shell还是用[
好了)
常用判断条件
见 man bash 中的 CONDITIONAL EXPRESSIONS 部分。
-
逻辑或 ||,逻辑&&,逻辑非!
-
-z
:字符串为空 -
=/==
:两个字符串相等 -
[[
适用,=~
正则匹配 -
-d
:测试的路径是目录 -
-e
:测试路径存在 -
-f
:路径是文件且文件存在 -
-gt/-ge
:greater than/greater equal -
-lt/-le
:less than/less equal -
-ne
:not equal
for循环
# 格式1:
for (( i=0;i<10;++i )); do
do_sth
done
# 格式2:
for var in item1 item2 ...; do
do_sth
done
举个例子,如果我们想把所有的
.bash
文件移动到script
文件夹中,并给它们可执行权限,我们的脚本可以这样写:DIR=/home/zp for FILE in ${DIR}/*.sh; do mv "$FILE" "${DIR}/scripts" done # 将 /home/zp 目录下所有 sh 文件拷贝到 /home/zp/scripts
while循环
while cond ; do
do_sth
done
until循环
until cond ; do
do_sth
done
三、函数/函数参数
函数定义
# 中括号括起来代表可有可无
[ function ] funname [()] {
[varname=value]
do_sth
[return int;]
}
函数参数
-
位置参数:$1 $2...
变量 描述 \$0 脚本名称 \$1 … $9 第 1 个到第 9 个参数列表 \${10} … $ 第 10 个到 N 个参数列表 \$* 、 $@ 除了 $0 外的所有位置参数 \$# 不包括 $0 在内的位置参数的个数 \$FUNCNAME 函数名称(仅在函数内部有值) -
非位置参数:
getopts
getopt
getopts 见 Linux 命令行参数解析工具 getopts - 黄大仙的文章 - 知乎
getopt 见 shell 命令之:getopt