shell
变量
基础
# 定义变量,不需要加 $。变量名和等号之间不能有空格
name='fish'
# 变量引用,推荐后者
echo $name
echo ${name}
# 删除变量,变量被删除后不能再次引用
unset name
字符串
字符串可以用单引号,可以用双引号,甚至可以不用引号
单引号:
- 单引号里的任何字符都会原样输出,单引号字符里的变量是无效的
- 单引号字符串中不能出现一个的单引号(对单引号使用转义符也不行),但可成对出现,作为字符串拼接使用
str=world
# 变量无效
echo 'hello $str' # -> hello $str
# 单引号字符串里 单引号 成对出现,作为字符串拼接
echo 'hello '$str'' # -> hello world
双引号:
- 双引号里可以有变量
- 双引号里可以出现转义字符
str=world
# 可以引用变量
echo "hello $str" # -> hello world
# 可以有转义字符
echo "hello \"\"" # -> hello ""
其他操作:
str="abcd"
# 获取字符串长度
echo ${#str} # -> 4
# 提取子字符串
echo ${str:1:3} # -> bcd
数组
bash 只支持一维数组
# 数组定义,空格分割
animals=("dog" "cat")
# 或者
fruits[0]="apple"
fruits[1]="banana"
# 读取数组
echo ${animals[0]} # -> dog
echo ${fruits[1]} # -> banana
# 使用 @ 符号可以获取数组中的所有元素
echo ${animals[@]} # -> dog cat
# 获取数组长度
echo ${#animals[@]} # -> 2
echo ${#fruits[1]} # -> 6(本质是获取 banana 长度)
Shell 参数传递
我们在执行 Shell 脚本的时候,可以向脚本传递参数
# $0 为执行的文件名(包含路径),$1 开始为传递的参数
echo $0 $1 $2
执行命令:
sh ./i.sh hello world
# 打印 ./i.sh hello world
其他:
echo $# # 参数个数
# 遍历所有参数
for i in "$*"; do
echo $i
done
# hello world
for i in $*; do
echo $i
done
# hello
# world
for i in "$@"; do
echo $i
done
# hello
# world
for i in $@; do
echo $i
done
# hello
# world
输入/输出重定向
# 希望执行某个命令,但又不希望在屏幕输出结果
$ command > /dev/null
# 希望屏蔽 stdout 和 stderr
$ command > /dev/null 2>&1
其他参考
- Shell 基本运算符
- Shell test 命令(感觉和 Shell 基本运算符 有 overlap)
- Shell 流程控制
- Shell 函数