分布式--Linux Shell使用

  1. 云栖社区>
  2. 博客>
  3. 正文

分布式--Linux Shell使用

凌浩雨 2018-05-04 10:11:00 浏览600
展开阅读全文

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/bash
echo "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.sh
Hello 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/bash
echo "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/bash

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

打印结果:

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

\* 与@ 区别:

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

示例:

#!/bin/bash

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

注意使用的是反引号 ` 而不是单引号 '
打印结果:

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

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

num1=100
num2=100
if 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 5
do
    echo "The value is: $loop"
done
7). while语句
while condition
do
    command
done
8). 无线循环
while :
do
    command
done
或者
while true
do
    command
done
或者
for (( ; ; ))`
9). 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
10). break
#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done
11). continue
#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done
12). esac

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

4. 函数

1). 无参函数
#!/bin/bash
demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
2). 有参函数
#!/bin/bash
funWithParam(){
    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

网友评论

登录后评论
0/500
评论