linux-shell脚本基础-2

Posted g2thend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux-shell脚本基础-2相关的知识,希望对你有一定的参考价值。

1,用户组

添加用户

useradd
    -u   UID
    -o   
    -g  指定 GID或组名
    -c   注释信息
    -d  家目录
    -s  shell  
    -G  附加组
    -r  系统用户
    -m  家目录,系统用户
    -M  不创建家目录,非系统用户
      newusers file : 批量创建用户,需要事先准备好跟passwd格式一样的文件  
      chpasswd : 批量修改用户口令,文件格式:用户名:口令
    
    passwd    
             -l : 锁定指定的用户
            -u : 解锁指定的用户
            -e :强制用户下次登录时修改密码   
    
 usermod
    -u UID
    -g  GID
    -G  新附加组   -a 
    -d  HOME
    -l  新家目录
    -U   解锁
    -L   锁定
    -e   YYYY-MM-DD: 指明用户账号过期日期
    --f INACTIVE: 设定非活动期限
     -d DIR : 修改家目录
     -m : 配合-d,修改并且移动数据到新的家目录
    userdel  
        -r   删除用户家目录
       
 id [OPTION]... [USER]
 -n: 显示名称,需配合ugG使用
 -G: 显示用户所属的组的ID
 -u UID
 -g GID


切换用户方式
    su  :非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
    su  -    :登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
    
    
  change  修改密码策略
  -d LAST_DAY
  -E --expiredate EXPIRE_DATE
  -I --inactive INACTIVE
  -m --mindays MIN_DAYS
  -M --maxdays MAX_DAYS
  -W --warndays WARN_DAYS
  
 chage -d 0 tom 下一次登录强制重设密码
 chage -m 0 –M 42 –W 14 –I 7 tom
 chage -E 2016-09-10 tom
 
   
  groupadd
  -g  GID
  -r   系统组
   
   groupmod   [option]    GROUP
            -n group_name : 修改组名
            -g GID : 修改GID  
           
   
  修改文件属性
  chown    -R     递归
  
  umask   
  可以用来保留在创建文件权限
  新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1
  新建目录的默认权限: 777-umask
  非特权用户umask是 002
  root的umask 是 022
  
   
   对于文件的权限:
    r : 查看 
    w : 修改
    x : 运行

    对于目录的权限:
    r : 查看目录内文件列表
    w : 创建和删除文件(需要x权限)
    x : cd进目录
   
   
  特殊权限
  SUID
  SGID
  默认情况下,用户创建文件时,其属组为此用户所属的主组
  一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
      
  Sticky 位
  具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
  在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
  SUID: user,占据属主的执行权限位
  s:属主拥有x权限
  S:属主没有x权限
  SGID: group,占据属组的执行权限位
  s: group拥有x权限
  S:group没有x权限
  Sticky: other,占据other的执行权限位
  t:other拥有x权限
  T:other没有x权限
  
  文件特殊属性
  
  chattr +i 不能删除,改名,更改
  chattr +a 只能追加内容  
  lsattr 显示特定属性
   
     
     
 acl 访问控制列表
 
 ACL:Access Control List,实现灵活的权限管理
 CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
 CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
 tune2fs –o acl /dev/sdb1
 mount –o acl /dev/sdb1 /mnt/test
 
 ACL生效顺序:所有者>(自定义用户>所属组,自定义组)>其他人
    括号外的用户不收mask影响
 mount -o acl /directory
 getfacl file |directory
 setfacl -m u:wang:rwx file|directory
 setfacl -Rm g:sales:rwX directory
 setfacl -M file.acl file|directory
 setfacl -m g:salesgroup:rw file| directory
 setfacl -m d:u:wang:rx directory
 setfacl -x u:wang file |directory
 setfacl -X file.acl directory
 
 通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
 base ACL 不能删除
 setfacl -k dir 删除默认ACL权限
 setfacl –b file1清除所有ACL权限
 getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2
 mask只影响除所有者和other的之外的人和组的最大权限
 Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(EffectivePermission)
 用户或组的设置必须存在于mask权限设定范围内才会生效
  setfacl -mmask::rx file
  
  --set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以
  
  
 XFS文件系统默认支持ACL,其他低级的需要文件系统支持后,挂载时指定

2,脚本基础

变量命令

    1、不能使程序中的保留字:例如if, for
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法

  Shell中命名建议规则:
1、变量名大写
2、局部变量小写
3、函数名小写
4、用英文名字,并体现出实际作用

根据变量的生效范围等标准划分下面变量类型
局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,
包括当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传
递给它的参数
特殊变量:$?, $0, $*, $@, $#,$$
 
     $$  shell 本身的pid当前进程号
     $!   shell 最后运行的后台processs pid


      set       
       -e : 如果一个命令返回一个非0退出状态值(失败),就退出。?
?????? -n : 不需要执行脚本只是检查语法结构,返回所有的语法错误信息。??????
?      -u :  置换时把未设置的变量看作出错。????
??    ?-v :  当读入shell输入行时,把它们显示出来。?????
?      -x :  执行命令时,把命令和它们的参数显示出来

变量赋值:name=‘value’
可以使用引用value
(1) 可以是直接字串: name=“root"
(2) 变量引用: name="$USER"
(3) 命令引用: name=COMMAND
name=$(COMMAND)

  变量引用:$name 或者 $name
