Linux中的Shell 编程(编写脚本的常用命令)

Shell编程,编写Shell脚本,并且该脚本可以运行,一般用于Linux运维(云计算)
Shell是一个用C语言编写的程序,可以通过shell进行操作系统的服务。
Shell Script 是一个脚本语言,跟java、php、python、scala一样,都有变量、方法、循环、数组,IO流都有。
a.sh 脚本
Linux中有多个shell解释器(类似于java JRE),可以通过一些命令查看有哪些解释器。
解释器中比较有名的是Bash,简单易用,免费,经常使用这个,Bash也是大多数Linux厂商使用的解释器。

1、常见的shell解释器有哪些呢?

cat  /etc/shells   查看当前电脑上支持的解释器有哪些?

2、shell的入门编程

mkdir /home/scripts

touch  01.sh   创建一个文件
vi  01.sh   进行编辑
通过输入i  进行编辑
编辑的内容是:
#!/bin/bash
echo 'Hello Shell'
echo 'Hello Shell'
echo 'Hello Shell'
echo 'Hello Shell'
echo 'Hello Shell'
echo 'Hello Shell'

esc退出编辑,:wq!  进行保存
接着运行:
/bin/bash  01.sh   执行该脚本文集  以后,在linux中看到 xxx.sh  就是可执行文件,类似于windows 中的bat

我们也可以这样运行:/bin/sh 01.sh

在linux中脚本后缀名是 sh  ,windows 叫做 .bat 
在windows中cmd 黑窗口的命令粘贴到 bat文件中,叫做windows脚本

这种还是太麻烦了,最简单的执行命令应该是  ./01.sh
chmod +x 01.sh
付完权限就可以执行了。

假如你在windows上编写了一个脚本,放入linux中运行,会报错:

原因是字符集问题:

在windows上可以编写,但是要注意是否为Unix编码:

3、Shell编程语法

1)变量

写法:
your_name="laoyan"   这个中间不能有空格,变量名和等号之间不能有空格
命名规则:
1、只能是英文字母,数字,和下划线,首个字符不能是数字开头的。
2、中间不能有空格,可以有下划线    错误演示: user name="张三"
3、不能使用标点符号
4、不能使用关键字 bash中的关键字

所谓的脚本就是将我们经常使用的linux命令汇总在一个文件中而已。

unset 不能删除 只读变量

提出问题,远远比答案本身重要。

2)字符串(重要)

在我们的shell编程中,字符串可以使用单引号,双引号,也可以不用任何引号
单引号和双引号的区别:
看演示代码

获取字符串的长度:

skill="java"
echo ${#skill}  打印该字符串的长度

截取字符串演示:

查找子字符串,是分开查找的,不能看做是查找子字符串。

 echo `expr index "$str" ia`
如果是这样的情况,返回的是 字母a 所在的下标,我们可以将后面这个词看做分开查找的。
ia  == i  a  
先查找ia 有没有

[root@bigdata01 scripts]# echo `ls /home/scripts`
001.sh 01.sh

3)参数

$0 表示当前运行的文件名字
$n  表示第n个参数
一定要写在双引号里面
#!/bin/bash
echo "查看shell脚本中的参数"
echo "目前正在执行的脚本的名字是:$0"
echo "获取到的第一个参数是:$1"
echo "获取到的第二个参数是:$2"
echo "获取到的第三个参数是:$3"
echo "获取到的第四个参数是:$4"

#!/bin/bash
echo "第一个参数是$1"
echo "总共有几个参数:$#"
echo "这些参数分别是什么:$*"
echo '验证是否可以使用单引号:$2'

$*  以字符串的形式展示所有的参数
$@  拿到所有的参数,可以当做一个数组

#!/bin/bash
echo '------------展示$*-------------'
for i in "$*";do
   echo $i
done

#!/bin/bash
echo '------------展示$@--------------'
for i in "$@";do
   echo $i
done

4)shell脚本中的运算符

