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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值