shell 基础

介绍

Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
Shell初学者请注意,在平常应用中,建议不要用 root 帐号运行 Shell 。作为普通用户,不管您有意还是无意,都无法破坏系统;但如果是 root,那就不同了,只要敲几个字母,就可能导致灾难性后果。
之所以要使用Shell脚本是基于:
• 简单性:Shell是一个高级语言;通过它,你可以简洁地表达复杂的操作。
• 可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。
• 开发容易:可以在短时间内完成一个功能强大又妤用的脚本。
但是,考虑到Shell脚本的命令限制和效率问题,下列情况一般不使用Shell:
资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)。
• 需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理)。
• 有跨平台(操作系统)移植需求(一般使用C 或Java)。
• 复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)。
• 对于影响系统全局性的关键任务应用。
• 对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵、破解、恶意破坏等等。
• 项目由连串的依赖的各个部分组成。
• 需要大规模的文件操作。
• 需要多维数组的支持。
• 需要数据结构的支持,比如链表或数等数据结构。
• 需要产生或操作图形化界面 GUI。
• 需要直接操作系统硬件。
• 需要 I/O 或socket 接口。
• 需要使用库或者遗留下来的老代码的接口。
• 私人的、闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)


 

变量

打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。
输入一些代码:
#!/bin/bash
echo "Hello World !"
“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令用于向窗口输出文本。

运行Shell脚本有两种方法。
• 作为可执行程序
将上面的代码保存为test.sh,并 cd 到相应目录:
chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本
注意,一定要写成./test.sh,而不是test.sh。运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。
通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。
这里的"系统",其实就是shell这个应用程序(想象一下Windows Explorer),但我故意写成系统,是方便理解,既然这个系统就是指shell,那么一个使用/bin/sh作为解释器的脚本是不是可以省去第一行呢?是的。

• 作为解释器参数
这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:
/bin/sh test.sh/bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
再看一个例子。下面的脚本使用 read 命令从 stdin 获取输入并赋值给 PERSON 变量,最后在 stdout 上输出:
#!/bin/bash 
echo "What is your name?"read PERSON
echo "Hello, $PERSON"

运行脚本:
chmod +x ./test.sh
$./test.sh

What is your name?
mozhiyan
Hello, mozhiyan


定义变量时,变量名不加美元符号($),如:
variableName="value"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
• 首个字符必须为字母(a-z,A-Z)。
• 中间不能有空格,可以使用下划线(_)。
• 不能使用标点符号。
• 不能使用bash里的关键字(可用help命令查看保留关键字)。

使用一个定义过的变量,只要在变量名前面加美元符号即可
our_name="mozhiyan"
echo $your_name
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
推荐给所有变量加上花括号,这是个好的编程习惯。
已定义的变量,可以被重新定义
使用 unset 命令可以删除变量。语法:
unset variable_name

变量类型
运行shell时,会同时存在三种变量:
• 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
• 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
• 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

来自 <http://www.runoob.com/linux/linux-shell-variable.html>


 

文件管理

命令:cat
cat 命令用于连接文件并打印到标准输出设备上。

cat [-AbeEnstTuv] [--help] [--version] fileName
-n 或 --number:由 1 开始对所有输出的行数编号。
-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
-s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
-v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
-E 或 --show-ends : 在每行结束处显示 $。
-T 或 --show-tabs: 将 TAB 字符显示为 ^I。
-A, --show-all:等价于 -vET。
-e:等价于"-vE"选项;
-t:等价于"-vT"选项;
实例:
把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里:
cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里:
cat -b textfile1 textfile2 >> textfile3
清空 /etc/test.txt 文档内容:
cat /dev/null > /etc/test.txt
cat 也可以用来制作镜像文件。例如要制作软盘的镜像文件,将软盘放好后输入:
cat /dev/fd0 > OUTFILE
相反的,如果想把 image file 写到软盘,输入:
cat IMG_FILE > /dev/fd0
注:
• 1. OUTFILE 指输出的镜像文件名。
• 2. IMG_FILE 指镜像文件。
• 3. 若从镜像文件写回 device 时,device 容量需与相当。
• 4. 通常用制作开机磁片。

