Shell 脚本代码笔记

132 阅读2分钟

变量与解释器

#指定编译器
#!/bin/sh

#声明变量,=中间不能有空格!!!
name='zhaoyan'
#引用变量用${变量名称}
echo ${name}

#显示赋值, ;可以省略应该do放在第一行
for file in "zuo" "hong" "fei";
do
    echo ${file}
done

#结尾的分号;必须有,因为为了区分do是表示循环体的开始,而不是可以赋值file的值
#``可以括起来命令,表示命令执行的结果
# for file in `ls /etc`; do
# echo ${file}
# done

#$() 和 ``效果一样都是表示命令执行结果
# for file in $(ls /etc)
# do
# echo ${file}
# done 

#for没有作用域的概念,在这里依然可以访问file变量,value是最后赋值的数值
echo ${file}

#只读变量,表示变量是只读,那么该变量就不能改变
readonly file
#执行这句话报错 “file: readonly variable”
file="new file"
echo ${file}

#删除变量,但是不能删除只读变量,报错“unset: file: cannot unset: readonly variable”
unset file
echo ${file}

new_file="new_file"
echo ${new_file}
unset new_file
#删除了变量,echo打印出来的是空
echo ${new_file}
new_file="zhao"
echo ${new_file}

#变量类型
#shell脚本中变量都是global的,其作用域是从被定义的地方开始到shell结束或者被显示的用unset删除
#shell函数中的定义的变量是global的,其作用域是从“函数被调用执行变量定义的地方”开始,到shell结束或者被显示删除为止
#函数定义的变量也可以用local修饰,那么其作用域会被局限在函数内
#如果同名,函数体会优先使用local,屏蔽global

shared=zhaoyan
function test(){
    #作用域从函数执行之后
    fun_shared=zuo
    echo "shared:"${shared}
}
echo "test执行之前 fun_share:"${fun_shared}
test
echo "test执行之后 fun_share:"${fun_shared}

#相当于重新给test赋值
function test() {
    #使用本地的
    local shared=zuo
    echo "shared:"${shared}
}
test

字符串与数组

#指定编译器
#!/bin/sh

#字符串,单引号和双引号,单引号写什么就是什么,不能引入变量、引入转义字符®
var="zhaoyan"
var_a='zuo'
#输出的样式:zhaoyan zuo
echo ${var} ${var_a}

var_b='${var_a}'
#输出的样式:${var_a}
echo ${var_b}

#获取字符串长度,使用 # 符号
echo ${#var_b}

#数组!!!只支持一维数组,而且不用指定大小,下标是从0开始 用 空格 来分割元素!!!
array=("zhao" "yan" hh)
#输出的是第一个元素: zhao
echo ${array}
#输出是 空
echo ${array[3]}
#另一种给array赋值元素
array[12]=yy
echo ${array[12]}
#array第一个元素赋值
array=12
echo ${array[2]}

##遇到null就停止了,所以array12储存这value
for item in ${array} 
do 
    echo $item 
done

#获取数组的个数
length=${#array[@]}
echo $length
length=${#array[*]}
echo $length


a="ashibushi"
echo ${a[2]}
#相当于声明了一个变量,只不过变量的名字中含有字符[1]
a[1]="as1231"
echo ${a[1]}
echo $a
echo "bianli:"
#只打印了 ashibushi,说a并不是一个数组类型
for item  in  ${a}
do
    echo ${item}
done

关系运算符

#执行shell脚本所携带的参数,用$0 $1 $2......$n表示
#$0表示脚本的路径,而真正指定的参数从1开始
echo $0


#$@ / $* 代表 $1 .... $n的参数,不包含$0
echo '$@:' $@
echo '$*' $*

#算术运算符,+ - * / == !=  
#!!!sh是不支持算术运算的,所以我们这里要借助命令 expr
a=1
b=2
sum=`expr ${a} + ${b}`
echo $sum

#乘法必须 加反斜杠
mult=`expr ${a} \* ${b}`
echo $mult

c=1
#$a必须和[符号之间有空格!!!
if [ $a == $c ]
then
echo "相等"
fi

#关系运算符
#-eq 相等 返回true
#-ne 不相等 返回true
#-gt 大于 返回true
#-lt 小于 返回true
#-ge 大于或等于 true
#-le 小于或等于 true

left=10
right=12

#只要有有条件语句就得加then
if [ $left -eq $right ]
then
    echo "equal"
elif [ $left -gt $right ]
then
    echo "great than"
else 
    echo "less than"
fi

#关系运算符
#! 非 这太不太好用
#-a and
#-o or
#上面这几种我试了一下不行,可以使用 && ||, 但是[[]]比用两个中括号包括

newa=1
newb=""
#! 这个无效 if [ ![$a] ]

if [[ $newa && $newb ]]
then 
    echo "a不是空字符串"
else 
    echo "a"
fi

if [[ $newa || $newb ]]
then 
    echo "a不是空字符串"
else 
    echo "a"
fi

#字符串关系比较
#= 两个字符串相等
#!= 不相等
#-z 字符串长度0 
#-n 字符串长度非0
#$ 是否是空串

#!!!!在shell中变量都是字符串
newc=""
newc=dsfsd
if [ $newc="dsfsd" ]
then
    echo "空串"
else
    echo "非空串"
fi

函数

#/usr/sh

#函数
#函数定义,在运行函数前,必须先定义函数
function a() {
    echo "a()"
}
#运行函数
a

#函数返回值
function a(){
    echo "返回值"

    b=12
    #return返回的必须是数字
    #return $b
    return 12
}
a
echo "a 函数的 返回值 :$?"

#函数参数
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73


字符串替换

#/usr/sh
echo $BASH_SOURCE
file="/Users/zhaoyan/flutter/flutter/bin/flutter"

# # 是 去掉左边(键盘上#在 $ 的左边)
# %是去掉右边(键盘上% 在$ 的右边)
# 单一符号是最小匹配;两个符号是最大匹配

# #从左边开始 %从右边开始
#Users/zhaoyan/flutter/flutter/bin/flutter
echo ${file#*/}
#flutter
echo ${file##*/}
#/Users/zhaoyan/flutter/flutter/bin
echo ${file%/*}
#空串
echo ${file%%/*}

#从index为0的字符开始,截取5位
echo ${file:0:5}

#从左到右将第一个字符串flutter替换成xxx
#/Users/zhaoyan/xxx/flutter/bin/flutter
echo ${file/flutter/xxx}
#将所有flutter替换成xxx
echo ${file//flutter/xxx}

Liunx 命令

1. set 命令、env命令、export命令
set 命令:
显示shell的所有变量(环境变量、自定义变量、bash内置变量)
env命令:
显示当前用户的环境变量