JHHK

欢迎来到我的个人网站
行者常至 为者常成

Shell概览

目录

常用指令

终端

# 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

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.