Linux中的脚本编程总结

用户管理

添加用户

useradd sxt01

所有的系统账户都是在home目录下的

drwx------ 2 sxt01 sxt01 4096 Dec 10 06:38 sxt01

可以去home目录下去进行查询

对于两个账户共享同样的东西,可以通过创建组的形式,让两个账户共享相同的东西,具有这样的权限

添加组的命令

groupadd sxtshare

一个用户可以同属于多个组的

[root@node11 /]# id sxt01

uid=502(sxt01) gid=502(sxt01) groups=502(sxt01)

[root@node11 /]# usermod -a -G sxtshare sxt01

[root@node11 /]# id sxt01

uid=502(sxt01) gid=502(sxt01) groups=502(sxt01),504(sxtshare)

[root@node11 /]#

或者:

[root@node11 /]# id sxt01

uid=502(sxt01) gid=502(sxt01) groups=502(sxt01),504(sxtshare)

[root@node11 /]# id sxt02

uid=503(sxt02) gid=503(sxt02) groups=503(sxt02)

[root@node11 /]# usermod -a -G sxtshare sxt01

[root@node11 /]# id sxt01

uid=502(sxt01) gid=502(sxt01) groups=502(sxt01),504(sxtshare)

[root@node11 /]# usermod -a -G sxtshare sxt02

[root@node11 /]# id sxt02

uid=503(sxt02) gid=503(sxt02) groups=503(sxt02),504(sxtshare)

[root@node11 /]#

让哪一个用户:

给用户赋予权限,并让其归属于哪一个组:

chown sxt01:sxtshare share

修改权限,通过加或者减权限,前边的chmod是指修改权限。

chmod u/g/o/a +/- rwx

组加上写的权限

chmod g+w share/

修改之后:

drwxr-xr-x   2 root  sxtshare  4096 Dec 10 19:40 test

Root持有test这个目录,sxtshare持有test这个目录

这两个的区别是什么:chmod的区别和chown的区别是什么?

[root@node11 /]# chmod g+w test/

在实际开发过程中,修改权限之后,需要将用户退出,修改完权限之后再进入。

修改权限的方式:

chown :sxtshare sxt01.txt

登录一个用户:

ssh sxt01@node11

Chmod:修改权限:

Chmod修改权限的方式有两种:

字符修改的方式和数值的修改方式

字符修改权限的方式:

字符修改又分为对user的权限修改,对other的权限修改,对group的权限修改,对all的权限修改。

其中在操作的时候,可以对一个用户修改多个权限,但是不能对多个用户修改多个权限。

比如可以同时对sxt01.txt添加权限:

Chmod u+xrw sxt01.txt

但是不能使用:

Chmod u+xrw g+xrw sxt01.txt

在Linux系统中:

Chmod是修改权限的使用方式

Chown是修改属性的方式,也就是这个文件或者这个目录属于哪个用户哪个组的。

在修改权限的时候:

111—>rwx—>7

是这样的,从右到左依次是:111—>xrw—>7

在进行计算的时候,从左往右依次是:user用户,group组,other权限,最后边是all组。

在进行计算的时候,如果只是user权限,并且是user权限的write,read,executive,那么就是7,如果只是read,那么就是5,如果只是executive,那么就是1

修改权限的时候:最前边是持有者所具有的权限,中间是组里的其他用户的权限,最后边是其他用户可以拥有的权限。
目录一般会给的权限有:

755是目录的默认权限

给文件给权限的时候,

755是目录的默认权限

644是文件的默认权限

Su命令式切换用户

Root用户切换任何用户是免密的。

添加用户使用:

Useradd sxt01

Useradd sxt02

然后在后边输入密码

修改用户权限:

Chmod 770 文件名

添加组使用:

Groupadd  sxtswap

Linux系统和Windows系统的区别是:

Linux系统全部是命令行的形式

Windows系统是图形化界面

Linux系统中软件的安装

编译型语言,解释型语言

编译安装有:

rpm安装

Yum安装

程序系统的运行需要调用内核

JDK的下载与安装:

