read

从键盘或标准输入中读入文本,可以使用read以交互的形式读取用户输入

⑴从输入中读取N个字符并存入变量varibale_name

read - n number_of_chars variable_name;

⑵使用read显示提示信息:

read -p "enter input:" var

⑶在给定时间内读取输入

read -t timeout var

⑷使用特定的定界符作为输入行的结束

read -d delim_char var

字段分隔符和迭代器

内部字符安分隔符(Internal Field Separator,IFS)是shell脚本编程的一个重要的概念,作为分隔符,IFS有其特殊的用途,,它是一个环境变量,其中保存了用于分隔的字符,它是当前shell环境使用的默认丁姐字符串。场景:需要迭代一个字符串或逗号分隔型数值(CSV)中的单词,可以使用IFS=",".IFS的默认值为空白字符;

FIGHTING...cat ifs.sh
#!bin/bash

data="zhao,qian,sun,li,zhou"
oldIFS=$IFS
IFS=,
for item in $data;
do
    echo Item:$item
done
IFS=$oldIFS
FIGHTING...bash ifs.sh
Item:zhao
Item:qian
Item:sun
Item:li
Item:zhou
FIGHTING...

 循环

面向列表的for循环:

for var in list;
do
  echo $var;
done

迭代指定范围的数字:

for((i=0;i<10;i++))
{
  echo "biubiubiu";
}

while循环

while true
do
  echo "pipipi"
done

  比较和测试

if和if else if else

算术比较:比较条件通常被放置在封闭的中括号内,注意在[和]与操作数之间有一个空格。

[ $var -eq 0 ]  : 判断$var 等于 0 ,返回真

[ $var -nq 0 ] : 判断$var 不为 0 , 返回真

[ $var -gt  0 ] : 判断$var 大于 0 , 返回真

-[ $var -lt 0 ] : 判断$var 小于 0 , 返回真   

-ge 大于或等于      -le 小于或等于。

-a逻辑与,-o逻辑或,

[ $var -ne 0 -a $var -gt 2 ] 

[ $var -ne 0 -o $var -get 2 ] 

与文件相关:

[ -f $file_var ] : 给定的变量是否包含正常的文件路径或文件名,则返回真

[ -x $var ] : 文件是否可执行, -w 是否可写 , -r 是否可读

[ -d $var ] : 文件是否是目录,则返回真。-e 是否存在

[ -b $var ] :是否是块状文件, -L 是否是符号链接, -c 是否是字符设备文件的路径。

字符比较:

[[ $str == $str2 ]] :当str 等于str2时,返回真。

[[ $str != $str2 ]] :当str不等于str2时,返回真。

[[ $str > $str2 ]] : 如果str的字母序比str2大,则返回真。

[[ $str < $str2 ]] :如果str的字母序比str2小,则返回真。

[[ -z $str ]] :: 如果str为空串,则返回真

[[ -n $str ]] : 如果str不为空串,则返回真。

cat

cat命令用于显示或拼接文本的内容。

打印单个文件的内容:

 FIGHTING...cat test.txt
hello world 
toady is a fine day.
		-name : liudong
		

打印多个文件的内容:

 FIGHTING...cat LOG.TXT test.txt
THIS IS A GENERATED FILE. DO NOT TO EDIT.
hello world 
toady is a fine day.
		-name : liudong
		

将stdin和另一个文件的数据组合在一起:

 FIGHTING...echo "hello " | cat - test.txt
hello 
hello world 
toady is a fine day.
		-name : liudong

去掉多余的空白行:(注意,不是将空白行去掉,而是将两个连续的空白行压缩成一个空白行)

 FIGHTING...cat test2.txt 
123


456


789
123
456

999
 FIGHTING...cat -s test2.txt 
123

456

789
123
456

999

在输出的每一行前面加上行号:

 FIGHTING...cat -n test.txt
     1	hello world 
     2	toady is a fine day.
     3			-name : liudong
     4			

 查找

find命令可以沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应的操作,默认的操作时打印出文件和目录,可以使用-print选项来指定.

find base_path :base_path可以是任意位置,find会从该位置开始往下查找。

 FIGHTING...find . -print
.
./test.txt
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./test2.txt
./typescript
./timing.log
./output.session

根据文件名或正则表达式进行搜索

find /home/ld/ -name '*.txt" -print  注意:使用单引号可以使该字符串能够原封不动地传给find命令。

FIGHTING...find /home/ld/ -name '*.txt' -print
/home/ld/.mozilla/firefox/fvqnd6nl.default/AlternateServices.txt
/home/ld/.mozilla/firefox/fvqnd6nl.default/SecurityPreloadState.txt
/home/ld/.mozilla/firefox/fvqnd6nl.default/SiteSecurityServiceState.txt
/home/ld/.mozilla/firefox/fvqnd6nl.default/revocations.txt
/home/ld/.cache/tracker/db-version.txt
/home/ld/.cache/tracker/db-locale.txt
/home/ld/.cache/tracker/parser-sha1.txt
/home/ld/.cache/tracker/locale-for-miner-user-guides.txt
......

