computer_knowledge_notes/Languages/LinuxShell/0shell-programming.md

4.3 KiB
Raw Blame History

shell变量

  • 数组

    # shell只支持一维数组
    array_name = (val0 ... valn)	# 数组的定义方式一
    array_name[0] = val0			# 数组的定义方式二
    ${array_name[index]}			# 读取数组的元素
    ${array_name[*]}				# 读取数组中的所有元素方式一
    ${array_name[@]}				# 读取数组中的所有元素方式二
    ${#array_name[*]}				# 获取数组长度方式一
    ${#array_name[@]}				# 获取数组长度方式二
    

--------------------

基本格式

  • 第1行总是以#!/bin/sh开始通知shell使用何种解释器。
  • #开头的行是注释,建议在第二行注释中写入脚本名。
  • 脚本按从上到下的顺序执行。

保留字和元字符

do, done, for, while
if, then, else
..	# 上级目录
.	# 当前目录
*	# 任意多个字符
?	# 任意一个字符
~	# 用户目录
$	# 变量参数
#	# 注释
|	# 管道
&	# 后台执行
&&	# 左边的命令返回真后,右边的命令才能执行
||	# 左边的命令执行错误,则执行右边的命令
()	# 在当前shell执行括号内的一组命令
{}	# 在子shell执行括号内的一组命令
[...]	# 匹配括号内的任意一个字符
[!...]	# 不包含括号内的所有字符
>	# 输出重定向
2>&1	# 把标准错误和标准输出都作为标准输出,然后重定向。其实现原理是把标准输出的文件描述符复制给标准错误。
<	# 输入重定向
>>	# 追加

条件表达式

# 文件比较
-f文件存在, -d目录存在, -e,文件或目录存在,-s文件存在且非空, -r文件存在且可读, -w, -x

# 字符串比较
==, =, !=, < , >, -n字符串非空, -z字符串为空, =~正则比较(需要加双层中括号)

# 数字比较
-eq, -ne, -lt, -le, -gt, -ge

# 逻辑运算
-a且-o或&&且, ||或

条件控制

  1. if-then-else
# 分行写的格式  
  if [ 条件1 ]; 
    then 命令1  # 如果条件1为真则执行命令1
  elif [ 条件2 ];
    then 命令2  # 如果条件1为假且条件2为真则执行命令2
  else [ 命令3 ]    # 如果条件1为假且条件2为假则执行命令3
  fi            # fi意为if语句终止
  
# 写在一行的格式
if [ 1 -ne 0 ]; then echo "not equal"; fi

其中elif和else为可选项。 2. case

  case 值 in
    模式1) 命令1
      ;;
    模式2) 命令2
      ;;

    ...

    *) 命令n
      ;;
  esac

将值和每一个模式匹配,若匹配则执行相应命令不再与其它模式匹配,否则执行星号后的命令。

循环

  1. for
# 格式一
  for 变量名 in 列表
  do
      命令1
      命令2
      ...
  done
  
# 格式二
  for ((i=0; i<10; i++))
  {
      命令1
      ...
  }
  1. until
  until 条件
  do
    命令1
    ...
  done

当条件为真时循环结束,注意测试发生在循环末尾。 3. while

  while 条件
  do
    命令1
    ...
  done
  1. break
跳出循环或case语句
  1. continue
跳过当前循环

shell变量

本地变量
  • 仅对当前进程有效
环境变量
  • 对所有进程有效

  • export导出环境变量

  • env显示环境变量

  • unset清除环境变量

特定变量
!!		# 上条命令
!#		# 上条命令的名称
!^		# 上条命令的第一个参数
!$		# 上条命令的最后一个参数
!:n		# 上条命令的第n个参数
!:n-m	# 上条命令从n到m条参数
!:n*	# 上条命令从n开始到最后一条参数
!*		# 上条命令的所有参数

$0		# 当前脚本的文件名
$num	# 表示传递给脚本的第num个参数num从1开始
$#		# 传递给脚本的参数个数
$*		# 表示所有参数。即"$1" "$2" ... "$n"。"$*"表示"$1 $2 ... $n"。
$@		# 表示所有参数。不论是否使用引号,都表示"$1" "$2" ... "$n"。
$?		# 上条命令的返回值成功为0不成功为非0
$$		# 当前shell的pid
$!		# 后台运行的最后一个进程的pid
$-		# shell使用的当前选项
$_		# 上条命令的最后一个参数
在变量中切割字符串
${parameter:-word}
${parameter:=word}
${parameter:?word}
${parameter:+word}
${#parameter}		# 获取字符串的长度
${parameter%word} 	# 最小限度从后面截取word
${parameter%%word} 	# 最大限度从后面截取word
${parameter#word} 	# 最小限度从前面截取word
${parameter##word} 	# 最大限度从前面截取word