苹果系统是Unix系统内核

Redhat的安装:使用rpm包

 

安装的过程就是复制黏贴的过程

包的安装没有解决依赖的问题

程序的安装,基于包的安装

yum是基于仓库的安装

安装的三种方式:

编译安装

包的安装

通过rpm包的查找安装

还有一种是绿色的,解压就可以使用

Maven是一个仓库,将包放在某一个文件夹中

Make编译

使用yum安装的命令:

yum install gcc

以上是编译安装

包的安装

rpm包的安装

rpm -i jdk-7u67-linux-x64.rpm

rpm包的查询与过滤

rpm -qa | grep jdk

查询一个文件在哪里?

whereis route

查询并且去计算

ls -l | wc -l

Yum:是一种C/S架构

Yum的使用

脚本编程:

Bash的使用:

Bash:是一个 启动器,解释器

解释器:用户交互输入

source test.txt

source:就是让命令去执行

Source和.的区别:

[root@node12 ~]# type "."

. is a shell builtin

[root@node12 ~]# type "source"

source is a shell builtin

[root@node12 ~]#

其实两个的用法,作用等都是相同的。

ps是进程状态

[root@node12 ~]# pstree

init─┬─auditd───{auditd}

     ├─crond

     ├─master─┬─pickup

     │        └─qmgr

     ├─6*[mingetty]

     ├─nginx───nginx

     ├─rsyslogd───3*[{rsyslogd}]

     ├─sshd─┬─sshd───bash

     │      └─sshd───bash───bash───pstree

     └─udevd───2*[udevd]

[root@node12 ~]#

要让一个脚本文件去执行,需要加上/bin/bash,使得这个文件可执行。

为什么能够执行,是因为有/bin/bash

#是几个注释,对于bash而言是一个注释,但是对于内核解释器而言,#!一个命令

以上就是脚本

以下是函数和方法

这个命令:echo $$;是打印当前的进程号

文本流,重定向

重定向的不是程序,而重定向的是I/O

[root@node12 ~]# cd /proc/7351/fd

[root@node12 fd]# ll

total 0

lrwx------ 1 root root 64 Dec  9 20:53 0 -> /dev/pts/0

lrwx------ 1 root root 64 Dec  9 20:53 1 -> /dev/pts/0

lrwx------ 1 root root 64 Dec  9 20:53 2 -> /dev/pts/0

lrwx------ 1 root root 64 Dec  9 20:53 255 -> /dev/pts/0

lr-x------ 1 root root 64 Dec  9 20:53 3 -> /test

[root@node12 fd]# 

ps:是用来打印当前Linux进程的

查询进程并且过滤:

ps -fe | grep nginx

重定向:

TCP连接是双向的,有两个I/O,有输入和输出

查询进程,使用grep进行过滤

ps -fe  | grep nginx

重定向:

[root@node12 fd]# exec 1>& 8

-bash: 8: Bad file descriptor

[root@node12 fd]# exec 8>& 1

[root@node12 fd]# exec 1>& /dev/pts/1

或者:

将重定向正确输出:

[root@node12 fd]# exec 1>& /dev/pts/0

重定向:

将错误重定向输出:

[root@node12 ~]# ls -l /god 2> ls1.out

分别将正确的和错误的输出:

[root@node12 ~]# ls -l / /god 1> ls2.out 2> ls3.out

将正确输出和错误输出追加到同一个文件中:

[root@node12 ~]# ls -l / /god  1>ls9.out 2>&1

默认情况下就是将正确输出和错误输出重定向到一个文件中:

[root@node12 ~]# ls -l / /god   >&ll0.out

总之:

输出流有标准输出和错误输出

标准输出为1

错误输出为2

一个>是覆盖,两个>是追加

Echo是指输出:

[root@node12 ~]# echo "hello linux"

hello linux

[root@node12 ~]# echo $$

16177

[root@node12 ~]# read sxt

asdfghjkl

[root@node12 ~]# echo $sxt

asdfghjkl

[root@node12 ~]#

Read是指readline

输入重定向操作