find -a和-and可以执行逻辑与操作,-o和-or可以执行逻辑或操作

 FIGHTING...find /home/ld/ \( -name '*te*t'.txt -and -name '*s*' \)
/home/ld/app/hive234/examples/files/dynpart_test.txt
/home/ld/app/hive234/examples/files/escapetest.txt
/home/ld/workspace/test.txt

-path参数可以限制所匹配文件的路径以及名称

使用正则表达式进行匹配

 FIGHTING...find . -regex '.*\.\(py\|txt\)$'
./test.txt
./test2.txt
 FIGHTING...find . -iregex '.*\.\(py\|txt\)$'
./test.txt
./LOG.TXT
./test2.txt
./TEST.TXT

使用!排除匹配到的模式

 FIGHTING...find . ! -name '*.txt' -print
.
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./typescript
./timing.log
./output.session
./TEST.TXT

基于目录深度的搜索

默认情况下,find会从指定的搜索目录一直往下搜索,如果碰到指向自身的链接,find命令就会陷入死循环中,可以使用-maxdepth和-mindepth选项可以限制find命令遍历的目录深度。-L命令可以强制其跟随符号链接,find命令默认不跟随符号链接。

 FIGHTING...find -L /home/ld -maxdepth 2 -name '*.txt'
/home/ld/workspace/test.txt
/home/ld/workspace/test2.txt

根据文件类型搜索

文件类型参数有:-f 表示文件 -d 表示目录 -l 表链接 -c 字符设备 -b 块设备 -s 套接字

 FIGHTING...find . -type d 
.
 FIGHTING...find . -type f
./test.txt
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./test2.txt
./typescript
./timing.log
./output.session
./TEST.TXT
 FIGHTING...find . -type l

根据时间戳进行搜索

Linux系统中的每个文件有三种时间戳:

访问时间(-atime):用户最近一次访问文件的时间

修改时间(-mtime):文件内容最后一次被修改的时间

变化时间(-ctime):文件元数据最后一次改变的时间。

打印出最近7天内被访问过的所有文件

 FIGHTING...find . -type f -atime -7 -print
./test.txt
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./test2.txt
./typescript
./timing.log
./output.session
./TEST.TXT

打印恰好在7天前被访问过的所有文件

 FIGHTING...find . -type f -atime 7 -print
 FIGHTING...

打印出访问时间超过7天的所有文件

 FIGHTING...find . -type f -atime +7 -print
 FIGHTING...

-mtime,-ctime同理,-atime,-mtime,-ctime都是以“天”为单位来计时的,find命令还支持以分钟为计时单位的选项。如-amin,

-mmin,-cmin.

根据文件大小搜索:

文件大小参数有:-b:块(512字节) -c: 字节 -w:字(2字节) -k:千字节(1024k) -M:兆字节(1024k) -G:吉字节(2014M)

 FIGHTING...find . ls -al
total 19556
drwxrwxr-x.  2 ld ld     200 Dec  8 21:24 .
drwx------. 20 ld ld    4096 Dec  8 21:24 ..
-rw-rw-r--.  1 ld ld       0 Dec  7 21:36 3
-rw-rw-r--.  1 ld ld      33 Dec  7 01:16 helloworld.sh
-rw-rw-r--.  1 ld ld     137 Dec  7 21:56 iff.sh
-rw-rw-r--.  1 ld ld     269 Dec  7 21:28 ifs.sh
-rw-rw-r--.  1 ld ld      42 Dec  7 07:53 LOG.TXT
-rw-rw-r--.  1 ld ld 8921088 Dec  8 21:56 output.session
-rw-rw-r--.  1 ld ld     205 Dec  7 10:24 std.sh
-rw-rw-r--.  1 ld ld      29 Dec  8 20:54 test2.txt
-rw-rw-r--.  1 ld ld      55 Nov 30 06:05 test.txt
-rw-rw-r--.  1 ld ld       2 Dec  8 21:24 TEST.TXT
-rw-rw-r--.  1 ld ld   65536 Dec  8 21:40 timing.log
-rw-rw-r--.  1 ld ld 8921088 Dec  8 21:56 typescript
 FIGHTING...find . find . -type f -size +100k
./typescript
./output.session
 FIGHTING...find . find . -type f -size +100M

基于文件权限和所有权的匹配

 FIGHTING...find . -type f -perm 664 -print
./test.txt
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./test2.txt
./typescript
./timing.log
./output.session
./TEST.TXT
 FIGHTING...find . find . -type f -perm 777 -print
 FIGHTING...
 FIGHTING...find . -type f -user ld -print
./test.txt
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./test2.txt
./typescript
./timing.log
./output.session
./TEST.TXT
 FIGHTING...find . -type f -user lx -print
find: ‘lx’ is not the name of a known user


......其他的find操作。

 

 

参考《Linux Shell脚本攻略》