shell脚本编程

知识点1:shell概述

既是一种应用程序,又是一种程序设计语言,解释语言

shell是用户和Linux内核之间的接口程序

知识点2:shell的三种执行方式

如果是没有可执行权限

chmod +x 01_shell.sh

1、 ./01_shell.sh //子shell里执行,#!指定的解析器解析,如果没指定,使用系统默认

2、. 01_shell.sh //当前shell里执行,#!指定的解析器解析和系统默认不同,采用系统默认的解析器

3、bash 01_shell.sh //子shell里执行,bash解析器优先级高于#!后指定的解析器

知识点3:运行shell脚本文件问题解决

安装 dos2unix

sudo apt install dos2unix

1、使用dos2unix转换文件格式

dos2unix XX_SHELL.sh

2、用vim打开文件,在命令行模式下:set ff=unix

知识点4:shell脚本分类

1、配置文件/etc/profile,所有用户有效

2、~/.bashrc  ,当前用户有效

知识点5:shell变量

1、定义变量

变量名=变量值

引用变量:

$变量

2、案例1:

#!/bin/bash
num=100
echo "num=$num"

 

3、清除变量

使用unset命令清除变量

unset  varname

#!/bin/bash
num=100
echo "num=$num"
unset num
echo "num=$num"

4、只读变量

readonly varname

#!/bin/bash
readonly num=100
echo "num=$num"
num=1000
echo "num=$num"

5、从键盘获得输入

read string:从键盘输入一个字符串赋值给变量string

#!/bin/bash
read -p "请输入数据:" data
echo "data=$data"

6、环境变量

查看系统环境变量:env指令

export var=300

使用export说明的变量,会被导出为环境变量,其它shell均可使用

7、注意事项

变量名只能包含英文字母下划线,不能以数字开头,定义变量时“=”两边不能有空格

#!/bin/bash
export DATA=1000

通过env也能查看到设置的环境变量

env>a.txt

知识点5:预设变量

$#:传给shell脚本参数的数量

$*:传给shell脚本参数的内容

$1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开

$?:命令执行后返回的状态

"$?"用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)。

$0:当前执行的进程名

$$:当前进程的进程号

"$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复

预设变量案例:

#!/bin/bash
echo "参数个数:$#"
echo "参数内容:$*"
echo "参数1:$1"
echo "参数2:$2"
echo "参数3:$3"
echo "参数4:$4"
echo "进程名:$0"
echo "进程号:$$"
read data

知识点6:脚本变量的特殊用法

""(双引号):包含的变量会被解释

''(单引号):包含的变量会当做字符串解释

``(数字键1左面的反引号):反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量

\ 转义字符:

        同c语言 \n \t \r \a等 echo命令需加-e转义

(命令序列):

        由子shell来完成,不影响当前shell中的变量

{ 命令序列 }:

        在当前shell中执行,会影响当前变量

脚本变量案例

#指定解析器
#!/bin/bash  
#查看当前目录下的文件
echo "当前目录下有哪些文件:`ls -a`" 
#查看当前进程
echo "当前进程:`ps -a`" 

转义字符案例

\t 制表符相当于tab

\n 换行符

#!/bin/bash  
echo -e "1234354545\tbcded"
echo -e "########\n#########"

()和{}的区别

#!/bin/bash  
num=100
(  
  #子shell  
  num=500 
  echo "()内的num=$num"  
)
echo "()外的num=$num"
{
    num=1000 
    echo "{}内的num=$num"  
} 
 echo "{}外的num=$num"

知识点7:条件测试语句

test condition  或[ condition ]

注意:[]里两边都要有一个空格

1、文件测试

-e 是否存在    -d 是目录   -f 是文件

-r 可读        -w 可写    -x 可执行

-L 符号连接    -c 是否字符设备  -b是否块设备

-s 文件非空

#!/bin/bash  
read -p "请输入文件名:" filename
test -e $filename  #条件表达式1
echo "$?"
[ -d $filename ]   ##条件表达式2
echo "$?"