<<<会重定向将一个输入放到一个流里边去

[root@node12 ~]# read sdf 0<<<"hello sxt"

[root@node12 ~]# echo sdf

sdf

[root@node12 ~]# echo $sdf

hello sxt

[root@node12 ~]#

重定向第二种:

[root@node12 ~]# read sxt 0<<ooxx

> sdfsflkjdsls

> sldkjfls

> sjkdlfsdkf

> \sjkdfds

> \jsjdfs

> ooxx

[root@node12 ~]# echo $sxt

sdfsflkjdsls

[root@node12 ~]#

这种情况是首位呼应的

<<<是指将一行字符串放到一个流中,打印输出

<<是指将多行字符串放到一个流中,打印输出

[root@node12 ~]# cat test.sh

cat 0<<ooxx

jflksjdfsld

jlkgjdslkfjs

jalkjflkdsjf9088432098583094

jofajdsflksd

ooxx

[root@node12 ~]# . test.sh

jflksjdfsld

jlkgjdslkfjs

jalkjflkdsjf9088432098583094

jofajdsflksd

[root@node12 ~]#

变量和作用域

在定义变量和函数的时候,当函授执行只有,变量才会生效

[root@node12 ~]# ooss(){

> sxt1=100

> sxt2=200

> echo $sxt1

> echo $sxt2

> }

[root@node12 ~]# echo $sxt1

 

[root@node12 ~]# echo $sxt2

 

[root@node12 ~]# ooss

100

200

[root@node12 ~]# echo $sxt1

100

[root@node12 ~]# echo $sxt2

200

[root@node12 ~]# ooss

100

200

[root@node12 ~]#

脚本的书写与传参:

[root@node12 ~]# ./sxt1.sh a b c d e f g h i j k l m n

a

b

c

d

e

a1

14

a b c d e f g h i j k l m n

a b c d e f g h i j k l m n

[root@node12 ~]# cat sxt1.sh

#!/bin/bash

 

echo $1

echo $2

echo $3

echo $4

echo $5

 

echo $11

echo $#

echo $*

echo $@

[root@node12 ~]#

打印进程id

Echo $$

管道接more是为了显示的

[root@node12 ~]# echo $BASHPID | more

16532

[root@node12 ~]#

赋值

[root@node12 ~]# vi sxt02.sh

[root@node12 ~]# cat sxt02.sh

echo $sxt02

[root@node12 ~]# sxt02=good

[root@node12 ~]# echo $sxt02

good

[root@node12 ~]# source sxt02.sh

good

[root@node12 ~]# /bin/bash sxt02.sh

 

[root@node12 ~]# export sxt02

[root@node12 ~]# /bin/bash sxt02.sh

good

[root@node12 ~]#

父进程与子进程

检查程序上次退出是的状态,是正确的退出还是错误的退出。

echo $?

读取第8行的内容

[root@node12 ~]# head -8 /etc/profile | tail -1

# /etc/profile.d/ to make custom changes to your environment, as this

[root@node12 ~]#

Linux系统中输出,计算,以及重定向

[root@node12 ~]# echo $?

2

[root@node12 ~]# y=$((8+7))

[root@node12 ~]# echo $y

15

[root@node12 ~]# a=1

[root@node12 ~]# b=2

[root@node12 ~]# echo $(a+b)

-bash: a+b: command not found

 

[root@node12 ~]# echo $a

1

[root@node12 ~]# echo $b

2

[root@node12 ~]# test 3 -gt 2

[root@node12 ~]# echo $?

0

[root@node12 ~]# test 3 -gt 8

[root@node12 ~]# echo $?

1

[root@node12 ~]# test 3 -gt 8 && echo ok

[root@node12 ~]# test 3 -gt 2 && echo ok

ok

[root@node12 ~]# [3 -gt 2 ] && echo ok

