Shell脚本学习

shell解析器

在/etc/shells 目录下
在这里插入图片描述
我们一般使用sh,bash这两个
其实sh还是调用的bash
查看默认解析器:

echo $SHELL

第一个shell脚本程序“hello world”

上代码:

#!/bin/bash                                                                                                                                     
  2 
  3 echo "hello world!"

第一行的/bin/bash 指定使用bash解析器解析脚本,这个主要是你给文件加上可执行权限后,./执行的时候默认使用你指定的shell解析器,当然你也可以在命令行用

bash test.sh
#或者是
sh test.sh

第二个shell脚本 多命令操作

上代码:

 #!/bin/bash 
  2 
  3 touch file1.txt
  4 echo "I love xxx!" > file1.txt    

Shell变量

自定义变量:

A=1

等号两侧不能有空格
静态变量:

readonly B=1

撤销变量:unset A
静态变量不可撤销

bash中变量默认都是字符串类型,无法直接进行运算
such as:

A=1+1

在这里插入图片描述
变量的值如果有空格,在赋值时需要用单引号或双引号括起来
在这里插入图片描述

$n

就是命令行参数
$0代表命令本身,就是你的shell脚本名称, 1 − 9 就是你在命令行上输入的参数,类似于 m a i n 函数的第二个参数 c h a r ∗ a r g v [ ] , 大于 10 个参数要用 1-9就是你在命令行上输入的参数,类似于main函数的第二个参数char* argv[] , 大于10个参数要用 19就是你在命令行上输入的参数,类似于main函数的第二个参数charargv[],大于10个参数要用{10}表示

  1 #!/bin/bash 
  2 
  3 echo "$0 $1 $2 $3"  

在这里插入图片描述

$#

类似于main函数的第一个参数,argc,代表输入的命令行参数个数,不过跟main
函数不同的是,这个$#个数不带命令本身,只包括命令后面跟着的参数的个数

  1 #!/bin/bash 
  2 
  3 echo "$0 $1 $2 $3"
  4 echo "$#"   

在这里插入图片描述

$* and $@

∗ 这个变量代表命令行中所有的参数, * 这个变量代表命令行中所有的参数, 这个变量代表命令行中所有的参数,*把所有的参数看成是一个整体
$@ 这个变量也代表命令行中所有的参数,不过它把每个参数区分对待

  1 #!/bin/bash 
  2 
  3 echo "$0 $1 $2 $3"
  4 echo "$#"
  5 echo "$*"
  6 echo "$@"                                                                                                                                       

在这里插入图片描述
这两个函数的区别我们后面详细展开

$?查看进程退出码

之前有关进程退出的博客提到过
进程退出,结果正确为0,进程退出,结果错误为1.
进程崩溃,没意义。

运算符

  1. $((运算式)) 或 $[运算式]
  2. expr + , - , * , / , % 加 减 乘 除 取余
    expr运算符之间需要有空格

在这里插入图片描述

在这里插入图片描述
**`**的含义跟()差不多,优先运算。

条件判断

基本语法

[ condition ]
condition前后需要有空格
执行完闭后可以用$?查看退出码,为0就是满足条件,为1就是不满足

常用判断条件

  1. 两个整数之间比较
    = :字符串比较
    -lt:小于
    -le:小于等于
    -gt:大于
    -ge:大于等于
    -eq:等于
    -ne:不等于
    在这里插入图片描述
  2. 按照文件权限进行判断
    -r:有读的权限
    -w:有写的权限
    -x:有可执行的权限
    在这里插入图片描述
  3. 按照文件类型进行判断
    -f:文件存在,并且是一个常规的文本文件
    -e:文件存在
    -d:文件存在,并且是一个目录

if判断

基本语法

if [ condition ];then
···
fi

或者是

if [ condition ] 
then
···
fi

写个shell脚本,当输入参数为1时,输出“这是功能1”,当输入参数为2时,输出“这是功能2”
输入参数为其他时,输出defult

  1 #!/bin/bash 
  2 
  3 if [ $1 -eq 1 ]
  4 then
  5     echo "这是功能1"
  6 elif [ $1 -eq 2 ]
  7 then                                                                                                                                            
  8     echo "这是功能2"
  9 else
 10     echo "defult!"
 11 fi

case语句

case $变量名 in
"值1")
 ···
 ;;
 "值2")
 ···
 ;;
 *)
 ···
 ;;
 esca

代码示例:

  1 #!/bin/bash 
  2 
  3 case $1 in
  4 1)
  5     echo "这是功能1"
  6 ;;
  7 2)
  8     echo "这是功能2"
  9     ;;
 10 *)
 11     echo "defult"                                                                                                                               
 12     ;;
 13 esac
 14 

for循环

基本语法1

for((初始值;循环控制条件;变量变化))
do
···
done

案例:从1加到100

  1 #!/bin/bash 
  2 
  3 s=0;
  4 for((i=0;i<=100;i++))
  5 do
  6     s=$[$s+$i]
  7 done
  8 
  9 echo $s  

基本语法2

for 变量名 in 值1,值2,···
do
···
done

把后面的值依次赋给变量,循环执行后面的语句
代码示例:

  1 #!/bin/bash 
  2 
  3 
  4 for i in $*
  5 do 
  6     echo $i
  7 done
  8 
  9 for i in $@                                                                                                                                     
 10 do            
 11     echo  $i 
 12 done         
 13      
 14 #for i in "$*"
 15 #do                    
 16 #    echo $i           
 17 #done                  
 18 #               
 19 #for i in "$@"  
 20 #do      
 21 #    echo  $i
 22 #done 
 

当$@ ∗ 都没加双引号时,结果是一样的,都是循环赋值,然后打印出来当加引号时, *都没加双引号时,结果是一样的,都是循环赋值,然后打印出来 当加引号时, 都没加双引号时,结果是一样的,都是循环赋值,然后打印出来当加引号时,*是把你输入的所有参数当作一个整体赋给i,只循环一次全部打印出来
而$@依旧是一个个地打印

while循环

基本语法

while [ condition ]
do
···
done

read读取控制台输入

基本语法

read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间
参数:
变量:
指定读取值时的变量名
示例:

  1 #!/bin/bash 
  2 
  3 read -t 7 -p "please enter your name:>" NAME
  4 echo $NAME   

basename函数

提取文件名
basename 路径+文件名 后缀
没后缀的话,直接把文件名提取出来,有后缀的话就是提取出去掉后缀的文件名
eg:
在这里插入图片描述

dirname函数

提取文件路径
dirname 绝对路径+文件名
提取出除了文件名地路径
eg:
在这里插入图片描述

自定义函数

基本语法

[ function ] funname[()]
{
···
[ return int ]
}
funname

[]里面的内容都是可有可无
输入两个参数,求和并输出
代码示例:

  1 #!/bin/bash 
  2 
  3 function sum()
  4 {
  5     s=0
  6     s=$[$1+$2]
  7     echo $s
  8 }
  9 
 10 read -p "please type first num:" num1
 11 read -p "please type second num:" num2
 12 
 13 sum $num1 $num2

cut命令

按列切割,并且输出指定列

基本语法

cut 选项参数 filename
选项参数:
-d:分隔符,按照指定分隔符分割列
-f:列号提取第几列
比如输出PATH环境变量第二个冒号后面的所有内容

echo $PATH | cut -d ":" -f 3-

3-就是输出第三列以及后面所有列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值