目录
常用指令
终端
# tty 是一个用于显示当前终端设备的命令
18:40:57 › tty
/dev/ttys001
# 另一个终端设备
18:45:35 › tty
/dev/ttys014
# 两个终端设备通讯,写入到终端ttys001输出
echo "haha" 1> /dev/ttys001
一、shebang
# 文件头的shebang,指定使用的是zsh,还是bash
#!/bin/zsh
二、指令
cat <<-EOF
# pwd、 cd、 ls、 ls -al
# touch、mkdir、 rm、rm -r、 cp、 mv、
# cat、vim、
# chmod +x fileName
# >、>>、&>、 < 、<<
# echo、echo -n
# which -a、whereis、
# id、whoami
# eval "commond"
EOF
# 重定向,覆盖原来的内容
command > out.txt
# 重定向,在原来的内容后边追加
command >> out.txt
# 将标准输出重定向到指定位置 1可以省略
command 1> out.txt
# 将错误重定向到指定位置
command 2> out.txt
# 将标准输出和错误重定向到指定位置
command &> out.txt
# &> 这种语法是 Bash shell 的扩展,不是所有的 Unix shell 都支持。
# 在其他 shell 中,可能需要使用 2>&1 来实现相同的效果。
# > output.txt 将标准输出重定向到指定位置
# 2>&1 将错误输出到和标准输出相同的位置
command > output.txt 2>&1
变量
一、普通变量
# 等号两边不能有空格
name="123"
echo "name = ${name}"
name=${name}456
# 变量的赋值不用$
echo "name = ${name}"
echo ""
二、读取变量
# -n 表示不换行
echo -n "请输入你的年龄:"
read age
# 打印变量
echo "age = ${age}"
echo ""
三、预定义变量
echo "\$0 = $0" #文件名
echo "\$* = $*" #所有参数
echo "\$# = $#" #参数个数
echo "\$1 = $1" #第一个参数
echo ""
四、环境变量
环境变量:系统级环境变量 和 当前shell的环境变量
系统级环境变量:在整个操作系统中通用的环境变量,对于所有用户和所有Shell都是一样的
当前Shell的环境变量: 这些是在当前Shell实例中定义的环境变量,它们只对当前Shell会话有效
# 打印所有环境变量
printevn
# 系统环境变量:当前使用的是zsh还是bash
echo "SHELL = $SHELL"
# # 系统环境变量:
echo "PATH = $PATH"
# 系统环境变量:当前shell的标识号
echo "\$\$ = $$"
# 自定义环境变量 可以在shell和子shell中使用
export var=3
echo "var = ${var}"
# 进入子shell
zsh
# 仍然可以访问到,如果是普通变量就访问不到了
echo "var = ${var}"
echo ""
数据类型
一、 Boolean:zsh中没有Boolean类型,都是字符串
echo "\n----- 布尔类型 ------\n"
bl=false
if [ $bl = "false" ]; then
echo "这是相等的"
fi
二、 数值类型:没有严格的数值类型,都是字符串
echo "\n----- 数值类型 ------\n"
num=1
if [ $num = "1" ]; then
echo "这是相等的"
fi
# 但可以运算
num=$((num + 2))
echo $num
三、 字符串
echo "\n----- 字符串 ------\n"
str="hello world !"
echo $str
# 字符串的长度
echo $#str
# 字符串的子串
echo ${str:1:2}
四、数组
echo "\n----- 数组 ------\n"
array=(11 12 13 14 15)
echo "array = $array"
echo "array = ${#array[*]}" # 数组个数
echo "array = ${array[*]}" # 数组所有元素
echo "array = ${array[2]}" # 索引从1开始
echo ""
for item in ${array[*]}; do
echo "item = $item"
done
echo ""
for (( i=1; i<=${#array[*]}; i++ )); do
echo "$i : ${array[$i]}"
done
echo ""
五、关联数组,相当于字典
echo "\n----- 关联数组 ------\n"
declare -A dic
dic=([name]=xiaoming [age]=18)
echo "array = ${#dic[*]}" # 数组个数
echo "array = ${dic[*]}" # 数组所有元素
echo "array = ${(k)dic[*]}" # 数组所有元素
echo "array = ${dic[name]}" # 索引
echo ""
for key in ${(k)dic[*]}; do
echo "$key : ${dic[$key]}"
done
六、方法
echo "\n----- 方法 ------\n"
add() {
local result=$(( $1 + $2 ))
# 打印结果到标准输出 不是return返回
echo $result
}
res=$(add 5 3)
echo "res = $res"
分支结构
score=70
if [ $score -ge 80 -a $score -le 100 ]; then
echo "优秀"
elif [ $score -ge 60 -a $score -lt 80 ]; then
echo "良好"
else
echo "不及格"
fi
case $score in
[8-9][0-9] | 100)
echo "优秀"
;;
[6-7][0-9] | 100)
echo "良好"
;;
*)
echo "不及格"
;;
esac
循环结构
array5=(11 12 13)
for (( i= 1; i <= ${#array5[*]}; i++)); do
echo "$i : ${array5[$i]}"
done
echo ""
for item in ${array5[*]}; do
echo "item = $item"
done
counter5=0
while [ $counter5 -lt 5 ]; do
echo "counter5 = ${counter5}"
counter5=$(( $counter5 + 1 ))
done
文件操作 和 三剑客
echo "\n----- 文件读取到数组 ------\n"
# for 默认是按空格分割后读取
# 可以使用`cat ./source/names.txt` 或者 $(cat ./source/names.txt)
# for item in `cat ./source/names.txt`; do
for item in $(cat ./source/names.txt); do
names[++i]=$item
done
for name in ${names[*]}; do
echo "name = $name"
done
echo ""
# while是按行分割读取
while read line; do
lines[++j]=$line
done < ./source/names.txt
for line in ${lines[*]}; do
echo "line = ${line}"
done
echo "\n----- grep ------\n"
# 从文件读取
grep "^mayun" ./source/names.txt
echo ""
# 从输出到屏幕读取
cat ./source/names.txt | grep "^mayun"
echo "\n----- sed 可以操作行------\n"
# 格式:sed [option] "action" filePath
# 删除mayun开头的行,将内容输出到屏幕上
sed -r '/^mayun/d' ./source/names.txt
echo "\n----- awk 可以操作列------\n"
# 格式:awk [option] 'commond' filePath
# -F指定分隔符为: $0 整行 $1 分割后的第一列
awk -F: '{print $1}' ./source/login.txt
行者常至,为者常成!