来自 <http://www.runoob.com/linux/linux-comm-cat.html>

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
#!/bin/bash
val=`expr 2 + 2` echo "两数之和为 : $val

 


磁盘管理

Linux cd命令用于切换当前工作目录至 dirName(目录参数)。
其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home 目录 (也就是刚 login 时所在的目录)。
另外,"~" 也表示为 home 目录 的意思,"." 则是表示目前所在的目录,".." 则表示目前目录位置的上一层目录。
语法
cd [dirName]
dirName:要切换的目标目录。
实例
跳到 /usr/bin/ :
cd /usr/bin
跳到自己的 home 目录 :
cd ~
跳到目前目录的上上两层 :
cd ../..

来自 <http://www.runoob.com/linux/linux-comm-cd.html>


 

vi

vi/vim 的使用
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:
命令模式:
用户刚刚启动 vi/vim,便进入了命令模式。
此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。
以下是常用的几个命令:
• i 切换到输入模式,以输入字符。
• x 删除当前光标所在处的字符。
• : 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。
命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
输入模式
在命令模式下按下i就进入了输入模式。
在输入模式中,可以使用以下按键:
• 字符按键以及Shift组合,输入字符
• ENTER,回车键,换行
• BACK SPACE,退格键,删除光标前一个字符
• DEL,删除键,删除光标后一个字符
• 方向键,在文本中移动光标
• HOME/END,移动光标到行首/行尾
• Page Up/Page Down,上/下翻页
• Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
• ESC,退出输入模式,切换到命令模式
底线命令模式
在命令模式下按下:(英文冒号)就进入了底线命令模式。
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
在底线命令模式中,基本的命令有(已经省略了冒号):
• q 退出程序
• w 保存文件
按ESC键可随时退出底线命令模式。

来自 <http://www.runoob.com/linux/linux-vim.html>


 

ll,ls

1. ls 命令可以说是linux下最常用的命令之一。ll不是命令,是ls -l的别名相当于windows里的快捷方式。所以"ll"和“ls -l”的功能是相同的。
2.ll 列出来的结果详细,有时间,是否可读写等信息,像windows里的 详细信息;ls 只列出文件名或目录名 就像windows里的 列表。
来自 <https://zhidao.baidu.com/question/489475323326206572.html> >

ll 命令列出的信息更加详细,有时间,是否可读写等信息 
ll命令和ls -l命令结果区别:
上面结果说明:
各个字段的含义:
文件属性 文件数 拥有者 所属的group 文件大小 建档日期 文件名
drwx------ 2 Guest users 1024 Nov 21 21:05 Mail
-rwx--x--x 1 root root 89080 Nov 7 22:41 tar*
-rwxr-xr-x 1 root bin 5013 Aug 15 9:32 uname*
lrwxrwxrwx 1 root root 4 Nov 24 19:30 zcat->gzip
-rwxr-xr-x 1 root bin 308364 Nov 29 7:43 zsh*
-rwsr-x--- 1 root bin 9853 Aug 15 5:46 su*
意义:
第一个栏位,表示文件的属性。Linux的文件基本上分为三个属性:可读(r),可写(w),可执行(x)。但是这里有十个格子可以添(具体程序实现时,实际上是十个bit位)。第一个小格是特殊表示格,表示目录或连结文件等等,d表示目录,例如drwx------;l表示连结文件,如lrwxrwxrwx;如果是以一横“-”表示,则表示这是文件。其余剩下的格子就以每3格为一个单位。因为Linux是多用户多任务系统,所以一个文件可能同时被许多人使用,所以我们一定要设好每个文件的权限,其文件的权限位置排列顺序是(以-rwxr-xr-x为例):
    rwx(Owner)r-x(Group)r-x(Other)
    这个例子表示的权限是:使用者自己可读,可写,可执行;同一组的用户可读,不可写,可执行;其它用户可读,不可写,可执行。另外,有一些程序属性的执行部分不是X,而是S,这表示执行这个程序的使用者,临时可以有和拥有者一样权力的身份来执行该程序。一般出现在系统管理之类的指令或程序,让使用者执行时,拥有root身份。
  第二个栏位,表示文件个数。如果是文件的话,那这个数目自然是1了,如果是目录的话,那它的数目就是该目录中的文件个数了。
    第三个栏位,表示该文件或目录的拥有者。若使用者目前处于自己的Home,那这一栏大概都是它的账号名称。
    第四个栏位,表示所属的组(group)。每一个使用者都可以拥有一个以上的组,不过大部分的使用者应该都只属于一个组,只有当系统管理员希望给予某使用者特殊权限时,才可能会给他另一个组。
    第五栏位,表示文件大小。文件大小用byte来表示,而空目录一般都是1024byte,你当然可以用其它参数使文件显示的单位不同,如使用ls –k就是用kb莱显示一个文件的大小单位,不过一般我们还是以byte为主。
    第六个栏位,表示创建日期。以“月,日,时间”的格式表示,如Aug 15 5:46表示8月15日早上5:46分。
    第七个栏位,表示文件名。我们可以用ls –a显示隐藏的文件名。 