2、字符串测试

test str_operator “str”

test “str1” str_operator “str2”

[ str_operator “str” ]

[ “str1” str_operator “str2”]

其中str_operator可以是:

= 两个字符串相等   != 两个字符串不相等

-z 空串            -n 非空串

#!/bin/bash  
read -p "请输入字串1: " str1
read -p "请输入字串2: " str2
test -z $str1  #空串
echo "$?"
test -n $str2  #非空
echo "$?"
[ $str1 = $str2 ]   #串1和串2相等
echo "$?"
[ $str1 != $str2 ]   #串1和串2相等
echo "$?"

3、数字测试

测试数值格式如下:

        test num1 num_operator num2

        [ num1 num_operator num2 ]

num_operator可以是:

        -eq 数值相等   

        -ne 数值不相等

        -gt 数1大于数2    

        -ge 数1大于等于数2

        -le 数1小于等于数2

        -lt 数1小于数2

#!/bin/bash
read -p "请输入数字1: " num1
read -p "请输入数字2: " num2
[ $num1 -gt $num2  ]
echo "$?"
[ $num1 -le $num2  ]
echo "$?"

4、复合测试

命令执行控制:

&&:

command1 && command2

&&左边命令(command1)执行成功(即返回0)shell才执行&&右边的命令(command2)

|| :

command1 || command2

  ||左边的命令(command1)未执行成功(即返回非1)shell才执行||右边的命令(command2)

#!/bin/bash
read -p "请输入数字(50~100): " num
[ $num -ge 50 -a $num -le 100 ]
echo "$?"
read -p "请输入文件: " file
[ -d $file -o -e $file ]
echo "$?"

知识点8:控制语句

1、if控制语句

格式一:

if [条件1]; then
    执行第一段程序 
else
    执行第二段程序 
fi

格式二:

if [条件1]; then
    执行第一段程序 
elif [条件2];then
   执行第二段程序
else
    执行第三段程序 
fi
#!/bin/bash
read -p "请输入一个分数: "  num
if [ $num -ge 60 -a $num -lt 80 ];then
    echo "合格"
elif [ $num -ge 80 -a $num -lt 90 ];then
    echo "良好"
elif [ $num -ge 90 -a $num -le 100 ];then 
    echo "优秀"
else 
    echo "不合格"    
fi

2、case 控制语句

case 控制语句格式

case $变量名称 in
    “第一个变量内容”) 
       程序段一 
       ;; //break
    “第二个变量内容”) 
       程序段二 
       ;; //brak;
    *) //default
       其它程序段 
       exit 1 
  esac 
#!/bin/bash
read -p "请输入一个分数(10分制) "  num
case $num in
0|1|2|3|4|5)
echo "不合格"
;;
6)
echo "合格"
;;
7|8)
echo "良好"
;;
9|10)
echo "优秀"
;;
 *)
 echo "无效分数"
 exit 1
esac

3、练习

1、输入文件名

2、如果文件不存在,问用户是否创建文件,如果文件存在,显示文件内容

3、如果用户输入Y或者y,创建文件

4、如果用户输入的是N或者是n,退出程序

#!/bin/bash
# 1、输入文件名
# 2、如果文件不存在,问用户是否创建文件,如果文件存在,显示文件内容
# 3、如果用户输入Y或者y,创建文件
# 4、如果用户输入的是N或者是n,退出程序
read -p "请输入文件名: " file
if [ ! -e $file ];then
    read -p "是否创建$file(Y/N) " ret
    if [ $ret = "y" -o $ret = "Y" ];then
        echo "创建文件"
        touch $file
    elif [ $ret = "n" -o $ret = "N" ];then
        echo "退出"
        exit 1
    fi
else
    cat $file
fi

4、for 控制语句

形式一:

for (( 初始值; 限制值; 执行步阶 ))
    do 
        程序段
done 

形式二:

