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

!!!注意 !!!

  1. cond的返回值为0,cond条件为真

  2. [] 两边需要空格,否则语法错误。例如,if [ $a -eq $b ] 是正确的,而 if[$a-eq$b] 是错误的。

  3. [ 是一个shell命令。

  4. 另外一个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;]
}

函数参数

posted @ 2024-02-24 17:47  GrapefruitCat  阅读(23)  评论(0编辑  收藏  举报