-bash: [3: command not found

[root@node12 ~]# [ 3 -gt 2 ] && echo ok

ok

[root@node12 ~]#

查看一个用户是否添加成功了:

①推出去登录

②查看这个用户的元数据

[root@node12 ~]# chmod +x userAdd.sh

[root@node12 ~]# ./userAdd.sh ooxx

user add ok...

[root@node12 ~]# echo $?

0

[root@node12 ~]# id ooxx

uid=502(ooxx) gid=504(ooxx) groups=504(ooxx)

[root@node12 ~]# cat userAdd.sh

#!/bin/bash

 

useradd $1

echo $1 | passwd --stdin $1 >& /dev/null

echo "user add ok..."

[root@node12 ~]#

重新修改之后:

[root@node12 ~]# vi userAdd.sh

[root@node12 ~]# ./userAdd.sh ooxx

[root@node12 ~]# echo $?

0

[root@node12 ~]# id ooxx

uid=502(ooxx) gid=504(ooxx) groups=504(ooxx)

[root@node12 ~]# vi userAdd.sh

[root@node12 ~]# ./userAdd.sh oxox

[root@node12 ~]# echo $?

1

[root@node12 ~]# ./userAdd.sh

args ...error...

[root@node12 ~]# cat userAdd.sh

#!/bin/bash

[ $# -eq 1 ] || echo "args ...error..." && exit 1

useradd $1

echo $1 | passwd --stdin $1 >& /dev/null

echo "user add ok..."

[root@node12 ~]#

添加用户等脚本编程中,能尽量使用&&的时候就尽量使用&&,避免使用||

[root@node12 ~]# cat userAdd.sh

#!/bin/bash

[ ! $# -eq 1 ] && echo "args ...error..." && exit 1

useradd $1

echo $1 | passwd --stdin $1 >& /dev/null

echo "user add ok..."

[root@node12 ~]# ./userAdd.sh ooxx

useradd: user 'ooxx' already exists

user add ok...

[root@node12 ~]# echo $?

0

[root@node12 ~]# id ooxx

uid=502(ooxx) gid=504(ooxx) groups=504(ooxx)

[root@node12 ~]#

这个例子是为了避免在执行脚本的时候会传进去好几个参数的案例

以下的例子是为了避免在传参进行创建用户的时候,这个用户存在

[root@node12 ~]# cat userAdd.sh

#!/bin/bash

 

[ ! $# -eq 1 ] && echo "args ...error..." && exit 1

id $1 >& /dev/null && echo "user exist..." && exit 2

useradd $1

echo $1 | passwd --stdin $1 >& /dev/null

echo "user add ok..."

[root@node12 ~]# ./userAdd.sh ooox

user add ok...

[root@node12 ~]# echo $?

0

[root@node12 ~]# ./userAdd.sh ooox

user exist...

[root@node12 ~]# echo $?

2

[root@node12 ~]#

验证是否有权限添加新的用户

[root@node12 ~]# cat userAdd.sh

#!/bin/bash

 

[ ! $# -eq 1 ] && echo "args ...error..." && exit 1

id $1 >& /dev/null && echo "user exist..." && exit 2

useradd $1 && echo $1 | passwd --stdin $1 >& /dev/null && echo "user add ok..."

 && exit 0echo "wo ye bu zhi dao ..." && exit 8

[root@node12 ~]# cp userAdd.sh /tmp

[root@node12 ~]# ll /home/

total 16

drwx------ 3 ooox  ooox  4096 Dec 11 12:00 ooox

drwx------ 3 oxox  oxox  4096 Dec 11 11:58 oxox

drwx------ 2 sxt01 sxt01 4096 Dec  9 08:06 sxt01

drwx------ 2 sxt02 sxt02 4096 Dec  9 08:06 sxt02

[root@node12 ~]# su ooox

[ooox@node12 root]$ cd /tmp

[ooox@node12 tmp]$ ll

total 8

drwxr-xr-x  2 root root 4096 Dec 11 07:11 hsperfdata_root

-rwxr-xr-x  1 root root  246 Dec 11 12:07 userAdd.sh

-rw-------. 1 root root    0 Nov  4 04:11 yum.log

[ooox@node12 tmp]$ ./userAdd.sh oooo

./userAdd.sh: line 5: /usr/sbin/useradd: Permission denied

wo ye bu zhi dao ...

[ooox@node12 tmp]$

使用if进行命令行的形式写脚本:

[root@node12 ~]# if ls -l / >& /dev/null;then echo "ok" ; else echo "no ok" ; f

I

ok

[root@node12 ~]# if [ 3 -gt 2 ]; then echo ok;fi

ok

[root@node12 ~]#

使用while进行命令行写脚本:

[root@node12 ~]# mkdir /god

[root@node12 ~]# while ls -l /god ; do echo ok; rm -fr /god ;done

total 0

ok

ls: cannot access /god: No such file or directory

[root@node12 ~]#

For循环语句在脚本中的使用:

[root@node12 ~]# help for

for: for NAME [in WORDS ... ] ; do COMMANDS; done

    Execute commands for each member in a list.

    

    The `for' loop executes a sequence of commands for each member in a

    list of items.  If `in WORDS ...;' is not present, then `in "$@"' is

    assumed.  For each element in WORDS, NAME is set to that element, and

    the COMMANDS are executed.

    

    Exit Status:

    Returns the status of the last command executed.

for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done

    Arithmetic for loop.

    

    Equivalent to

     (( EXP1 ))

     while (( EXP2 )); do

     COMMANDS

     (( EXP3 ))

     done

    EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is

    omitted, it behaves as if it evaluates to 1.

    

    Exit Status:

    Returns the status of the last command executed.

[root@node12 ~]# for ((i=0;i<4;i++)); do echo $i ; done

0

1

2

3

[root@node12 ~]#

算数表达式中使用(()),这时候不需要在写之前加上$取值

[root@node12 ~]# for i in bjsxt tysxt szsxt shsxt gssxt; do echo $i ; done

bjsxt

tysxt

szsxt

shsxt

gssxt

[root@node12 ~]# for i in bjsxt tysxt szsxt [shsxt gssxt]; do echo $i ; done

bjsxt

tysxt

szsxt

[shsxt

gssxt]

[root@node12 ~]# for i in bjsxt tysxt szsxt {shsxt gssxt}; do echo $i ; done

bjsxt

tysxt

szsxt

{shsxt

gssxt}

[root@node12 ~]#

反引号的级别高于for的级别

[root@node12 ~]# for i in ls ; do echo $i ;done

ls

[root@node12 ~]# for i in ` ls ` ; do echo $i ; done

}

$

anaconda-ks.cfg

echo

httpd-2.2.15-59.el6.centos.x86_64.rpm

install.log

install.log.syslog

ll0.out

ls1.out

ls2.out

ls3.out

ls3.out[root@node12

ls5.out

ls6.out

ls9.out

ls.out

sh01.sh

soft

sxt02.sh

sxt1=100

sxt1.sh

sxt2=200

sxt.txt

test.sh

test.txt

userAdd.sh

[root@node12 ~]#

案例练习:

Df:查看磁盘的分配情况

du -s:求和

du -a:统计给出的目录下所有文件以及所有目录的大小

du -sh ./:查看指定目录下文件的大小

[root@node12 ~]# du -sh ./

164M ./

[root@node12 ~]#

找出一行中的最大的文件

[root@node12 ~]# cat findMax.sh

#!/bin/bash

 

oldIFS=$IFS

IFS=$'\n'

for i in `du -a $1 | sort -rn`;do

echo $i

fileName=$(echo $i | awk '{print $2}')

if [ -f $fileName ];then

echo $fileName

exit 0

fi

done

 

IFS=$oldIFS

echo " n f "

exit 1

[root@node12 ~]# ./findMax.sh ./

167716 ./

166776 ./soft

123884 ./soft/jdk-7u67-linux-x64.rpm

./soft/jdk-7u67-linux-x64.rpm

[root@node12 ~]#

求最大的值

[root@node12 ~]# ./test.sh

a 1

b 2

c 3

num:3

[root@node12 ~]# cat readFile.txt

a 1

b 2

c 3

[root@node12 ~]# cat test.sh

#!/bin/bash

#这个是对词做切分

oldIFS=$IFS

IFS=$'\n'

num=0

for i in `cat readFile.txt`  ;do

echo $i

((num++))

done

echo num:$num

#用完了之后需要恢复

IFS=$oldIF

[root@node12 ~]# ./test.sh

a 1

b 2

c 3

num:3

[root@node12 ~]#

统计文件的行数:

[root@node11 ~]# wc -l /etc/profile

82 /etc/profile

[root@node11 ~]# cat /etc/profile | wc -l

82

[root@node11 ~]#

在循环语句中for的第二种使用方法:

[root@node12 ~]# cat readFile.txt

a 1

b 2

c 3

[root@node12 ~]# cat test.sh

#!/bin/bash

#这个是对词做切分

oldIFS=$IFS

IFS=$'\n'

num=0

for i in `cat readFile.txt`  ;do

echo $i

((num++))

done

echo num:$num

#用完了之后需要恢复

IFS=$oldIF

 

echo "---------------------------------"

 

#使用步进的方式进行书写

num=0

lines=`cat readFile.txt | wc -l`

for ((i=1;i<=lines ; i++));do

line=`head -$i readFile.txt | tail -1`

echo $line

((num++))

done

echo num:$num

 

[root@node12 ~]# ./test.sh

a 1

b 2

c 3

num:3

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

a 1

b 2

c 3

num:3

[root@node12 ~]#

通过改变流的指向的方式进行改变流的输入

[root@node12 ~]# cat readFile.txt

a 1

b 2

c 3

[root@node12 ~]# cat haha.sh

#!/bin/bash

 

#在这里只是改变了一个指向

exec 0< readFile.txt

read line

echo $line

read line

echo $line

read line

echo $line

[root@node12 ~]# ./haha.sh

a 1

b 2

c 3

[root@node12 ~]#

Shell脚本编程中的总结:

1,花括号  mkdir  -p sdfsdf/{a,b,c}sdfsdf

2,波浪线 cd ~god

3,变量&参数  $  $$  ${}(.....)

4,命令替换 ls -l `echo $path`

5,算术扩展  num=$((3+4))

6,word拆分,$IFS

7,路径  *(零到多个任意字符)?

8,引用删除   echo "hello"

*,重定向  >  

 

man bash

$@和$*的区别:

[root@node12 ~]# cat readFile.txt

a 1

b 2

c 3

[root@node12 ~]# cat test.sh

#!/bin/bash

#这个是对词做切分

oldIFS=$IFS

IFS=$'\n'

num=0

for i in `cat readFile.txt`  ;do

echo $i

((num++))

done

echo num:$num

#用完了之后需要恢复

IFS=$oldIF

 

echo "---------------------------------"

 

#使用步进的方式进行书写

num=0

lines=`cat readFile.txt | wc -l`

for ((i=1;i<=lines ; i++));do

line=`head -$i readFile.txt | tail -1`

echo $line

((num++))

done

echo num:$num

#以下是while循环语句

echo "++++++++++++++++++++++++++"

num=0

while read line ;do

echo $line

((num++))

done < readFile.txt

echo "=================================="

num=0

exec 0< readFile.txt

while read line;do

echo $line

done

echo num:$num

echo "*************************************"

export num=0

#管道后边的内容是在子进程中的

cat readFile.txt | while read line ;do

echo $line

((num++))

done

echo num:$num

 

echo "##################################"

 

echo $@

echo $*

 

echo "@"

for i in "$@";do

echo $i

done

echo "*"

for i in "$*";do

echo $i

done

[root@node12 ~]# ./test.sh a b c d e f

a 1

b 2

c 3

num:3

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

a 1

b 2

c 3

num:3

++++++++++++++++++++++++++

a 1

b 2

c 3

==================================

a 1

b 2

c 3

num:0

*************************************

a 1

b 2

c 3

num:0

##################################

a b c d e f

a b c d e f

@

a

b

c

d

e

f

*

abcdef

[root@node12 ~]#

猜你喜欢

转载自blog.csdn.net/wyqwilliam/article/details/85015905