博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式--Linux Shell使用
阅读量:6418 次
发布时间:2019-06-23

本文共 4668 字,大约阅读时间需要 15 分钟。

1. 简介

1). 介绍

Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务

2). Shell 脚本

Shell 脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。由于习惯的原因,简洁起见,本文出现的"shell编程"都是指shell脚本编程,不是指开发shell自身。

3). HelloWorld.sh

文件内容:

#!/bin/bashecho "Hello World !"

执行过程:

# 创建helloworld.sh文件[mazaiting@localhost shell]$ vim helloworld.sh# 第一种运行方法:作为解释器参数[mazaiting@localhost shell]$ /bin/sh helloworld.sh Hello World!# 第一种运行方法:作为可执行程序[mazaiting@localhost shell]$ ./helloworld.sh# 权限拒绝bash: ./helloworld.sh: Permission denied# 修改文件权限[mazaiting@localhost shell]$ chmod +x ./helloworld.sh # 执行[mazaiting@localhost shell]$ ./helloworld.shHello World!
img_d57adb11d8d2d3e79baeb647c61795ef.png
图1.png

2. 变量

1). 变量

test1.sh文件内容:

#!/bin/bash# 定义变量your_name="mazaiting"# 打印变量echo $your_name# 建议使用变量时加上{}echo ${your_name} # 重新为变量赋值your_name="tom"# 重新打印变量的值echo ${your_name}

执行过程:

img_b8cb300f17882dd2e5d88e3397883079.png
图2.png
2). 单双引号的区别
  • 单引号:
    单引号字符串的限制:
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
      str='this is a string'
  • 双引号:
    双引号的优点:
    • 双引号里可以有变量
    • 双引号里可以出现转义字符
your_name='qinjx'str="Hello, I know your are \"$your_name\"! \n"
3). 字符串操作

I. 拼接字符串

your_name="qinjx"greeting="hello, "$your_name" !"greeting_1="hello, ${your_name} !"echo $greeting $greeting_1

II. 获取字符串长度

string="abcd"echo ${#string} #输出 4

III. 提取子字符串

string="alibaba is a great company"echo ${string:1:4} #输出liba

IV. 查找子字符串

string="alibaba is a great company"echo `expr index "$string" is`
4). 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

  • 定义数组
    在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
  • 读取数组
    读取数组元素值的一般格式是:
${数组名[下标]}
  • 获取数组长度
# 取得数组元素的个数length=${#array_name[@]}# 或者length=${#array_name[*]}# 取得数组单个元素的长度lengthn=${#array_name[n]}
5). Shell 注释

以"#"开头的行就是注释,会被解释器忽略。sh里没有多行注释,只能每一行加一个#号。

#3. 传递参数

1). Shell 传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

示例:

#!/bin/bashecho "first param: ${0}"echo "second param: ${1}"echo "third param: ${2}"

打印结果:

img_6805251ee2496d31108cf2f4e848e7f2.png
图3.png
特殊字符处理参数:

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。如"*1 2 &n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ *相同,但是使用时加引号,并在引号中返回每个参数。如@"用「"」括起来的情况、以"12" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

示例:

#!/bin/bashecho "Shell 传递参数实例!";echo "第一个参数为:$1";echo "参数个数为:$#";echo "传递的参数作为一个字符串显示:$*";

打印结果:

$ chmod +x test.sh $ ./test.sh 1 2 3Shell 传递参数实例!第一个参数为:1参数个数为:3传递的参数作为一个字符串显示:1 2 3

\* 与@ 区别:

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
2). expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

示例:

#!/bin/bashval=`expr 2 + 2`echo "两数之和为 : $val"

注意使用的是反引号 ` 而不是单引号 '

打印结果:

两数之和为 : 4
3). printf 是比echo功能更强大的打印工具
4). test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

num1=100num2=100if test $[num1] -eq $[num2]then    echo '两个数相等!'else    echo '两个数不相等!'fi
5). if语句
num1=$[2*3]num2=$[1+5]if test $[num1] -eq $[num2]then    echo '两个数字相等!'else    echo '两个数字不相等!'fi
6). for语句
for loop in 1 2 3 4 5do    echo "The value is: $loop"done
7). while语句
while conditiondo    commanddone
8). 无线循环
while :do    commanddone或者while truedo    commanddone或者for (( ; ; ))`
9). case 语句
echo '输入 1 到 4 之间的数字:'echo '你输入的数字为:'read aNumcase $aNum in    1)  echo '你选择了 1'    ;;    2)  echo '你选择了 2'    ;;    3)  echo '你选择了 3'    ;;    4)  echo '你选择了 4'    ;;    *)  echo '你没有输入 1 到 4 之间的数字'    ;;esac
10). break
#!/bin/bashwhile :do    echo -n "输入 1 到 5 之间的数字:"    read aNum    case $aNum in        1|2|3|4|5) echo "你输入的数字为 $aNum!"        ;;        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"            break        ;;    esacdone
11). continue
#!/bin/bashwhile :do    echo -n "输入 1 到 5 之间的数字: "    read aNum    case $aNum in        1|2|3|4|5) echo "你输入的数字为 $aNum!"        ;;        *) echo "你输入的数字不是 1 到 5 之间的!"            continue            echo "游戏结束"        ;;    esacdone
12). esac

case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。

4. 函数

1). 无参函数
#!/bin/bashdemoFun(){    echo "这是我的第一个 shell 函数!"}echo "-----函数开始执行-----"demoFunecho "-----函数执行完毕-----"
2). 有参函数
#!/bin/bashfunWithParam(){    echo "第一个参数为 $1 !"    echo "第二个参数为 $2 !"    echo "第十个参数为 $10 !"    echo "第十个参数为 ${10} !"    echo "第十一个参数为 ${11} !"    echo "参数总数有 $# 个!"    echo "作为一个字符串输出所有参数 $* !"}funWithParam 1 2 3 4 5 6 7 8 9 34 73
3). 输入输出重定向
命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

4). 文件包含
. filename   # 注意点号(.)和文件名中间有一空格或source filename

转载地址:http://yzvra.baihongyu.com/

你可能感兴趣的文章
视频为什么可以压缩
查看>>
PS去水印
查看>>
Linux文件系统之目录绑定
查看>>
判断字符串是不是数字
查看>>
713B - 王泛森:如果让我重做一次研究生
查看>>
mac安装mysql
查看>>
你会划分和聚合子网吗?
查看>>
jsp中使用EL表达式的简写方式
查看>>
Exchange Server 2010安装后续工作
查看>>
Eclipse配置实现定制登录界面
查看>>
Rsync 学习笔记
查看>>
Yii2中加入yii2-admin模块
查看>>
mysql linux下高可用架构的简析及主、从复制的实战(一)
查看>>
运维经验分享:故障处理方法总结
查看>>
6、继承与面向对象设计
查看>>
我的友情链接
查看>>
Android 之活动任务堆栈详解
查看>>
Delphi 的消息机制浅探一
查看>>
linux 配置了zookeeper,启动maven工程卡住
查看>>
Apache下载apk 文件后缀变 .txt问题
查看>>