" " 弱引用,其中的变量引用会被替换为变量值
' ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
  显示已定义的所有变量:set
  删除变量:unset name

只读变量:只能声明,但不能修改和删除
  声明只读变量:
readonly name
declare -r name
  查看只读变量:
   readonly -p

变量作用域

local  
export   全局
新开子shell 运行脚本
source    脚本执行,在本sehll

命令行扩展

$() 或 ``

声明变量
readonly name
declare -r name
-i 整型
-x 环境变量

readonly -p

撤销变量
unset var
unset -f 函数名

位置变量
技术图片

退出码
bash自定义退出状态码
exit [n]:自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

算术运算
只支持整数运算

let
expr
ab=expr $a + $b
$[ ]
$(( ))

bc支持小数
echo "5*7 .3" | bc
技术图片

条件测试

条件测试

真 返回0
假 返回1

逻辑运算
与 -a &&
或 -o ||
非 !
a 使用 []
[ -a ]

&& 使用 [[ ]]
[[ && ]]
[ ] && [ ]
测试命令

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

1,使用-n -z 判断 变量是否为空
[ ] 需要在变量外侧加" " [[ ]] 不必
技术图片
注意:EXPRESSION前后必须有空白字符

命令组合

( command;command ) 开启子shell
command ; command ; 本shell下执行

bash的数值测试

-v VAR

变量VAR是否设置

数值测试
-gt 是否大于-ge 是否大于等于-eq 是否等于-ne 是否不等于-lt 是否小于-le 是否小于等于
技术图片

shell 变量字符串
$parameter
$#parameter 字符长度
$parameter:offset 从offset 之后开始提取子串到结尾
$parameter:offset:length 从offset 之后开始提取长度为length的字串
$parameter#word 从$parameter开头开始删除最短匹配的word字符串
$parameter##word 从$parameter开头开始删除最长匹配的word字符串
$parameter%word 从$parameter结尾开始删除最短匹配的word字符串
$parameter%%word 从$parameter结尾开始删除最长匹配的word字符串
$parameter/pattern/string string 代替第一个匹配的pattern
$parameter//pattern/string 所有
字符长度
管道echo $char |wc -L
expre length "$char"

特殊扩展变量

$parameter:-word 如果parameter变量为空或未赋值,则返回word字符串并代替变量值
$parameter:=word 如果parameter变量为空或未赋值 ,则设置为word并返回,位置变量与特殊变量不适用
$parameter:?word 如果parameter变量为空或未赋值,word作为标准错误输出,否则输出变量值
$parameter:+word 如果parameter变量为空或未赋值,什么都不做,否则word的值返回

数学运算

!/bin/bash

no1=4;
no2=5;
let result=no1+no2
echo $result
result=$[ no1 + no2 ]
result=$[ $no1 + 5 ]
也可以使用(()),但使用(())时,变量名之前需要加上$:

数组

$ ass_array=([index1]=val1 [index2]=val2)
使用独立的“索引-值”进行赋值:
$ ass_array[index1]=val1
$ ass_array‘index2]=val2
数组索引
$ echo $!array_var[*]
$ echo $!array_var[@]
$ echo $!fruits_value[*]

 while   read  n  ;do
   echo  " name  is   $n  "                                           
   done   <   name                  #文本文件每行

   cat student_name.txt | while read name  ;   do
    useradd $name
    echo $name is created
    done 

find

find /var -not ( -user root -o -user lp -o -user gdm )

与xargs 配合

压缩

compress .Z
gzip .gz
bzip2 .bz2
xz .xz
zip .
tar
cpio

-j: bzip2, -z: gzip, -J: xz

软硬符号链接
df -i --print-type

符号链接和硬链接的区别?
符号链接:
软链接有自己的文件属性及权限等;
可对不存在的文件或目录创建软链接;
软链接可交叉文件系统;
软链接可对文件或目录创建;
创建软链接时,链接计数 i_nlink 不会增加;
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。

硬链接:
文件有相同的 inode 及 data block;
只能对已存在的文件进行创建;
不能交叉文件系统进行硬链接的创建;
不能对目录进行创建,只可对文件创建;
删除一个硬链接文件并不影响其他有相同 inode 号的文件。

每个文件存在两个计数器:i_count 与 i_nlink,即引用计数与硬链接计数。结构体 inode 中的 i_count 用于跟踪文件被访问的数量,而 i_nlink 则是上述使用 ls -l 等命令查看到的文件硬链接数。或者说 i_count 跟踪文件在内存中的情况,而 i_nlink 则是磁盘计数器。当文件被删除时,则 i_nlink 先被设置成 0。文件的这两个计数器使得 Linux 系统升级或程序更新变的容易。系统或程序可在不关闭的情况下(即文件 i_count 不为 0),将新文件以同样的文件名进行替换,新文件有自己的 inode 及 data block,旧文件会在相关进程关闭后被完整的删除

创建软链接是以相对路径创建时,该链接会在当前目录下寻找相同文件名的文件,如果无法找到,该链接失效。链接文件有自己的节点数据。

以上是关于linux-shell脚本基础-2的主要内容,如果未能解决你的问题,请参考以下文章

Linux-Shell基础(变量,字符串,数组)

linux-shell scripts 脚本的初步认识

linux-shell编程基础

linux-shell脚本编程(进阶)

Linux-Shell脚本编程进阶

Linux-Shell