变量定义
a=1
b=insane
d="hello from myhome'
e='hello from "我的家" '
-
=
左右不要有空格
- 如果内容有空格,需要使用单引号或者双引号
- 双引号支持转义,
$
开头的变量会被自动替换
变量使用
echo $a
echo ${b}
echo "$a"
- 使用
$var
或${var}
来访问变量。后者更为严谨。$var_x
${var}_x
是不同的
- 变量不需要定义也可以使用。引用未定义的变量,默认为空值。
预定义变量
echo $PWD
echo $USER
echo $HOME
echo ~
echo $PATH
echo $RANDOM
特殊符号的使用
- 双引号用于括起一段字符串值,支持$var形 式的变量替换
- 单引号也表示其内容是字符串值,不支持转义
-
$'\n'
ANSI-C引用
-
\
反斜线,某些情况下表示转义
-
((a=a+3))
是整数扩展。把里面的变量当作整数去处理
-
$(ls)
执行命令并把结果保存为变量 简写为``
-
{1..10}
等价于seq1 10
,表示1到10
-
seq 1 3 10
表示生成一个1到10,步进为3
变量类型
- 字符串
a="xx"
- 数字
i=1314
- 布尔
true false
- 数组
array=(a b c)
- 函数
foo() { echo hello world }
- 高于4.x的shell有hash词典功能
数字型变量操作
- 整数计算
- 计算:
i=1;echo $i;echo $(i+1))
- 更新:
((i=i+1));echo $i
- bc命令:
echo'1/3' | bc
- 浮点数计算
awk 'BEGIN{print 1/3}'
- 格式化显示可以换用
awk 'BEGIN{printf("%.2f\n", 1/3)}'
字符串操作
${value:offset}
-
${value:offset:length}
从变量中提取子串
-
${#value}
字符串长度
-
${#array[*]}
和 ${#array[@]}
表示数组中元素的个数
-
${value# pattern}
${value# # pattern}
#
表示掐头
-
${value%pattern}
${value%%pattern}
%
表示去尾
-
${value/pattern/string}
${value//pattern/string}
/
表示替换
-
#
与##
%
与%%
/
与//
的区别:最短匹配模式VS最长匹配模式
-
${var/#Pattern/Replacement}
${var/%Pattern/Replacement}
例子
xx="1234567";
echo ${xx:2:3};
echo ${xx/3/c};
echo ${xx# # *3};
echo ${x%%5*};
echo $xx | awk '{print substr($0,2,3)}'
echo $xx | sed 's#3#c#g'
布尔变量
- true
- false
- 命令执行返回值
$?
- 任何命令执行都会有一个返回值
- 0表示正确
- 非0表示错误
数组变量
- 初始化:
array=(1 3 4 6) array=(`ls`)
- 基于下标赋值:
array[2]="hello world"; echo ${array[2]}
- 尾部追加:
a2+=(d)
- 遍历:
for i in "${array[@]}"; do echo $i; done
- 删除某个子元素:
unset array[1]
- 取下标:
echo ${!array[@]}
- 数组长度:
echo ${# array[@]}