ll会列出该文件下的所有文件信息,包括隐藏的文件,而ls -l只列出显式文件,说明这两个命令还是不等同的!

ls 只列出文件名或目录名
列表
ll -t 是降序, ll -t | tac 是升序
ll不是命令,是ls -l的别名

ls 命令可以说是linux下最常用的命令之一。
-a 列出目录下的所有文件,包括以 . 开头的隐含文件。
-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。
-c 输出文件的 i 节点的修改时间,并以此排序。
-d 将目录象文件一样显示,而不是显示其下的文件。
-i 输出文件的 i 节点的索引信息。
-l 列出文件的详细信息。
-m 横向输出文件名,并以“,”作分格符。
-n 用数字的 UID,GID 代替名称。
-o 显示文件的除组信息外的详细信息。
-p -F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通
文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套
接字(sockets)。
-q 用?代替不可输出的字符。
-r 对目录反向排序。
-s 在每个文件名后输出该文件的大小。
-t 以时间排序。
说明以最近修改的日期进行排序!
 -u 以文件上次被访问的时间排序。
-A 显示除 “.”和“..”外的所有文件。
-B 不输出以 “~”结尾的备份文件。
-L 列出链接文件名而不是链接到的文件。
-N 不限制文件长度。
-Q 把输出的文件名用双引号括起来。
-R 列出所有子目录下的文件。
-S 以文件大小排序。
-X 以文件的扩展名(最后一个 . 后的字符)排序。
-1 一行只输出一个文件。
--color=no 不显示彩色文件名
--help 在标准输出上显示帮助信息。
--version 在标准输出上输出版本信息并退出。
只列出子目录
1. ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)
2. ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)
计算当前目录下的文件数和目录数
下面命令可以分别计算当前目录下的文件和目录个数:
# ls -l * |grep "^-"|wc -l ---- to count files
# ls -l * |grep "^d"|wc -l ----- to count dir
显示彩色目录列表
打开/etc/bashrc, 加入如下一行:
alias ls="ls --color"
下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:
1. 蓝色-->目录
2. 绿色-->可执行文件
3. 红色-->压缩文件
4. 浅蓝色-->链接文件
5. 灰色-->其他文件
ls -tl --time-style=full-iso sshd
ls -ctl --time-style=long-iso

来自 <https://blog.csdn.net/xiaoma123_1/article/details/79435559>


 

cp

Linux cp命令主要用于复制文件或目录。
语法
cp [options] source dest

cp [options] source... directory
参数说明:
• -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
• -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
• -f:覆盖已经存在的目标文件而不给出提示。
• -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
• -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
• -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
• -l:不复制文件,只是生成链接文件。
实例
使用指令"cp"将当前目录"test/"下的所有文件复制到新目录"newtest"下,输入如下命令:
$ cp –r test/ newtest
注意:用户使用该指令复制目录时,必须使用参数"-r"或者"-R"。

来自 <http://www.runoob.com/linux/linux-comm-cp.html>


 

diff

