HappyLifeLife.com
HappyLifeLife.com
HappyLifeLife.com 登录 HappyLifeLife.com 注册 HappyLifeLife.com
爱新闻 爱生活
爱分享 爱学习
爱读书 爱探索
爱音乐 爱宇宙
爱电影 爱地球
爱阅读 爱世界
爱运动 爱科技
爱学习

<< < - > >>
Linux
Linux
www.HappyLiveLife.com 收藏 www.happylivelife.com
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
编辑
shell中截取字符串的方法有很多中,
${expression}一共有9种使用方法。
${parameter:-word}
${parameter:=word}
${parameter:?word}
${parameter:+word}
上面4种可以用来进行缺省值的替换。
${#parameter}
上面这种可以获得字符串的长度。
${parameter%word} 最小限度从后面截取word
${parameter%%word} 最大限度从后面截取word
${parameter#word} 最小限度从前面截取word
${parameter##word} 最大限度从前面截取word
上面4个就是用来截取字符串的方法了。
有了着四种用法就不必使用cut命令来截取字符串了
第一种又可以分为四种情况,下面一一介绍。
1、使用 # 号操作符。用途是从左边开始删除第一次出现子字符串即其左边字符,保留右边字符。用法为#*substr,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str#*//}
得到的结果为www.你的域名.com/cut-string.html,即删除从左边开始到第一个"//"及其左边所有字符2、使用 ## 号操作符。用途是从左边开始删除最后一次出现子字符串即其左边字符,保留右边字符。用法为##*substr,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str##*/}
得到的结果为cut-string.html,即删除最后出现的"/"及其左边所有字符
3、使用 % 号操作符。用途是从右边开始删除第一次出现子字符串即其右边字符,保留左边字符。用法为%substr*,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str%/*}
得到的结果为http://www.你的域名.com,即删除从右边开始到第一个"/"及其右边所有字符
4、使用 %% 号操作符。用途是从右边开始删除最后一次出现子字符串即其右边字符,保留左边字符。用法为%%substr*,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str%%/*}
得到的结果为http://www.你的域名.com,即删除从右边开始到最后一个"/"及其右边所有字符
第二种也分为四种,分别介绍如下:
1、从左边第几个字符开始以及字符的个数,用法为:start:len,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
2、从左边第几个字符开始一直到结束,用法为:start,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${var:7}
其中的 7 表示左边第8个字符开始
结果是:www.你的域名.com/cut-string.html
3、从右边第几个字符开始以及字符的个数,用法:0-start:len,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-15:10}
其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:cut-string
3、从右边第几个字符开始一直到结束,用法:0-start,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-4}
其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:html
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
直接调用系统变量
获取今天时期:
date +%Y%m%d
date +%F
或 $(date +%y%m%d)
获取昨天时期:
date -d yesterday +%Y%m%d
获取前天日期:
date -d -2day +%Y%m%d
依次类推比如获取10天前的日期:
date -d -10day +%Y%m%d
或n天前的
date -d "n days ago" +%y%m%d
明天:
date -d tomorrow +%y%m%d
注意以上中间有空格
时间域
% H 小时(00..23)
% I 小时(01..12)
% k 小时(0..23)
% l 小时(1..12)
% M 分(00..59)
% p 显示出AM或PM
% r 时间(hh:mm:ss AM或PM),12小时
% s 从1970年1月1日00:00:00到目前经历的秒数
% S 秒(00..59)
% T 时间(24小时制)(hh:mm:ss)
% X 显示时间的格式(%H:%M:%S)
% Z 时区 日期域
% a 星期几的简称( Sun..Sat)
% A 星期几的全称( Sunday..Saturday)
% b 月的简称(Jan..Dec)
% B 月的全称(January..December)
% c 日期和时间( Mon Nov 8 14:12:46 CST 1999)
% d 一个月的第几天(01..31)
% D 日期(mm/dd/yy)
% h 和%b选项相同
% j 一年的第几天(001..366)
% m 月(01..12)
% w 一个星期的第几天(0代表星期天)
% W 一年的第几个星期(00..53,星期一为第一天)
% x 显示日期的格式(mm/dd/yy)
% y 年的最后两个数字( 1999则是99)
% Y 年(例如:1970,1996等)
注意:只有超级用户才有权限使用date命令设置时间,一般用户只能使用date命令显示时间。
#!/bin/sh
#对变量赋值:
a="hello world"
# 现在打印变量a的内容:
echo "A is:"
echo $a
* -b file = True if the file exists and is block special file. 如果该文件存在并且是块特殊文件。
* -c file = True if the file exists and is character special file.如果该文件存在并且是字符特殊文件
* -d file = True if the file exists and is a directory. 如果该文件存在并且是一个目录。
* -e file = True if the file exists. 如果该文件存在
* -f file = True if the file exists and is a regular file 如果该文件存在并且是一个普通文件
* -g file = True if the file exists and the set-group-id bit is set. 如果该文件存在并且设置了组ID位。
* -k file = True if the files’ “sticky” bit is set. 如果文件的sticky “粘性”位被设置。
* -L file = True if the file exists and is a symbolic link. 该文件存在并且是一个符号链接。
* -p file = True if the file exists and is a named pipe. 该文件存在并且是一个命名管道。
* -r file = True if the file exists and is readable. 文件存在并且是可读的
* -s file = True if the file exists and its size is greater than zero. 文件存在,它的大小是大于零
* -s file = True if the file exists and is a socket. 文件存在并且是一个套接字
* -t fd = True if the file descriptor is opened on a terminal. 文件描述符是在一个终端上打开的
* -u file = True if the file exists and its set-user-id bit is set. 文件存在,它的设置用户ID位被设置了
* -w file = True if the file exists and is writable. 文件存在并且可写
* -x file = True if the file exists and is executable. 文件存在并且是可执行的
* -O file = True if the file exists and is owned by the effective user id. 文件存在并且是所拥有的有效用户ID
* -G file = True if the file exists and is owned by the effective group id. 文件存在并且拥有有效的gruop id。
* file1 -nt file2 = True if file1 is newer, by modification date, than file2. 如果file1更新
* file1 ot file2 = True if file1 is older than file2. 如果file1更旧
* file1 ef file2 = True if file1 and file2 have the same device and inode numbers.file1和file2有相同的设备和节点号
* -z string = True if the length of the string is 0. 字符串的长度为0
* -n string = True if the length of the string is non-zero. 字符串的长度不为零
* string1 = string2 = True if the strings are equal.
* string1 != string2 = True if the strings are not equal.
* !expr = True if the expr evaluates to false.
* expr1 -a expr2 = True if both expr1 and expr2 are true. 且为真
* expr1 -o expr2 = True is either expr1 or expr2 is true. 或
检查某个文件是否存在,如果存在,则输出它的详细信息,
如果不存在,则提示输出文件不存在。
了解一下如下几个命令
  1. # ll -h filename
  -rw-r--r-- 1 root root 3.3M 06-28 23:21 filename
  2. # file filename
  filename: Zip archive data, at least v1.0 to extract
  3. # ls -i filename
  1427041 filename
  4. # df -h filename
  文件系统 容量 已用 可用 已用% 挂载点
  /dev/hda3 9.5G 5.7G 3.4G 64% /
  下面的脚本将把这些命令融合在一起,来显示一个文件的详细信息。
  #!/bin/bash
  # This script gives information about a file.
  FILENAME="$1"
  echo "Properties for $FILENAME:"
  if [ -f $FILENAME ]; then
  echo "Size is $(ls -lh $FILENAME | awk '{ print $5 }')"
  echo "Type is $(file $FILENAME | cut -d":" -f2 -)"
  echo "Inode number is $(ls -i $FILENAME | cut -d" " -f1 -)"
  echo "$(df -h $FILENAME | grep -v 文件系统 | awk '{ print "On",$1", \
  which is mounted as the",$6,"partition."}')"
  else
  echo "File does not exist."
  fi
保存为showfile.sh
  chomd u+x showfile.sh
  执行脚本的结果如下:
  # ./showfile.sh filename
  Properties for filename:
  Size is 3.3M
  Type is Zip archive data, at least v1.0 to extract
  Inode number is 1427041
  On /dev/hda3, which is mounted as the / partition.
  -----------------------------------------------------------------------
  cut命令可以从一个文本文件或者文本流中提取文本列。
  命令用法:
  cut -b list [-n] [file ...]
  cut -c list [file ...]
  cut -f list [-d delim][-s][file ...]
  上面的-b、-c、-f分别表示字节、字符、字段(即byte、character、field);
  list表示-b、-c、-f操作范围,-n常常表示具体数字;
  file表示的自然是要操作的文本文件的名称;
  delim(英文全写:delimiter)表示分隔符,默认情况下为TAB;
  -s表示不包括那些不含分隔符的行(这样有利于去掉注释和标题)
  上面三种方式中,表示从指定的范围中提取字节(-b)、或字符(-c)、或字段(-f)。
  范围的表示方法:
  M
  只有第M项
  M-
  从第M项一直到行尾
  M-N
  从第M项到第N项(包括N)
  -N
  从一行的开始到第N项(包括N)
  -
  从一行的开始到结束的所有项
  范例:
  # cat example
  test2
  this is test1
  # cut -c1-6 example ## print 开头算起前 6 个字元
  test2
  this i
  -c m-n 表示显示每一行的第m个字元到第n个字元。例如:
  ---------file-----------
  word 84 25000
  ---------file-----------
  # cut -c 1-5,10-25 file
  word 25000
  -f m-n 表示显示第m栏到第n栏(使用tab分隔)。例如:
  ---------file-----------
  word 84 25000
  ---------file-----------
  # cut -f 1,3 file
  word 25000
  我们经常会遇到需要取出分字段的文件的某些特定字段,例如 /etc/password就是通过":"分隔各个字段的。可以通过cut命令来实现。例如,
  我们希望将系统账号名保存到特定的文件,就可以:
  cut -d":" -f 1 /etc/passwd > /tmp/users
  -d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段
  如:
  使用|分隔
  cut -d'|' -f2 1.test>2.test
  使用:分隔
  cut -d':' -f2 1.test>2.test
  这里使用单引号或双引号皆可
ll/ls -l 命令输出结果中各字段含义:
(1),文件类型,第1位(“-”普通文件、“d”目录文件、“l”符号链接文件、“b”快设备文件、“c”字符设备文件、“p”管道文件、“s”socket文件)
(2),权限,第2至10位(9个字母分成3组,3个一组,分别代表“属主权限”、“属组权限”、“其他权限”,“-”表示没有权限)
(3),i-node,硬连接数(表示占用 i-node数。i-node是文件内容的真实表达,而filename是inode上层的表示方法。因此,每个文件名只能对应一个i-node,一个i-node可以对应多个文件名)
(4),文件属主
(5),文件属组
(6),文件大小
(7),创建时间
(8),文件名
UNIX下关于文件权限的表示方法解析
在linux中,使用系统资源的人分为4类:超级用户、文件属主、属主同组、其他。超级用户具有操作系统的一切权限,不需要指定权限,其他三类都需要指定权限。UNIX下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位:
1 2 3 4 5 6 7 8 9 10
- r w x r - x r -x
第1位表示文件类型,可以为p、d、l、s、c、b和-:
p表示命名管道文件
d表示目录文件
-表示普通文件
s表示socket文件
c表示字符设备文件
b表示块设备文件
l表示符号连接文件
第2-4位、5-7位、8-10位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx:
r:可读,文件可读其内容,目录可列出基下文件
w:可写,文件可修改内容,目录创建、删除文件
x:可执行,文件可执行,目录可进入
s:suid(第4位)或sgid(第7位)与可执行权限均被设置
S:suid(第4位)或sgid(第7位)被设置,可执行权限没有设置
t:sticky(粘着位)与可执行权限被设置
T:sticky(粘着位)被设置,可执行权限没有设置
-:没有权限
例子:ls -l myfile显示为:
-rwxr-x--- 1 foo staff 7734 Apr 05 17:07 myfile
表示文件myfile是普通文件,所有者foo对文件有读写执行权限,staff组的成员对文件有读和执行权限,其他的用户对这个文件没有权限,1个硬连接,文件的所有者是foo用户,而foo用户属于staff组,文件只有1个硬连接,长度是7734个字节,最后修改时间4月5日17:07。
如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上,设置了sticky位,会表现在其他用户的可执行位上,例如:
1、-rwsr-xr-x 表示SUID和所有者可执行被设置
2、-rwSr--r-- 表示SUID被设置,所有者可执行没有被设置
3、-rwxr-sr-x 表示SGID和同组用户可执行被设置
4、-rw-r-Sr-- 表示SGID被设置,同组用户可执行没有被设置
5、-rwxr-xr-t 表示sticky和其他用户可执行被设置
6、-rwxr--r-T 表示sticky被设置,其他用户可执行没有被设置
其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位上的值是1表示有相应的权限,值为0表示没有此权限。
11 10 98 7654321 0
SGTr wxrwxrw x
第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-6为所有者位,第5-3位为所属组权限,第2-0位为其他用户权限。上面的 “-rwsr-xr-x”的值为: 1 0 0 1 1 1 1 0 1 1 0 1,“-rw-r-Sr--”的值为: 0 1 0 1 1 0 1 0 0 1 0 0。
在查找文件时可以用文件权限的8进制代号来查找,将以上12位2进制数转换为8进制即可。例如,设置SUID位的文件为“100,000,000,000(2进制)=4000(8进制)”,设置SUID与SGID的文件为 “110,000,000,000(2进制)=6000(8进制)
”,查找命令为“find / -perm -4000 -type f -ls”
3,使用“chmod”命令改变文件权限
文字设定法
#chmod
u表示属主,g表示属组,o表示其他,a表示所有
+表示增加权限,-表示删除权限,=表示分配新权限的同时将原有权限删除
r表示可读,w表示可写,x表示可执行,ugo表示与该字母代表的用户有相同权限,s与S表示suid或sgid,t与T表示sticky
数字设定法
chmod
其中“xxxx”是由表示文件权限的12位二进制数换算的4位八进制数
4,特殊权限的作用:
SUID 是Set User ID, SGID是Set Group ID的意思。当用户运行一个应用程序时,此程序将继承运行它的用户的权限,而不是继承它所属用户的权限。设置了SETUID与SETGID的程序将继承它所属用户的权限,而不受运行它的用户权限的限制。
由于SUID和SGID是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的SUID和SGID位是没有多大意义的。
首先讲普通文件的SUID和SGID的作用,如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命令显示为 “-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfile”,任何用户都可以执行这个程序。UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括 user id和group id。用户可以用id命令来查到自己的或其他用户的user id和group id。除了一般的user id 和group id外,还有两个称之为effective 的id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euid和egid来确定进程对资源的访问权限。一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为 204和202,foo用户的uid和gid为 200,201,kevin运行myfile程序形成的进程的 euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。
如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。
SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。
SGID。 UNIX系统有一个/dev/kmem的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,权限设为“cr--r----- 1 root system 2, 1 May 25 1998 kmem”,但ps等程序要读这个文件,而ps 的权限设置如为“-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps”,这是一个设置了SGID的程序,而ps 的属主是bin,不是root,所以不能设置SUID来访问kmem,但大家注意了,bin和root都属于 system组,而且ps设置了SGID,一般用户执行ps,就会获得system组用户的权限,而文件kmem的同组用户的权限是可读,所以一般用户执行ps就没问题了。但有些人说,为什么不把 ps程序设置为root用户的程序,然后设置SUID位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?因为SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替SUID的程序。下面来说明一下SGID对目录的影响。SUID对目录没有影响。如果一个目录设置了 SGID位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。
sticky权限打开后,仅允许文件属主删除及移动该文件。
5,使用umask命令设置权限掩码:
该命令可为用户帐号中新建文件设置缺省用户权限。权限掩码由4位8进制数组成,第一位为精度位(0),其他三位分别表示属主、属组、其他的权限。将现有的权限减去掩码后,即是建立文件时默认的权限。使用“umask -S”命令查看各用户的默认权限。
例:将权限掩码设置为“077”,则只有属主具有“rwx”权限,其它用户没有任何权限
# umask 077
# umask -S
u=rwx,g=,o=
6,用chgrp命令改变文件属组:
chgrp命令用来改变指定文件的属组,指定的文件名支持通配符,如果用户不是该文件的属主或root,则不能更改。
#chgrp 组名或组ID 文件名
-R 表示递归地改变其下子目录和文件的属组
7,用chown命令改变文件属主和属组:
#chown
-R 表示递归地改变基下子目录和文件的属性
-v 显示chown所做的工作
http://www.happylivelife.com/r/?id=47
http://www.happylivelife.com/r/?id=38
* 声明:本文由其作者或媒体撰写,观点仅代表其本身,不代表本站立场。
编辑
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
 
<< < - > >>
[C++][*] [C][*] [po][*] [JS][*] [JAVA][*] [HIS][*] [Web][*] [H][*] [GIT][*] [Android][*] [DB][*] [0][*] [TL][*] [O][*] [3D][*] [PAS][*] [IOS][*] [算法][*] [地球][*] [学习方法][*] [探索][*] [宇宙][*] [Linux][*] [阅读秘诀][*] [考试技巧][*] [...]
天天快乐生活[HappyLifeLife.com]
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士