Shell最后补充

1.数组:
shell中也存在数组的概念,不过只有一维数组的感念,不支持多维数组,初始化不用指定数组的大小,下标也是从0开始。
shell中的数组用括号来表示,元素用空格隔开。比如

[root@VM_0_11_centos shell]# array=(1 2 3)
[root@VM_0_11_centos shell]# array[0]=4
[root@VM_0_11_centos shell]# echo ${array[0]}
4

读取数组的格式就像上面的那样,格式为

${arrayName[n]} 

如果读取所有的元素需要用@或者*,比如

array=(1 2 3 4)
echo "array = $array"
for x in ${array[*]}
do
 echo "x = $x"
done

结果:

[root@VM_0_11_centos shell]# ./demo.sh 
array = 1
x = 1
x = 2
x = 3
x = 4
  1. case语句,case语句为多选语句,跟java的switch类似,格式如下:
case 值 in 
模式1)
    命令
    命令
    ;;
 模式2)
    命令
    命令
    ;;
 *)
     命令
    ;;
 esac     

看起来很奇怪,需要匹配的值后面需要加一个单边括号,并且每一个结束java用的是break,这里用的是两个;,比配所有用的是*,结束用的是case的反写,esac。

  1. 重定向
    当我们执行shell脚本或者shell命令的时候,大多数是通过键盘输入,然后执行的结果输出到屏幕上,我们就可以在屏幕上查看你输入的命令的执行结果了,但是如果我想将屏幕上输入命令的执行结果输出到文件中,这个时候应该怎么办呢? 这个时候就需要用到重定向了,就是将本来输出的屏幕上的结果给它输出到某一个文件中,比如说ll命令,ll命令或列出当前目录下的所有文件:
[root@VM_0_11_centos shell]# ll
total 28
drwxr-xr-x 4 root root 4096 Apr 24 15:05 data
-rwxr--r-- 1 root root  100 Apr 26 09:17 demo.sh
-rwxr-xr-x 1 root root  644 Apr 22 16:48 myShell.sh
-rwxr--r-- 1 root root  468 Apr 24 15:51 shell_backup.sh
-rwxrwxrwx 1 root root  587 Apr 22 18:11 shell_for.sh
-rwxrwxrwx 1 root root  104 Apr 23 17:32 shell_fun.sh
-rw-r--r-- 1 root root    0 Apr 26 09:41 ss.txt
-rwxr--r-- 1 root root  226 Apr 24 19:32 test.sh

但是我不想让列出的所有文件显示到屏幕上了,我想让他输出到某一个文件中,比如说ll_ceshi.txt这个文件,怎么办呢?代码入下:

[root@VM_0_11_centos shell]# ll >ll_ceshi.txt
[root@VM_0_11_centos shell]# 

注意后面跟了一个>文件,然后屏幕上没有输出了,
查看下ll_ceshi.txt这个文件:

[root@VM_0_11_centos shell]# cat ll_ceshi.txt
total 28
drwxr-xr-x 4 root root 4096 Apr 24 15:05 data
-rwxr--r-- 1 root root  100 Apr 26 09:17 demo.sh
-rw-r--r-- 1 root root    0 Apr 26 09:50 ll_ceshi.txt
-rwxr-xr-x 1 root root  644 Apr 22 16:48 myShell.sh
-rwxr--r-- 1 root root  468 Apr 24 15:51 shell_backup.sh
-rwxrwxrwx 1 root root  587 Apr 22 18:11 shell_for.sh
-rwxrwxrwx 1 root root  104 Apr 23 17:32 shell_fun.sh
-rw-r--r-- 1 root root    0 Apr 26 09:41 ss.txt
-rwxr--r-- 1 root root  226 Apr 24 19:32 test.sh

已经将结果写到文件中了,这就是重定向。
重定向有两个操作符一个是>,还有一个是>>,这两个的区别是:
当使用>时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。
但是当使用>>进行追加时,则不会删除原来已经存在的文件。

我们有时会使用echo xx >>file 这个命令就是这个原理。

还有一个知识点是 系统留了3个文件描述,0表示标准输入,1表示标准输出,就是将信息输出到屏幕,2表示错误输出,就是将错误信息输出到屏幕。
上面的例子ll >ll_ceshi.txt 和这个ll 1>ll_ceshi.tx效果是一样的,指的是将标准输入写到文件,如果换成2则表示将错误信息写到文件。

这个是重定向输出,还有一个重定向输入,这个以后再说吧

  1. /dev/null 2>&1
    我在看Zookeeper的启动命令的时候经常会发现一个一行命令
>/dev/null 2>&1

这个鬼。这个是什么呢?
这其实是两个命令,第一个>/dev/null就是将标准输出写到null文件,在Linux中/dev/null这个表示的是空文件,所有写入这个文件的内容都会丢失,就是所说的黑洞,其实这个命令的意思就是输出的内容给搞到一个不存在的地方,那么输出就不存在了,
还有后面那个2>&1 这个是重定向绑定,采用&符号可以将两个输出绑定到一起,就是将两个输出到一个地方,加上前面的>/dev/null这个命令,意思就是说不管是标准输出还是错误输出都给输出到一个不会显示的地方了去了
5. 获取当前执行脚本所在的目录
BASH_SOURCE[0] 等价于 BASH_SOURCE ,取得当前执行的 shell 文件所在的路径及文件名,比如在这个目录下编写一个/root/training/shell编一个test.sh脚本,

#!/bin/bash

path=${BASH_SOURCE}
echo $path

你在training这个目录下执行:

[root@VM_0_11_centos training]# shell/test.sh 
shell/test.sh
[root@VM_0_11_centos training]# 

输出的是你光标所在的目录到正真的脚本的目录,那么怎么获取脚本的目录呢:

#!/bin/bash
PATH_SHELL=${BASH_SOURCE}
PATH_DIR=$(dirname $PATH_SHELL)
cd $PATH_DIR
PATH=$(pwd)
echo $PAT

执行:

[root@VM_0_11_centos training]# shell/test.sh    
/root/training/shell

之前说过这个命令dirname获取的还是目录,base获取是文件名。

最后补充一个启动Zookeeper集群的脚本:

#!/bin/bash

HOST=(hadoop112 hadoop113 hadoop114)

for x in ${HOST[*]}
do
   ssh -tt root@$x -p 22 << remotessh
   echo "$x 正在执行命令 $1"
   zkServer.sh $1
   exit
remotessh

done

执行命令:
./zookeeper_shell.sh start

执行的结果就是 三台机器都会启动

参考:
https://www.runoob.com/linux/linux-shell-process-control.html
https://www.cnblogs.com/520playboy/p/6275022.html
https://www.cnblogs.com/520playboy/p/6275022.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟红尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值