前言

shell 也是咱们知识的一个扩展,往常开发中咱们或许用不到这个,但是要是想作为一个高效率的懒人程序员,那么这个仍是要掌握的,某种情况下他能减轻咱们繁琐的操作,能让咱们将需求等候的流程操作归一化,这样咱们也能省下来喝杯茶唠嗑的时间,或许看看一篇文章,岂不美哉

shell文档

传递参数

shell 脚本运转时是能够接手参数的,跟咱们的函数相同,履行脚本时只需求在后面,加个空格直接传递参数即可

例如,参数1:./shell.sh 1

//echo 为输出log
echo "--脚本接纳参数测试--"
echo "我是传递的第一个参数,履行脚本文件名 \$0: $0"
echo "我是传递的第二个参数,实践第一个传递参数 \$1: $1"
echo "我是传递的第三个参数,实践第二个传递参数 \$2: $2"
echo "显示一切传递的参数 \$* \$@:$* $@"
echo "实践传递的参数个数(不包括文件名) \$#:$#"

*、@、#

*、@默许都是获取集合、字符串一切变量的关键字,但其作为参数时,则又有不同

*、@ 的不同,只有在双引号中体现出来。假设在脚本运转时写了三个参数 123,
则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

# 则是对上面集合、字符的全部计数,核算出他们的个数、长度

字符串变量

echo '--打印变量字符串--'
str='哈哈哈'
str2="拼接了变量:$str"
str3="拼接了变量:${str}还追截了尾巴"
str4="拼接了变量,读取其字符长度#:${#str}"
str5='单引号,单纯字符串,拼接变量转化功用无效:${#str}'
str6=${str:1:2}
echo $str
echo $str2
echo $str3
echo $str4
echo $str5
echo "截取字符串:${str6} -- 指令:\${str:start:length}"

数组

echo '--打印数组--'
array=(1, 2, 3, 4)
echo "运用下标获取第n个元素:${array[1]}"
echo "获取一切元素之 *、@ -- *${array[*]} -- @${array[@]}"
echo "获取总长度和字符串相同 ${#array[*]}"

运算

运算符,假如感觉运算符不够用,那么能够参考这儿,后面的流程判别也会用到

echo '--运算--'
res=`expr 1 + 2`  //expr便是核算的,需求用到反引号
echo "两数之和:$res"
a=10
b=20
res2=`expr $a \* $b`
echo "两数之积,注意关键字转义\\\*:$res2"

条件流程句子

if、else、else if

条件句子比较简单,便是多了个 then 开端、fi 完毕

echo '--if条件句子--'
a=1
b=2
if [[ $a < $b ]]
then
	echo 'a < b'
fi
if [[ $a < $b ]]
then
	echo 'a < b'
else if [[ $a > b ]]
then
	echo 'a > b'
else 
	echo 'a = b'
fi

注意事项:默许判别会看到运用单括号的,单括号需求转义或运用规定的比较符号,双括号不需求

echo "==、!=、>、<、>=、<=这些运算符假如发现无法运用,那么或许需求转义"
echo "-eq(==)、-ne(!=)、-gt(>)、-lt(<)、-ge(>=)、-le(<=) 比较单次的缩写,用他们的意图便是防止常见运算符需求转义问题"
# if [ $a \< $b ]  //这个默许需求转义
# if [ $a -lt $b ] //或许是直接运用给定的字符比较
if [[ $a < $b ]]  //双括号也能防止转义的问题
then
	echo 'a < b'
else if [[ $a > b ]]
then
	echo 'a > b'
else 
	echo 'a = b'
fi

字符串的等号判别有有点不相同,单等号也是对比是否适当,请勿认为是赋值

字符串的判别最好用 = 号, == 也能够
sstr="fffff"
sstr2="fffff"
# if [[ $sstr == $sstr2 ]]
if [[ $sstr = $sstr2 ]]
then
	echo "str1 == str2"
else 
	echo "str1 != str2"
fi

循环、遍历

比较常见的便是 for、while 了,这儿面需求运用 do ... done 代替常见的大括号

echo '--循环遍历(读取列表并遍历打印)--'
for path in `ls ./`
do
	echo $path
done
echo '\n--循环while、for(不满足条件跳出)
num=1
num2=1
while (( $num < 10 || $num2 < 12 )) 
do
	echo $num
        # let "num++"
	num=`expr $num + 1`
	num2=`expr $num2 + 1`
done
for 不多介绍了
'for ( ; ; )'

read 读取外部输入内容

echo '--读取外部输入read--'
echo '请输入你的年纪'
read age
if [[ $age > 35 ]]
then
	echo "这个社会不需求大于35岁的白叟"
else
	echo "社会需求你,年青小伙子/小姑娘"
fi

能够运用读取 + 循环做一个硬性判别,用户也能够强制完毕循环

增加一个读取功用
echo "\n--请输入大于10的数字--Ctrl-D退出循环,持续往后履行 -- Ctrl-C完毕脚本运转"
read info
while (( $info < 10 )) 
do
	echo "你输入的是:${info},请重新输入"
	read info
done

格式化打印 printf

echo '--格式化打印printf(C言语相同,信任有时候会用的到)--'
printf "名字:%s 性别:%s 身高%.2f\n" 小月亮 女 171.1111

履行指令反引号“

反引号“便是履行指令的句子,这儿面咱们打印一个日期 date 做测试,前面也有用到 expr 核算

echo '--获取指令履行成果(打印日期date)--'
echo '履行指令并获取成果 `指令`'
echo `date`

还能够用来读取履行回来的信息

echo '--读取履行回来信息--'
str=`cat ./file1.txt`
echo $str

判别文件

判别文件是否存在,能够运用 tes,也能够直接中括号 + -e
# if test -e ./file.txt
if [ -e ./file1.txt ]
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi
echo '-s(文件是否为空) -e(文件是否存在) 比较常用'

函数

echo "--函数(实践上跟履行新脚本类似)"
add() {
	echo '调用了函数'
	echo "第一个参数为 $1 !"
}
add 1

文件包括与中定向

# 文件包括(一般用不到,除非写比较大的功用,或许复用功用)
. filename 或许 source filename 即可直接运用外部参数等 -- 注意空格'

出入重定向

echo "--输出重定向到文件 > >>"
echo 'command > file	将输出重定向到 file'
echo 'command >> file	将输出追加的方法重定向到 file'
echo "将输出重定向到 file" > 1.txt
echo "将输出追加的方法重定向到 file" >> 1.txt

最终

除了上面的信任能够看到,脚本言语其实很简单,能够做的却许多,其还有一个愈加重要的功用,那便是直接履行 linux 终端指令

咱们能够直接将终端直接写进脚本,这样就能够顺序实行了,是不是很方便呢

yarn
yarn build