shell 删除文件下的* (copy).jpg备份文件

shell编程中,  在for, while循环中为什么不用(), {}

  不是没有;

  而是因为(), {}做了其他用途:

  (): 执行命令组, 注意这个命令组是新开一个子shell中执行, 因此,括号中的变量不能被脚本余下的部分使用.格式随意; 还有其他使用如: $(ls)... array=(a b c d)

  {}: 执行命令组, 事实上是创建了一个匿名函数,  但是这个跟()有区别: 大括号不会新开一个 子shell, 仍然是在当前shell中执行的命令组, 所以其中的变量可以为余下的脚本

      使用...但是格式严格: 括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格

[Sun Dec 06 15:45 ~/Desktop]# A=1;echo $A; (A=2;); echo $A
1
1
[Sun Dec 06 15:46 ~/Desktop]# echo $A
1
[Sun Dec 06 15:46 ~/Desktop]# A=1;echo $A; { A=2; }; echo $A
1
2
[Sun Dec 06 15:47 ~/Desktop]# echo $A
2
[Sun Dec 06 15:47 ~/Desktop]#

basename 和 dirname 分别是/usr/bin/下的 取基本名字和取目录名字 的命令

shell支持" 常量变量" , 如同C语言一样, 推荐大写

shell截取字符串 和 Windows bat中截取字符串的思想是一样的, 只不过 使用的符合不同:

shell  使用的是%% , %,  ## , # 来截取. 截取符有两种: #, %:  掌握三点:

 1.  %%, % 是从前往后截取, 

  ## , # 是从后向前截取

 2. 两个截取符表示匹配该方向上的 第一个,   一个截取符表示 匹配该方向上的最后一个.

  3. 匹配字符*之间的相对位置,    如果是从前往后,则*在匹配字符符的后面,  反之,  如果是从后向前, 则* 在匹配字符的前面.

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

shell中的替换:

  var=${var:+abc}...

  var=${var:-abc}....

  var=${var:=abc}...  

  var=${var:? abc}....

处理shell命令中的一些特殊符号的文件/文件夹:

  常用的两种方法:  就是显示的指明当前路径:   touch  ./-abc

          或者: 使用使用引号: touch  "#123.txt"

shell中的for: 有三种形式

  for file  in `ls`(集合或命令) ; do

    .....

    done

  第二种形式:

  for [ 条件 ] do ....  done

  第三种形式:

  for  ((  i = 0; i < 10; i++ )) do. ... done

这种形式中, for的书写跟C语言相同, 符合之间不必 加 空格  :

[Sun Dec 06 15:14 ~/Desktop]# for((i=0;i<10;i++)); do echo $i ; done
0
1
2
3
4
5
6
7
8
9
------------------------------------------------------------------

 sh 执行脚本, 有一个非常好的参数:  -x:  会将命令展开后 , 再执行, 可以看到程序的执行 过程和经过....

 关于$IFS???

 IFS:  internal field separate: 内部域分隔符.默认的系统变量值是: $IFS= ' ' ,这样就不好处理包含空格的文件名, 如: "test 1.jpg'

IFS在什么时候起影响? 主要是在shell脚本的for循环中, 当要列出集合中的item时, 默认是以<space空格><tab><newline>为分隔符号的.所以,

如果你要列出的某个条目中包含空格时,就要出错. 这时,要把 IFS修改成只用newline做分隔符合...

  oldifs=$IFS

  IFS=$' '

  for.............

  IFS=$oldifs

 <注意: 虽然ls目录时, 看起来是一个行中列出来的, 实际上每个item还是默认的用 来分隔的,  所以在for循环中, 直接用for file in  `ls`,    只是每个条目内部的空格, 受IFS 的影响>

   

echo -e?

是指, 当echo后的字符串中出现 a, , 时将作为特殊含义的字符, 而不是普通字符.  这里要注意的是, 要得到 a, 必须是: \a, 要将

