Bootstrap

总结:linux笔记-001

目录

一、chmod a+x test.sh

二、  sh和bash的区别

三、Shell脚本的执行

四、Linux export的作用

六、sudo命令

七、linux的~和/root 和/home有什么区别?

1、root用户和其它普通用户的区别

2、~

3、/home

八、查看当前登录用户

九、linux的几种shell

十、shell如何执行用户的指令

十一、Shell环境和子Shell

十二、 $( ) 与 ` ` (反引号)与 ${ }

十三、shell脚本中 “set -e” 的作用

十四、linux之cut命令

十五、grep -v grep

十六、awk命令

十七、xargs命令详解

十八、uname命令

十九、 while [ -h "$PRG" ] ; do

二十、  > /dev/null

二十一、 expr 命令

二十二、 dirname与basename

二十三、exec命令

二十四、linux一些常用条件语句技巧

二十五、shell 参数换行


一、chmod a+x test.sh

如:chmod a+x test.sh

意思是给所有的用户添加执行test.sh 这个文件的权限

a是指所有的用户组,包括root用户组,文件拥有者的用户组,还有其他用户组。
+x是指添加执行权限。

chmod使用方式:

使用方式 : chmod mode file

参数:

mode : 权限设定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...],其中
u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人, a 表示这三者皆是。
+ 表示增加权限 、 - 表示取消权限 、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。

二、  sh和bash的区别

