shell数组元素有空格_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 = 1x = 1x = 2x = 3x = 4
2. case语句,case语句为多选语句,跟java的switch类似,格式如下:
case 值 in 模式1) 命令命令 ;; 模式2) 命令命令 ;; *) 命令 ;; esac
shell创建文件并写入内容看起来很奇怪,需要匹配的值后⾯需要加⼀个单边括号,并且每⼀个结束java⽤的是break,这⾥⽤的是两个;,⽐配所有⽤的是*,结束⽤的是case的反写,esac。
3. 重定向
当我们执⾏shell脚本或者shell命令的时候,⼤多数是通过键盘输⼊,然后执⾏的结果输出到屏幕上,我们就可以在屏幕上查看你输⼊的命令的执⾏结果了,但是如果我想将屏幕上输⼊命令的执⾏结果输出到⽂件中,这个时候应该怎么办呢? 这个时候就需要⽤到重定向了,就是将本来输出的屏幕上的结果给它输出到某⼀个⽂件中,⽐如说ll命令,ll命令或列出当前⽬录下的所有⽂件:
[root@VM_0_11_centos shell]# lltotal 28drwxr-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 roo
但是我不想让列出的所有⽂件显⽰到屏幕上了,我想让他输出到某⼀个⽂件中,⽐如说这个⽂件,怎么办呢?代码⼊下:
[root@VM_0_11_centos shell]# ll >[root@VM_0_11_centos shell]#
注意后⾯跟了⼀个>⽂件,然后屏幕上没有输出了,查看下这个⽂件:
[root@VM_0_11_centos shell]# cat al 28drwxr-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--
已经将结果写到⽂件中了,这就是重定向。重定向有两个操作符⼀个是>,还有⼀个是>>,这两个的区别是:当使⽤>时,会判断右边的⽂件存
不存在,如果存在的话就先删除,然后创建⼀个新的⽂件,不存在的话则直接创建。但是当使⽤>>进⾏追加时,则不会删除原来已经存在的⽂件。
我们有时会使⽤echo xx >>file 这个命令就是这个原理。
还有⼀个知识点是 系统留了3个⽂件描述,0表⽰标准输⼊,1表⽰标准输出,就是将信息输出到屏幕,2表⽰错误输出,就是将错误信息输出到屏幕。上⾯的例⼦ll > 和这个ll 1>效果是⼀样的,指的是将标准输⼊写到⽂件,如果换成2则表⽰将错误信息写到⽂件。
这个是重定向输出,还有⼀个重定向输⼊,这个以后再说吧
4. /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/bashpath=${BASH_SOURCE}echo $path
你在training这个⽬录下执⾏:
[root@VM_0_11_centos training]# shell/test.sh shell/test.sh[root@VM_0_11_centos training]#
输出的是你光标所在的⽬录到正真的脚本的⽬录,那么怎么获取脚本的⽬录呢:
#!/bin/bashPATH_SHELL=${BASH_SOURCE}PATH_DIR=$(dirname $PATH_SHELL)cd $PATH_DIRPATH=$(pwd)echo $PAT
执⾏:
[root@VM_0_11_centos training]# shell/test.sh /root/training/shell
之前说过这个命令dirname获取的还是⽬录,base获取是⽂件名。
最后补充⼀个启动Zookeeper集的脚本:
#!/bin/bashHOST=(hadoop112 hadoop113 hadoop114)for x in ${HOST[*]}do ssh -tt root@$x -p 22 <
执⾏命令: ./zookeeper_shell.sh start
执⾏的结果就是 三台机器都会启动
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论