shell和其他的编程一样,是支持运算的,但是我们的bash 不支持。
我们可以借助 expr 这个表达式工具完成,数据之间的加减乘除运算。

bash中也可以不使用expr 进行运算
可以使用(())  $(())  $[] 进行算数运算
((a++))  可以执行类似于这样的运算
将两个值进行运算 $((3 + 5))
a=2
b=3
$((a + b)) // 可以
$(($a + $b)) //也可以

5) 流程控制 (if else switch)类似这样的用法

if语句的语法:
if condition; then
    command1 
    command2
    ...
    commandN 
fi



if else 的语法

if condition; then
    command1
    command2
    ...
    commandN
else
    command
fi
#!/bin/bash
a=20
if [ $a -gt 10 ];then
   echo "a的值大于10"
fi

编写条件的时候,使用[]  里面的代码跟[]  之间有空格,否则报错!

#!/bin/bash
a=$1
if [ $a -gt 10 ];then
  echo "a大于10"
else
  echo "a 小于等于10"
fi


关系运算符的一些转换字符

运算符

说明

英文

举例

-eq

检测两个数是否相等,相等返回 true。

equal

[ b ] 返回 false。

-ne

检测两个数是否不相等,不相等返回 true。

not equal

[ b ] 返回 true。

-gt

检测左边的数是否大于右边的,如果是,则返回 true。

greater than

[ b ] 返回 false。

-lt

检测左边的数是否小于右边的,如果是,则返回 true。

less than

[ b ] 返回 true。

-ge

检测左边的数是否大于等于右边的,如果是,则返回 true。

Greater than or equal to

[ b ] 返回 false。

-le

检测左边的数是否小于等于右边的,如果是,则返回 true。

Less than or equal to

[ b ] 返回 true。

编写一个案例:

#!/bin/bash
a=$1
b=$2
if [ $a -gt $b ];then
 echo "a大于b"
fi
if [ $a -lt $b ];then
 echo "a 小于 b"
fi
if [ $a -eq $b ];then
 echo "a等于b"
fi

举例:

#!/bin/bash
name=$1
if [ $name -eq 123 ]; then
 echo '登录成功'
else
 echo '登录失败'
fi

-eq 只能比较数值类型,字符串类型比较使用 = 或者 ==
#!/bin/bash
name=$1
password=$2
if [ $name == 'root' ] && [ $password -eq 123456 ];then
  echo "账号和密码正确"
else
  echo "账号密码错误,请重试"
fi

6) 读取我们控制台的数据

类似于我们之前的Scanner

read -p "请输入您的姓名:"  name
echo $name

编写一个脚本,提示请输入用户名 ,请输入密码,假如用户名是root 密码是123456

提示登录成功,否则显示登录失败。

#!/bin/bash
read -p "请输入用户名:" name
read -p "请输入密码:" password
if [[ $name = 'root' && $password = '123456' ]]; then
 echo "登录成功"
else
 echo "登录失败"
fi

比较数字,使用 -eq 
比较字符串  使用 = 或者 ==
假如有多个条件,使用 [[   ]]

shell编程三剑客 【grep sed awk】

7)一个脚本

每次都要创建一个新的文件,比较麻烦,而且每次都要写 #!/bin/bash 这句话

方案一:

#!/bin/bash
if [ -e $1 ]; then
 read -p "文件已存在,是否覆盖(Y/y),任意键取消" ori
   if [[ $ori == 'y' || $ori == 'Y' ]]; then
    touch $1
    echo "#!/bin/bash" > $1
    chmod +x $1
   fi
else
 touch $1
 echo  "#!/bin/bash" > $1
 chmod +x $1
fi
-- 将这个脚本的后缀去掉也照样管用
mv mkf.sh mkf
-- 赋予权限
chmod u+x mkf
-- 如何让这个脚本全局都可以使用呢?
放入到/usr/local/sbin或者/usr/local/bin 下
mv mkf /usr/local/bin 

将这个脚本放在如下位置:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