sh(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。

bash(Bourne-Again Shell)是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。

从开发年代看,bash是sh的增强版本,在我们平常实地操作的时候如果sh这个命令不灵了我们应当使用bash。

linux里source、sh、bash、./有什么区别

三、Shell脚本的执行


Shell脚本的执行通常可以采用以下几种方式。

1、bash script-name 或 sh script-name     这是当脚本文件本身没有执行权限时常使用的方法

2、path/script-name 或./script-name    在当前路径下执行脚本,需要将脚本文件的权限改为可执行。然后使用脚本的绝对路径或相对路径就可以直接执行脚本了。

3、source script-name 或 .  script-name 这种方法通常是使用source或 “.”(点号)读入或加载指定的Shell脚本文件,然后依次执行指定的Shell脚本中的语句。这些语句将在当前父 shell 脚本进程中执行(其他几种模式都会启用新的进程执行该脚本进程)。
 

四、Linux export的作用

我们经常会涉及到jdk环境变量配置,我们配置环境变量的时候会用到export命令,如下:

或者形如:

export功能说明:设置或显示环境变量。

语 法:export [-fnp][变量名称]=[变量设置值]

补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。

五、Linux /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc文件的作用和区别

/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc很容易混淆,他们之间有什么区别?它们的作用到底是什么?

-----------------------------------------------

/etc/profile: 用来设置系统环境参数,比如$PATH. 这里面的环境变量是对系统内所有用户生效的。

~/.bash_profile: 用来设置一些环境变量,功能和/etc/profile 类似,但是这个是针对用户来设定的,也就是说,你在/home/user1/.bash_profile 中设定了环境变量,那么这个环境变量只针对 user1 这个用户生效。

-----------------------------------------------

/etc/bashrc:这个文件主要保存个人的一些个性化设置,如命令别名、路径等。,如自定义一些变量(alias tovm='ssh [email protected]',后续再SSH到10.10.10.10这台机器,只需要输入tovm命令即可)对系统内所有用户生效。只要用户运行bash命令,那么这里面的东西就在起作用。

下面是个例子:

# User specific aliases and functions

PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
.GBK
export PATH LANG
alias rm='rm -i'
alias ls='/bin/ls -F --color=tty --show-control-chars'
....

~/.bashrc: 作用类似于/etc/bashrc, 只是针对用户自己而言,不对其他用户生效。 另外/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系。

-----------------------------------------------

Linux 系统中很多 shell,包括bash,sh,zsh,dash 和 korn 等,不管哪种 shell 都会有一个 .bashrc 的隐藏文件,它就相当于 shell 的配置文件。

一般会有多个 .bashrc 文件,使用 find 命令可以查看:

$ sudo find / -name .bashrc

/root/.bashrc
/etc/skel/.bashrc
/home/cloud-admin/.bashrc
/home/cloud-user/.bashrc

六、sudo命令

sudo命令详解

1、简介

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。

这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。

sudo 表示 “superuser do”。 它允许已验证的用户以其他用户的身份来运行命令。

2、命令原理

sudo使一般用户不需要知道超级用户的密码即可获得权限首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers,即完成对该用户的授权(此时该用户称为“sudoer”);如下配置:

sudo能够提供日志,完整地记录每一个用户使用sudo做了些什么,而且能将日志传到中心主机或者日志server。

那么,linux 哪些命令需要sudo?

3、实践

我们hubble-agent也是一个账号(但是在/home下面看不到),有时候会碰到sudo配置有问题的情况,导致执行不了命令。

如何看是否是sudo权限的问题?

可切换到账号下执行sudo命令:sudo -u hubble-agent ls,即用sudo权限执行ls命令,如下是正常的:

 有时候碰到不正常的情况:

这就是sudo权限配置有问题了,解决方案:chown root:root /usr/bin/sudo && chmod 4755 /usr/bin/sudo

参考:root - /usr/bin/sudo must be owned by uid 0 and have the setuid bit set - Ask Ubuntu 

chown(英文全拼:change owner)命令用于设置文件所有者和文件关联组的命令。

七、linux的~和/root 和/home有什么区别?

1、root用户和其它普通用户的区别

        1、目录位置不一样:root的目录是/root,其它用户在/home下

        2、权限不一样:root几乎拥有所有权限,其它用户需要配置,如下,weiwei用户没看查看权限

2、~

~:即家目录,谁的家?登录账号的家,举个例子:

ssh [email protected]  : 用root账号登录到10.10.10.12,那么登录成功后的~即表示root的家目录,cd /root(注意,root账号是/root,不存在/home/root)和cd ~是一个意思。

ssh [email protected]  : 用weiwietest账号登录到10.10.10.12,那么登录成功后的~即表示weiwietest的家目录,cd /home/weiwietest和cd ~是一个意思。

3、/home

/home目录下存放着不同的用户账号目录,如下所示:

八、查看当前登录用户

1、查看我此时用什么账号登录的:whoami

2、查看总共有哪些登录用户:w

九、linux的几种shell

vim /etc/shells

Linux系统提供多种不同的Shell以供选择。

常用的有Bourne Shell(简称sh)、C-Shelll(简称csh)、Korn Shell(简称ksh)和Bourne Again Shell (简称bash)。

  • Bourne Shell是AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。
  • C Shell是加州伯克利大学的Bill Joy为BSD Unix开发的,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与BourneShell并不兼容。
  • Korn Shell是AT&T Bell实验室的David Korn开发的,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。
  • Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点

注意:/bin/sh是最原始的shell,现在几乎所有的linux都把bash shell设为默认的shell,即使/bin/sh 也是链接至/bin/bash

我们现在只要登录到linux,那么用的都是bash shell。

十、shell如何执行用户的指令

shell有两种执行指令的方式:

第一种方法是用户事先编写一个sh脚本文件,内含shell脚本,而后使用shell程序执行该脚本,这种方式,我们习惯称为shell编程。

第二种形式,则是用户直接在shell界面上执行shell命令,由于shell界面的关系,大家都习惯一行行的书写,很少写出成套的程序来一起执行,所以也称命令行

总结:shell可以说只是为用户与机器之间搭建成的一个桥梁,让我们能够通过shell来对计算机进行操作和交互,从而达到让计算机为我们服务的目的。

十一、Shell环境和子Shell

Linux执行脚本有两种方式,主要区别在于是否建立子shell

1、像sh,bash,./命令是用来执行shell脚本的, 在bash/sh命令下,脚本文件可以无"执行权限",即没有rwx中的x权限。而 对于./命令,脚本文件必须要有执行权限

      创建子shell,在当前bash环境下再新建一个子shell执行脚本中的命令子shell继承父shell的变量,但子shell不能使用父shell的变量,除非使用export声明为环境变量

      子Shell从父Shell继承得来的属性如下:

               当前工作目录

               环境变量

               标准输入、标准输出和标准错误输出

               所有已打开的文件标识符

       子Shell不能从父Shell继承的属性:

               除环境变量和.bashrc文件中定义变量之外的Shell变量

2、source和.执行文件不会生成子shell

     不创建子shell,在当前shell环境下读取并执行脚本中的命令,相当于顺序执行脚本里面的命令

3、命令如何执行?

假设敲下命令行:echo hello
shell是如何让echo命令执行起来的?

shell首先读取命令行、解析命令行,解析期间会发现echo是一个外部命令。解析通过后,那么就准备让echo命令执行起来。

十二、 $( ) 与 ` ` (反引号)与 ${ }

1、$( ) 与 ` ` (反引号)
在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用的。

2、${ }

${ } 用来作变量替换。
一般情况下,$var 与 ${var} 并没有啥不一样。
但是用 ${ } 会比较精确的界定变量名称的范围,比方说:
$ A=B
$ echo $AB
原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,
但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来…
若使用 ${ } 就没问题了:
$ echo ${A}B
BB

3、 $(( ))

它是用来作整数运算的。
在 bash 中,$(( )) 的整数运算符号大致有这些:
+ - * / :分别为 "加、减、乘、除"。
% :余数运算
& | ^ !:分别为 "AND、OR、XOR、NOT" 运算。

例:
$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19
$ echo $(( (a+b)/c ))
6
$ echo $(( (a*b)%c))
1

在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用,如:
$(( $a + $b * $c)) 也可得到 19 的结果

此外,$(( )) 还可作不同进位(如二进制、八进位、十六进制)作运算呢,只是,输出结果皆为十进制而已:
echo $((16#2a)) 结果为 42 (16进位转十进制)
以一个实用的例子来看看吧:
假如当前的   umask 是 022 ,那么新建文件的权限即为:
$ umask 022
$ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
644

事实上,单纯用 (( )) 也可重定义变量值,或作 testing:
a=5; ((a++)) 可将 $a 重定义为 6 
a=5; ((a–)) 则为 a=4
a=5; b=7; ((a < b)) 会得到   0 (true) 的返回值。
常见的用于 (( )) 的测试符号有如下这些:
<:小于
>:大于
<=:小于或等于
>=:大于或等于
==:等于
!=:不等于

十三、shell脚本中 “set -e” 的作用

-----------------------------------------------------------
#!/bin/bash

set -e

command 1
command 2
...

exit 0
----------------------------------------------------------
你写的每个脚本都应该在文件开头加上set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出。
这样的好处是防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉。

如果要增加可读性,可以使用set -o errexit,它的作用与set -e相同。

十四、linux之cut命令

Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字。

十五、grep -v grep

很多时候,可以看到命令

ps -ef|grep gogs | grep -v grep | wc -l

其中的grep -v grep 是干啥的呢 ?

很简单 ,为了去除包含grep的进程行 ,避免影响最终数据的正确性 。

比如 ,

[isTester@iZ94b31ttqsZ]~# ps -ef|grep gogs
isTester.com 1883 1844 0 13:55 pts/0 00:00:00 grep gogs
git 6583 1 0 2018 ? 01:25:46 ./gogs web

加上grep -v grep ,就只剩下1行记录 。

[isTester@iZ94b31ttqsZ]~# ps -ef|grep gogs | grep -v grep
git 6583 1 0 2018 ? 01:25:46 ./gogs web

常用选项:

  -E :开启扩展(Extend)的正则表达式。

  -me :忽略大小写(ignore case)。

  -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。

  -n :显示行号

  -w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker

  -c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。

  -o :只显示被模式匹配到的字符串。

  --color :将匹配到的内容以颜色高亮显示。

  -A  n:显示匹配到的字符串所在的行及其后n行,after

  -B  n:显示匹配到的字符串所在的行及其前n行,before

  -C  n:显示匹配到的字符串所在的行及其前后各n行,context

十六、awk命令

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格或 "[tab]键"为默认分隔符将每行切片,切开的部分再进行各种分析处理。

十七、xargs命令详解

linux的命令中很多的命令的设计是先从命令行参数中获取参数,然后从标准输入中读取,xargs命令可以通过管道接受字符串并将接收到的字符串通过空格分割成许多参数(默认情况下是通过空格分割) 然后将参数传递给其后面的命令,作为后面命令的命令行参数;

find /sbin -perm +700 |ls -l       #这个命令是错误的
find /sbin -perm +700 |xargs ls -l   #这样才是正确的

十八、uname命令

Linux uname(英文全拼:unix name)命令用于显示系统信息。

uname 可显示电脑以及操作系统的相关信息。

十九、 while [ -h "$PRG" ] ; do

-h 表示判断一个文件存在并且是一个软链接。
当文件存在且是一个软链接时,判断的结果是True。

我们tomcat的startup.sh中有个代码块:

#读取脚本名
PRG="$0"
#test –h File 文件存在并且是一个符号链接(同-L)
while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`  //获取脚本所在路径或者链接指向的脚本所在的完整路径(包含脚本名称)
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done

二十、  > /dev/null

意思就是输出到/dev/null。

那什麼是 /dev/null 呢,/dev/null 是 Unix/Linux 里的【无底洞】

任何的 output 送去了【无底洞】就再也没了。 也就是将产生的所有信息丢掉

那麼有人问,在什麼情况下要把 output 送去这无底洞呢?这里没有标准答案,不过一般呢,要是你不想看到 output 或者output 太多太大了,有可能把硬碟给挤爆了的时候,程序的设计就会考虑把 output 送到 /dev/null 了。

另外还有 >/dev/null 2>&1 这样的写法。

这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃.  下面就为大家来说一下, command > file 2>file  与command > file 2>&1 有什么不同的地方.

      首先 command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file中,command  > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道.

      而command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容.

      从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会用command > file 2>&1 这样的写法。

其它:

1、>
直接把内容生成到指定文件,会覆盖源文件中的内容。

2、>>
尾部追加,不会覆盖掉文件中原有的内容,相当于append

3、<

command < input:表示的是输入重定向的意思,就是把<后面跟的文件取代键盘作为新的输入设备。

如:

# cat user.txt
dev:123456
# chpasswd < user.txt

如:

4、 >

> file

">" 单大于号,输出重定向符,没有命令在它之前,这会创建一个新的空文件(如果已经存在这个文件,则会将内容置位空),作用是覆盖文件,将左侧的内容覆盖有右侧。上面命令由于左侧没有内容,因此将file清空了。如果有两个文件file1和file2,执行 cat file1 > file2,则将文件1的内容覆盖掉文件2的。因此">"左侧可以使用其它命令组合并将输出当做右侧文件的输入。
 

二十一、 expr 命令

https://www.cnblogs.com/boshen-hzb/p/6080118.html

1、用作算术运算(作用和$(())差不多

一般的用法是使用expr做算术运算,如:
[root@centos ~]# expr 10 + 20
30

2、 expr用于字符串比较
字符串比较:
expr 如果成功,返回值1,任何其他值为无效或错误。如下面的例子测试两个字符串是否相等,这里字符串为“hello”和hello”。
$value=hello
$expr $value = "hello"
1
#这时候shell的返回值为0。
$echo $?
0

3、expr用作模式匹配

expr也有模式匹配功能。可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任
何字符重复0次或多次。
$value=accounts.doc
$expr $value : '.*'
12

在expr中可以使用字符串匹配操作,这里使用模式. d o c抽取文件附属名。
$expr $value : '(.*).doc'
accounts

二十二、 dirname与basename

1、dirname命令去除文件名中的非目录部分,删除最后一个“\”后面的路径,显示父目录。 语法:dirname [选项] 参数
2、basename命令用于打印目录或者文件的基本名称,显示最后的目录名或文件名。语法:basename [选项] 参数

1、dirname
[root@liang ~]# dirname /etc/httpd/
/etc
[root@liang ~]# dirname /etc/
/
[root@liang ~]# dirname /etc/httpd/conf/httpd.conf
/etc/httpd/conf
2、basename
[root@liang ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/tmp
[root@liang ~]# basename $PATH
tmp
[root@liang ~]# basename /etc/httpd/conf/httpd.conf
httpd.conf

二十三、exec命令

exec命令 用于调用并执行指令的命令。

exec命令通常用在shell脚本程序中,可以调用其他的命令。

如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端

二十四、linux一些常用条件语句技巧

1、if [ "x${var}" = "x" ]

其实就是判断${var}是否为空的意思

2、if [ X"$?" == X"0" ]

其实就是判断$?是否为0,即判断执行结果是否正确

3、 if [ ! -x "$PRGDIR"/ "$EXECUTABLE" ]; then  #!是非条件,即非(-x "$PRGDIR"/ "$EXECUTABLE")是否为真。总体含义是 判断脚本catalina.sh是否存在并有可执行权限,没有执行权限就退出。

4、[ -z "$CATALINA_HOME" ]: -z   在中括号中判断变量的值是否为空,变量的值,为空,返回0,为true,变量的值,非空,返回1,为false

5、-d filename:如果 filename为目录,则为真,作用比如判断目录是否存在

如下,判断run_dir目录是否存在:

其它的运算符号判断条件:
-e filename 如果 filename存在,则为真,作用比如判断文件是否存在
-d filename 如果 filename为目录,则为真,作用比如判断目录是否存在
-f filename 如果 filename为常规文件(不是目录,设备文件,链接文件),则为真
-L filename 如果 filename为符号链接,则为真,作用比如判断是否为链接
-r filename 如果 filename可读,则为真 
-w filename 如果 filename可写,则为真 
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
filename1 -nt filename2 如果 filename1比 filename2新,则为真。
filename1 -ot filename2 如果 filename1比 filename2旧,则为真。
整数变量表达式
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于


字符串变量表达式
If  [ $a = $b ]                 如果string1等于string2,则为真
                                字符串允许使用赋值号做等号
if  [ $string1 !=  $string2 ]   如果string1不等于string2,则为真       
if  [ -n $string  ]             如果string 非空(非0),返回0(true)  
if  [ -z $string  ]             如果string 为空,则为真
if  [ $sting ]                  如果string 非空,返回0 (和-n类似) 

二十五、shell 参数换行

Linux参数太长,一般可取续行符 "\"进行参数换行/续行。反斜杠\ 后面紧跟回车,表示下一行是当前行的续行.

如下的代码所示:


JAVA_OPTS="-Dfile.encoding=UTF-8 \
-server \
-Xms30g \
-Xmx30g \
-Xmn10g \
-Xss2028k \
-XX:MetaspaceSize=2g \
-XX:MaxMetaspaceSize=2g \
-XX:+UseG1GC \
-XX:+PrintTLAB \
-XX:-UseAdaptiveSizePolicy \
-XX:TLABWasteTargetPercent=10 \
-XX:NewSize=1g \
-XX:SurvivorRatio=4 \
-Xloggc:/data/logs/alarm-gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps  -XX:PretenureSizeThreshold=1m -XX:MaxTenuringThreshold=6 \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/hubble-alarm/heapdump.hprof \
-XX:ErrorFile=/data/logs/hubble-alarm/hubble_err.log"

;