05-Shell编程

作者: 郑元吉 | 来源:发表于2018-11-17 17:12 被阅读10次

一、shell编程

1.简介

1.1什么是shell

把在终端运行的命令保存到文件中,这个文件就是shell程序

简单的说,shell编程就是第Linux命令的逻辑化处理

1.2shell解析器的类型

bash,ash,ksh等,默认使用bash

演示命令:
echo $SHELL
/bin/bash
1.3shell的作用

如果需要反复执行某些Linux命令,则可以将这些命令写到一个shell脚本中,然后每次只需要运行一下这个脚本即可

2.第一个shell程序

2.1实现

打开文本编辑器(可以使用 tou'ch命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好

代码演示:

#!/bin/bash
#打印hello world
echo "Hello World !"
2.2运行

方式一:作为可执行程序

touch test.sh
vim test.sh
chmod +x ./test.sh
./test.sh

方式二:作为解释器参数

/bin/bash test.sh 

3.shell中的变量

3.1变量的定义

定义:变量名=值

演示命令:
your_name="zhangsan"   #定义变量没有$,赋值符中间不允许有空格
echo $your_name        #使用是必须有$
num=10
echo ${num}

#注意:变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
echo "his name is ${your_name}"
3.2只读变量

readonly:只读,将变量声明为readonly,只读变量的值不能发生改变

myUrl="http://www.baidu.com"
readonly myUrl
myUrl="http://www.1000phone.com"

#运行脚本,报错:/bin/sh: NAME: This variable is read only
3.3删除变量

unset:删除变量

代码演示:
myUrl="http://www.baidu.com"
unset myUrl
echo $myUrl

#变量被删除后不能再次使用。unset 命令不能删除只读变量。
#以上实例执行将没有任何输出

4.字符串和数组

4.1字符串

双引号或者单引号

单引号的限制:

​ a.单引号中的任何字符都会原样输出,单引号字符串中的变量是无效的

​ b.单引号字符串中不能再出现单引号【对单引号进行转义后去不起作用】

总结:

​ 双引号:可以包含除了$、`、\、‘‘之外的任意字符

​ 单引号:其中的任意字符都不会被解析,都会原样输出

​ 反引号:会将其中的内容作为命令执行

​ 反斜线:转义特定的字符,如:&、*、^、等

代码演示:

代码演示:
#!/bin/bash

#定义字符串
your_name='qinjx'
str="Hello, I know you are \"$your_name\"! \n"

#拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

#获取字符串长度
string="abcd"
echo ${#string} #输出 4

#提取子字符串
string="1000phone is a great site"
echo ${string:1:4}       #包头包尾,下标从0开始计数

#查找子字符串
string="1000phone is a great company"
echo `expr index "$string" is`   #查找is在string中的位置,从1开始计数

#注意: 以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦
4.2数组

bash只支持一维数组,不支持多维数组

并没有限制数组的大小

数组元素的下标也是从0开始的,获取数组中的元素使用下标

定义数组:数组名=(值1 值2 值3....)

注意:shell中的数组元素之间使用空格分隔

代码演示:

#数组的定义
arr1=(10 20 30 40)
echo $arr1
arr2=(
10
20
30
40
)
echo $arr2

#数组的使用
#读取数组中的元素
echo ${arr1[2]}
#如果要读取数组中的全部元素
echo ${arr2[@]}

# 取得数组元素的个数
length=${#arr1[@]}
echo $length
# 或者
length=${#arr1[*]}
echo $length
# 取得数组单个元素的长度
lengthn=${#arr1[3]}
echo $lengthn

5.shell中的运算符

expr:是一款表达式计算工具,使用它能够完成表达式的求值操作(注意:计算符前后要加空格)

代码演示:

val=`expr 1 + 2`
echo "两数之和为 : $val"

#1.算术运算符
val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

#2.关系运算符
## []中,前后都需要空格
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi

#3.逻辑运算符
if [ 1 -lt 3 ] && [ 2 -lt 3 ]; 
then
  echo "ok"
fi

6.echo、printf、test命令

1>echo

echo -e "OK! \n"      # -e 开启转义,\n 显示换行
echo -e "OK! \c"       # -e 开启转义 \c 不换行

echo `date`    #显示命令执行结果
#注意: 这里使用的是反引号 `, 而不是单引号 '。
#结果为:Thu Jul 24 10:08:46 CST 2014

2>printf

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 张三 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 李四 男 48.6543 

注意:

​ %s %d %f都是格式替换符

​ -10s:指的是一个宽度为10的字符(-表示左对齐,没有则表示右对齐),任何字符都会填充在这10个字符内,如果不足则使用空格自动填充

​ -4.2f:指的是格式化为小数,其中.2表示保留小数点后两位

3>test

#1.数值测试
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

#2.字符串测试
num1="hello"
num2="hello11"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

#3.文件测试
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

test命令用来监测某个条件是否成立,他可以进行数值,字符和文件的监测

7.shell中的流程控制语句

7.1分支语句

if,case

代码演示:

#if语句
#单分支
if [ 1 -lt 3 ] && [ 2 -lt 3 ]; 
then
  echo "ok"
fi

#双分支
num1=$[2*3]
num2=$[1+5]
#if else语句经常与test命令结合使用
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

#多分支
a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi


#case语句
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac
7.2循环语句

for while until

代码演示:

#for语句
#需求:顺序输出当前列表中的数字
for num in 1 2 3 4 5
do
    echo "The value is: $num"
done


#需求:顺序输出字符串中的字符
for str in 'This is a string'
do
    echo $str
done

#需求:遍历数组中的所有元素
a=(1 2 3)
for x in ${a[*]}
do 
  echo $x
done
  
#while语句
#需求:输出数字1到5
int=1
while(( $int<=5 ))
do
    echo $int
    let int++
done


#需求:求1~10之间所有整数的和
i=1
sum=0

while [ $i -le 10 ]
do
      sum=$[$sum+$i]

      i=$[$i+1]
done
echo $sum

#until语句
i=1

until [ $i -gt 10 ]
do
  echo $i
  ((i++))
done

8.函数

代码演示:

#无参无返回值
#定义函数
demo()
{
  echo 'hello world'
}
#调用函数
demo

#有返回值
funWithReturn(){
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    return $(($aNum+$anotherNum))
}
funWithReturn
echo  $? # $? 表示函数的返回值

#有参有返回值
arg()
{
  echo $1 #第一个参数
  echo $2 #第二个参数
  echo $# #参数个数
  echo $* #用字符串的形式,显示所有参数
  return 123 #只能返回数字,并且取值是0~255
}

arg 1 2
echo $?

相关文章

  • 05-Shell编程

    一、shell编程 1.简介 1.1什么是shell 把在终端运行的命令保存到文件中,这个文件就是shell程序简...

  • Shell编程-05-Shell中的特殊变量和扩展变量

    特殊变量     在Shell中的特殊变量主要分别两种位置参数变量、状态变量两种。 位置参数变量     Shel...

  • 编程方式

    穷举编程 ccv编程 百度编程 谷歌编程 gayhub编程 guess编程 no think 群友编程 小黄鸭调试...

  • 《Python语言程序设计》第一章.练习与作业

    编程题 1.1 编程题 1.2 编程题 1.3 编程题 1.4 编程题 1.5 编程题 1.6 编程题 1.7 编...

  • 探秘Spring AOP

    编程范式概览 面向过程编程 面向对象编程 函数式编程 事件驱动编程 面向切面编程 AOP是什么 是一种编程范式,不...

  • 探秘Spring AOP

    编程范式概览 主要有面向对象编程、面向过程编程、函数式编程、事件驱动编程、面向切面编程。面向过程编程是以过程为中心...

  • python面向对象1

    编程思想 编程思想:面向过程编程(穷人思想)、函数式编程、面向对象编程(富豪) 面向过程编程: 算法和逻辑 函数式...

  • 函数式编程-前置知识(1)

    什么是函数式编程 函数式编程是编程范式之一,我们常听说的编程范式还有面向过程编程,面向对象编程。 面向对象编程的思...

  • 面向指针编程(一)

    面向对象编程,面向设计模式编程(亦即设计模式),面向接口编程,面向模板编程(亦即泛型编程),面向函数编程(亦即函数...

  • AOP

    一、概述 编程范式概述 面向过程编程 面向对象编程 面向切面编程 函数式编程 事件驱动编程(GUI) 主要解决问题...

网友评论

    本文标题:05-Shell编程

    本文链接:https://www.haomeiwen.com/subject/wslifqtx.html