for var in con1 con2 con3 ...
    do
        程序段
done 

5、declare

是bash的一个内建命令,可以用来声明shell变量、设置变量的属性。declare也可以写作typeset。

declare -i s 代表强制把s变量当做int型参数运算。

#!/bin/bash
declare -i i
declare -i sum
for ((i=0;i<=100;i++))
do
 sum=sum+i;
done
echo "sum=$sum"

扫描文件夹下的所有文件

#!/bin/bash
for file in `ls`
do
echo "$file"
done

6、while控制语句

while [ condition ]
do 
        程序段
done
#!/bin/bash
declare -i i=0
declare -i sum=0
while [ $i -le 100 ]
do
    sum=sum+i
    i=i+1
done
echo "sum=$sum"

7、unitl控制语句

until [ condition ]
do
    程序段
done

这种方式与while恰恰相反,当condition成立的时候退出循环,否则继续循环。

#!/bin/bash
declare -i i=0
declare -i sum=0
until [ $i -gt 100 ]
do
    sum=$sum+$i
    i=$i+1
done
echo "sum=$sum"

8、break continue

break命令允许跳出循环。

break 通常在进行一些处理后退出循环或case 语句

continue

continue 命令类似于break 命令

只有一点重要差别,它不会跳出循环,只是跳过这个循环步骤

break案例

#!/bin/bash
declare -i i=0
declare -i sum=0
while [ $i -le 100 ]
do
    if [ $i -eq 50 ];then
    break
    fi
    sum=sum+i
    i=i+1
done
echo "sum=$sum"

continue案例

#!/bin/bash
declare -i i=0
declare -i sum=0
while [ $i -lt 100 ]
do
    i=$i+1 
    if [ $i -eq 50 ];then
    continue
    fi
    sum=$sum+$i
done
echo "sum=$sum"

知识点9:函数

格式一:

函数名() {               
  命令  ... 
} 

格式二:

function 函数名() {  
  命令  ... 
}

1、同一个文件函数调用

#!/bin/bash
#函数的定义
declare -i sum=0 #将变量sum强制转换成整型
function my_add()
{
    sum=$1+$2
    echo "sum=$sum"
}
#函数的调用
my_add 10 20

2、不同文件函数调用

19_shell.sh (函数定义)

#!/bin/bash
#函数的定义
declare -i sum=0 #将变量sum强制转换成整型
function my_add()
{
    sum=$1+$2
    echo "sum=$sum"
}

20_shell.sh(函数调用)

#!/bin/bash
source 19_shell.sh
#函数的调用
my_add 50 50

3、函数调用值返回

函数调用:

#!/bin/bash
source 19_shell.sh
#函数的调用
my_add 50 50
echo "sum=$?"

函数定义:

#!/bin/bash
#函数的定义
declare -i sum=0 #将变量sum强制转换成整型
function my_add()
{
    sum=$1+$2
    #echo "sum=$sum"
    return $sum
}

4、练习

1、在家目录下判断是否有test文件夹,如果没有就创建test文件夹

2、遍历当前文件夹下的文件,如果是普通文件则放入创建的test中

3、打印出放入test文件夹中的文件个数

防止文件产生不必要的操作失误,这里采用复制

# !/bin/bash
# 1、在家目录下判断是否有test文件夹,如果没有就创建test文件夹
# 2、遍历当前文件夹下的文件,如果是普通文件则放入创建的test中
# 3、打印出放入test文件夹中的文件个数
declare -i num=0
cd ~
if [ ! -e "test" -a ! -d "test" ];then
    echo "创建test目录"
    mkdir ~/test
    filelist=`ls`
    for file in  $filelist
    do
        if [  -f  $file  ];then
        cp $file  ~/test
        num=$num+1
        fi
    done
else
    filelist=`ls`
    for file in  $filelist
    do
        if [  -f  $file  ];then
        cp $file  ~/test
        num=$num+1
        fi
    done
fi 
echo $num 

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值