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

6.0 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[@]}				# 获取数组长度方式二
    

算术运算

算术运算符

算术运算符 含义 示例
+、 - 加减 echo $((1+1))
*、 /、 % 乘除取余
**
++、 -- 自增自减
!、 &&、 || 逻辑
<、 <=、 >、 >= 比较
==、 != = 比较
<<、 >> 移位
~、 |、 &、 ^ 位运算 echo $((0&1))
=、 +=、 -=、 *=、 /=、 %= 赋值运算

运算命令

运算命令 说明
(()) 整数运算
let 数学运算
$[] 整数运算
expr 整数运算,或处理字符串
bc 整数、小数运算
declare -i 将变量定义为整数,仅支持加减乘除取余

函数

function help(){
  echo "help"
}

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

基本格式

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

保留字和元字符

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

# shell可识别4种引字符号
'	# 单引号。两个单引号之间的特殊字符均被识别为普通字符。
"	# 双引号。两个单引号之间的特殊字符大部分被识别为普通字符,但不包含单引号、反斜杠、$\	# 反斜杠。转义或在行尾表示续行。
`	# 反引号。两个反引号之间的命令被替换为这个命令的输出。$()也有此作用。反引号不能嵌套,而$()可以嵌套。

shell变量

整型变量
  • 变量默认是字符串,要让它是整型需要这么写var=$((3))
本地变量
  • 仅对当前进程有效
环境变量
  • 对所有进程有效

  • 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使用的当前选项
$_		# 上条命令的最后一个参数
在变量中切割字符串
# 假设var=http://www.abc.com/test.htm
${parameter:-word}	# 如果parameter有值则取其值否则结果为word
${parameter:=word}	# 如果parameter有值则取其值否则结果为word
${parameter:?word}	# 如果parameter有值则取其值否则结果为word
${parameter:+word}	# 无论parameter是否有值结果为总是word
${#parameter}		# 获取字符串的长度,例如${#var}的结果为27
${parameter%word} 	# 最小限度从后面截取word
${parameter%%word} 	# 最大限度从后面截取word
${parameter#word} 	# 最小限度从前面截取word例如${var#*/}的结果为/www.abc.com/test.htm
${parameter##word} 	# 最大限度从前面截取word例如${var##*/}的结果为test.htm

${parameter:start}	# 从start开始获取字符串如${var:7}的结果为www.abc.com/test.htm
${parameter:start:len}	# 从start开始截取len个字符如${var:7:3}的结果为www
${parameter:start-len}	# 先取最右的len个字符然后再从所得的字符串的start位开始截取如${var:3-5}和${var:2-4}的结果都是tm
${parameter:start-len1:len2}	# 先取最右的len1个字符然后再从所得字符串的start位开始截取长度为len2的字符。如${var:3-5:1}的结果是t