Linux diff命令用于比较文件的差异。
diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
语法
diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
参数:
• -<行数> 指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
• -a或--text  diff预设只会逐行比较文本文件。
• -b或--ignore-space-change  不检查空格字符的不同。
• -B或--ignore-blank-lines  不检查空白行。
• -c  显示全部内文,并标出不同之处。
• -C<行数>或--context<行数> 与执行"-c-<行数>"指令相同。
• -d或--minimal  使用不同的演算法,以较小的单位来做比较。
• -D<巨集名称>或ifdef<巨集名称> 此参数的输出格式可用于前置处理器巨集。
• -e或--ed  此参数的输出格式可用于ed的script文件。
• -f或-forward-ed  输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
• -H或--speed-large-files  比较大文件时,可加快速度。
• -l<字符或字符串>或--ignore-matching-lines<字符或字符串> 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
• -i或--ignore-case  不检查大小写的不同。
• -l或--paginate  将结果交由pr程序来分页。
• -n或--rcs  将比较结果以RCS的格式来显示。
• -N或--new-file  在比较目录时,若文件A仅出现在某个目录中,预设会显示:
• Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
• -p  若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
• -P或--unidirectional-new-file  与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
• -q或--brief  仅显示有无差异,不显示详细的信息。
• -r或--recursive  比较子目录中的文件。
• -s或--report-identical-files  若没有发现任何差异,仍然显示信息。
• -S<文件>或--starting-file<文件> 在比较目录时,从指定的文件开始比较。
• -t或--expand-tabs  在输出时,将tab字符展开。
• -T或--initial-tab  在每行前面加上tab字符以便对齐。
• -u,-U<列数>或--unified=<列数> 以合并的方式来显示文件内容的不同。
• -v或--version  显示版本信息。
• -w或--ignore-all-space  忽略全部的空格字符。
• -W<宽度>或--width<宽度> 在使用-y参数时,指定栏宽。
• -x<文件名或目录>或--exclude<文件名或目录> 不比较选项中所指定的文件或目录。
• -X<文件>或--exclude-from<文件> 您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。
• -y或--side-by-side  以并列的方式显示文件的异同之处。
• --help  显示帮助。
• --left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
• --suppress-common-lines  在使用-y参数时,仅显示不同之处。
实例1:比较两个文件

 


上面的"3c3"和"8c8"表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。
实例2:并排格式输出

 


说明:
• "|"表示前后2个文件内容有不同
• "<"表示后面文件比前面文件少了1行内容
• ">"表示后面文件比前面文件多了1行内容

来自 <http://www.runoob.com/linux/linux-comm-diff.html>

 

mongoimport用法

说明
mongoimport 支持将json或csv格式的数据文件导入到mongodb数据库,该命令与mongoexport结合使用。

命令的执行要求当前用户对数据库有readWrite权限;
导入命令要求在mongos或副本集主节点上执行。

示例用法

./bin/mongoimport --host 127.0.0.1 --port 27017 -d appdb -c T_TEST_DATA_1 -u appuser -p appuser@2016 --numInsertionWorkers 50 --file export/T_TEST_DATA.json

参数说明

参数名参数值
host[h] 主机
port 端口
db[d] 目标数据库
username[u] 用户名
password[p] 密码
authenticationDatabase 鉴权数据库,不指定则使用database参数
collection[c] 目标Collection,不指定则采用文件名称
drop 指定该选项,则导入前删除表
file 目标导入文件
type 格式类型,默认json
mode 导入模式,有insert、upsert、merge,默认insert
numInsertionWorkers 并发数

 暂时无法远程还原,需要复制到本地文件夹进行还原(scp)

mongorestore --host 数据库地址 --port 端口 -u 用户名 -p 密码 --db 导入数据库名 --dir 文件目录

sudo 用管理员权限运行

tar -zxvf  解压缩GZ文件

apt-get install xxx   安装XX包

df -h 查看空间使用情况

rm -rf 删除文件夹及目录下文件

posted on 2019-02-22 14:42  椰汁黑糯米  阅读(142)  评论(0编辑  收藏  举报

导航