具体放在/usr/local/sbin:/usr/local/bin ,因为这两个文件夹中没有任何的可执行文件,所以一般存放咱们自己的脚本非常合适。为什么放在这四个里面就可以?因为这四个目录默认被Path 加载。

一般自己编写的脚本放在:

/usr/local/sbin

/usr/local/bin

方案二:

也可以使用vim编辑器:

安装vim编辑器:
yum install -y vim
在/etc/vimrc文件结尾添加

"#给sh文件添加头部注释
autocmd BufNewFile *.sh exec ":call WESTOS()"
function WESTOS()
        call append(0,"#!/bin/bash") 
endfunction
autocmd BufNewfile * normal G

创建一个文件,自动添加 #!/bin/bash

vim 15.sh

题目1:
编写一个 Shell 脚本,用于输出一个给定目录下的所有文件和子目录的名称。

#!/bin/bash
echo "编写一个 Shell 脚本,用于输出一个给定目录下的所有文件和子目录的名称。"
read -p "请输入一个目录" path
num=0
for filename in `ls $path`;do
   echo $filename
   ((num++))
done
echo "该目录下总共有$num个文件"

题目2:
编写一个 Shell 脚本,用于将一个给定的整数乘以 2。

#!/bin/bash
read -p "请输入一个数字:" num
if [[ $num =~ ^[1-9][0-9]*$ ]];then
  echo $[num*2]
else
  echo "$num 不是数字"
fi

题目3:
编写一个 Shell 脚本,用于输出一个给定目录下的所有 .txt 文件的名称。
第一种:find ./ -name "*.txt"
第二种:ls | grep .txt
第三种:ls ./*.txt

#!/bin/bash
echo "编写一个 Shell 脚本,用于输出一个给定目录下的所有 .txt 文件的名称。"
read -p "请输入一个目录" path

for filename in `find $path -name *.txt`;do
   echo $filename
   ((num++))
done
echo "该目录下总共有$num个txt文件"


题目4:
编写一个 Shell 脚本,用于计算一个给定整数的阶乘。
什么是阶乘: 3! = 3 * 2 * 1

#!/bin/bash
echo "编写一个 Shell 脚本,用于计算一个给定整数的阶乘。"
read -p "输入数字:" num
sum=1
a=$num
while [ $num -gt 1  ];do
  sum=$[sum*num]
  ((num--))
done

echo "$a的阶乘等于$sum"

题目5:
编写一个 Shell 脚本,用于判断一个给定的整数是否为偶数。

题目6:
编写一个 Shell 脚本,用于将一个给定的字符串反转。

#!/bin/bash
echo "编写一个 Shell 脚本,用于将一个给定的字符串反转"
read -p "请输入一个字符串:" str
length=${#str}
newstr=""
for((i=length-1;i>=0;i--)) do
   newstr=$newstr${str:i:1}
done
echo $newstr
本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 chmod命令的其他例子 6 1.4.5 可以选择使用符号模式或绝对模式 7 1.5 目录 7 1.6 suid/guid 7 1.6.1 为什么要使用suid/guid 8 1.6.2 设置suid/guid的例子 8 1.7 chown和chgrp 9 1.7.1 chown举例 9 1.7.2 chgrp举例 9 1.7.3 找出你所属于的用户组 9 1.7.4 找出其他用户所属于的组 10 1.8 umask 10 1.8.1 如何计算umask值 10 1.8.2 常用的umask值 11 1.9 符号链接 12 1.9.1 使用软链接来保存文件的多个映像 12 1.9.2 符号链接举例 12 1.10 小结 13 第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 3.1.7 删除crontab文件 25 3.1.8 恢复丢失的crontab文件 25 3.2 at命令 25 3.2.1 使用at命令提交命令或脚本 26 3.2.2 列出所提交的作业 27 3.2.3 清除一个作业 27 3.3 &命令 27 3.3.1 向后台提交命令 28 3.3.2 用ps命令查看进程 28 3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准错误 43 5.9 合并标准输出和标准错误 43 5.10 exec 44 5.11 使用文件描述符 44 5.12 小结 45 ... ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值