通过\ 转义出来.否则是没有效果的. 

如果只是一个backslash , 则对后面的字符没有影响:   echo  abca123= abca123

 od -Ax -tc file.txt?

od=octal dump, 将文件内容或输入内容 管道, 用不同的进制来表示: 

-A : 指定地址进制 address

-t:  指定输出格式的进制: -t o, x, d, c(char..)

[root@localhost ~]# echo -n a|od -Ad   -i   (地址用十进制表示,  内容用int整数表示)
0000000          97       (第一列表示地址, 单位=byte 字节,   一个字节一个字节的增长)
0000001
[root@localhost ~]# echo -n a|od -Ad -t x
0000000 00000061
0000001

 echo   $'ab'  和 echo 'ab' ???

$和后面的引号合在一起,  表示得到一个 a 的字符,  即反斜杠和后面的字符作为一个整体看待.

这也表明:  要获得一个具有特殊意义的 转义字符, 如: a, , , , 等等, 可以有两种方法, 一是输两个\a123, 二是: 用$' '的格式.

即:  $' ' 就是得到一个 字符: ,  而不是两个字符: , 和 n.

       可以用od来看, 就可以清楚地看到所占的字节地址了:

[root@localhost ~]# echo ' ' |od -Ad -t c
0000000      n    (这个是分开了的, \, n 分别占一个字节, 共2个字节)
0000003
[root@localhost ~]# echo  $' '|od -Ad -t c
0000000       ( 合起来只占一个字节)
0000002
[root@localhost ~]#

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

trail:  n. 小路/小径;   踪迹, 足迹; 一缕;  动词::  vi. 拖,  vt.  跟踪;  尾随

other youngsters(年轻人) are not so lucky.

These programs may lead youngsters a'stray . 迷路的, adv. 误入企图的...

Mark this trail so that travelers(根据语义: 表示复数, 但又不确指) will not go astray.

he was not unlike a hurried animal,  deftly pursued by hunter and hound.(猎狗)

the hounds  found  the trail of the fox.

the  truck  left  a trail of dust.  一股灰尘

sth. trails along behind ....

the boy trailed his parents.

shell 中的字符串包含函数?

shell中本身没有提供函数库, 因此也就没有字符串函数的,   即使要用函数, 也只有自己写.

判断字符串包含的常用方法:

  一, 用字符串截取操作:   [ ${srcstr:0:2} == $srch ] && echo "included" || echo "not included"

      但是这个方法有个缺点,你必须知道srcstr和srch,然后才能比较截取位置和个数, 并且,当srcstr是变化着的时候,也就不行了?

        ${var:start:length},这个不是函数,而是shell提供的一种字符串操作而已,length不能为负, 

   二,用grep命令:

      echo "$srcstr"  | grep -q "$srch"   #  grep用-q选项,将不输出$srcstr的值...

      if [ $? -eq 0 ]; then ..... fi      #如果你认为是字符串,最好还是加上双引号, 否则可能出错, 如: 字符串中包含括号(..)等符合时,

                       #则命令可能会出错.

type?

which 是看当前命令是不是:   shell外部的: 独立的命令 :文件, 默认的在 /bin/ , /sbin/....的环境path中搜索.

所以type可以查看 , 当前命令 :是不是外部的独立文件命令: 还是 shell本身的内建命令, 即只有shell才能使用, 而且不是独立的文件...

[root@localhost Desktop]# type cat
cat is /bin/cat
[root@localhost Desktop]# type enable
enable is a shell builtin


shell中的*: 先匹配任意字符, 如果 匹配不到, 则作为一个普通字符"*"来对待,

grep 是用来过滤"行"的, 不是过滤字符的 : 指的是, "包含/的不包含 模式字符 行"  其中-v是指:  -v, --invert-match        select non-matching lines





 

  

原文地址:https://www.cnblogs.com/bkylee/p/5019207.html