shell_shell命令基础

1.shell基本介绍

  • 什么是shell脚本

shell命令, 在linux终端能够被解析出来的命令

shell脚本 -> 多个shell命令的集合, 逻辑判断, 循环, 函数, 变量

  • shell脚本的基本格式

    • 命名格式

      shell脚本是一个文件, 命令方式: xxx.sh
      ​ .sh的后缀不是必须的, 目的是为了方便识别

    • 书写格式

      # 第一行是固定的, 指定解析脚本内容使用的命令解析器
      #! /bin/bash    -> 指令使用的命令解析器是bash, 这行可以省略 #! /bin/sh
      # 后边就是shell命令, 变量定义, 函数调用, 逻辑判断循环
      
  • shell脚本的执行

    # 脚本文件需要执行权限
    # 普通目录权限: 775, 普通文件: 664
    chmod a+x xxx.sh
    chmod 777 xxx.sh
    
    # 脚本文件的执行
    ./xxx.sh      #最常用
    sh xxx.sh
    

2.shell脚本中的变量

  • 变量的定义

    • 普通变量(本地变量)

      变量名=变量值  -> 默认变量是字符串类型
      # 在shell中定义变量的时候, 必须初始化
      # =前后不能有空格
      # 普通变量名小写
      
      # 两种取值方式
      str=$(shell命令)
      str=`shell命令`
      
      #单引号和双引号的区别:
      如果是字符串,原样输出;
      如果是带解析的指令,单引号原样输出,双引号会将其解析。
      
    • 环境变量 - 一般大写

      # 环境变量在全局范围内都可以使用
      # 环境变量名一般大写
      # 创建: 环境变量名=值
      # 将普通变量提升为环境变量
      export 环境变量名=set 环境变量名=
  • 位置变量

    在执行脚本文件的时候, 可以进行参数传递, 在脚本内部需要接收这些参数, 这时候需要用到位置变量

# 脚本传参, test.sh
./test.sh 12 23 34 56 67 
# 位置变量
$0: ./test.sh, 执行的脚本文件的名字
$1: 给脚本传递的第一参数, 12
$2: 给脚本传递的第2参数, 23
$3: 给脚本传递的第一参数, 34

demo:

#! /bin/bash
ls
echo "脚本的名字 = " $0
echo "第2个数值 = " $1
echo "第3个数值 = " $2
echo "第4个数值 = " $3
echo "第5个数值 = " $4
echo "第6个数值 = " $5

echo "参数的个数: " $#
echo "所有的参数: " $@
echo "脚本执行之后的进程ID: " $$

Output:

./test.sh 1 aa bb cc dd ee ff gg hh
poistion.sh
脚本的名字 =  ./test.sh
第2个数值 =  1
第3个数值 =  aa
第4个数值 =  bb
第5个数值 =  cc
第6个数值 =  dd
参数的个数:  8
所有的参数:  aa bb cc dd ee ff gg hh
脚本执行之后的进程ID:  12901
  • 特殊变量

    • $#: 给shell脚本传递的参数的个数
    • $@: 所有参数的集合
    • $?: 进程执行完成之后的状态
      • 0 -> 成功
      • 非0 -> 失败
    • $$: 进程的进程ID

3.shell条件判断和循环

  • shell脚本中的if条件判断

    # 注意事项:
    # 	if和[]之间有空格
    # 	[]和条件判断前后有空格
    
    if [ 条件判断 ];then
    	处理指令(shell命令)
    fi
    
    # 或者 ==================
    if [ 条件判断 ]
    then
    	处理指令(shell命令)
    fi
    
    # 或者 ==============
    if [ 条件判断 ];then
    	处理指令(shell命令)
    elif [ 条件判断 ];then
    	处理指令(shell命令)
    else
    	处理指令(shell命令)
    fi
    

在脚本中判断这文件名对一个的文件是普通文件还是目录

#! /bin/bash

# 取出文件名
filename=$1
# 判断
if [ -d $filename ];then
    echo "$filename 是一个目录!"
elif [ -s $filename ];then
    echo "$filename 存在!!!"
else
    echo "$filename 不存在, 或者文件为空"
fi
  • shell脚本for循环

    # 语法: for 变量名 in 列表;do ... done
    
    for num in 123 345 22 33 44 55;do
    	echo "$num"
    done
    
    for dir in $(ls);do
    	echo "$dir"
    done
    
    # 脚本内容
    #! /bin/bash
    # 遍历当前目录
    for dir in `ls`;do
        echo $dir
    done
    
    # 遍历传递进来的参数
    for arg in $@;do
        echo $arg
    done
    
    # 测试
    ~/shell$ chmod a+x for.sh 
    ~/shell$ ./for.sh aa bb cc dd 123 456 789
    a
    for.sh
    if.sh
    aa
    bb
    cc
    dd
    123
    456
    789
    

4.shell脚本中的函数

# 没有函数修饰符, 没参数, 没有返回值
# 没有参数但是可以传参数, 在函数内部取参数使用的是位置变量
# 可以得到返回值, 表示的函数的执行状态, 0或非0
	0 -> 成功
	非0 -> 调用有问题

# 函数定义, 定义完成, 函数体不会执行, 必须被调用
myfunc()
{
	函数体
	shell指令(for, if)
}
# 函数调用
函数名 [参1 参数2 参数3]
myfunc 11 22 33
# 写个函数判断传递进去的文件名是不是目录, 如果存在什么也不干, 不存在, 创建
#! /bin/bash
# 定义函数
myfunc()
{
    # 遍历接收到的所有文件名
    for name in $@;do
        # 文件类型判断
        if [ -d $name ];then
            echo $name 是一个目录!
        else
            # 创建目录
            mkdir $name
            # 判断目录是不是创建成功了
            if [ $? -ne 0 ];then
                echo "目录创建失败: $name"
            else
                echo " $name 创建成功..."
            fi  
        fi      
    done
}       

# 函数调用
myfunc $@

# 测试
~/shell$ ls
a  for.sh  function.sh  if.sh  poistion.sh
~/shell$ chmod u+x function.sh 
~/shell$ ls
a  for.sh  function.sh  if.sh  poistion.sh
~/shell$ ./function.sh a b c
a 是一个目录!
 b 创建成功...
 c 创建成功...
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值