特殊字符

2017-10-14  本文已影响5人  rochestor

# 注释符

#!/bin/bash 写在脚本开始的最前面,表示这个脚本需要使用/bin/bash 来解释
# 这是一行注释,不会被执行

; 分号, 命令分隔符

if [ -f "${file}" ];then
    echo "${file} is an existing file"; cp ${file} ${file}_name
fi

;; 条件语句终止符号,用在case语句

#!/bin/bash

variable='abc'
case ${variable} in
    abc)
        echo "\$variable=abc" ;;
    cde)
        echo "\$variable=cde" ;;
    *)
        echo "default"
esac

. 句点

1. 等价于source e.g.  source .bashrc   等价于  . .bashrc
2. 作为文件名的一部分,表示是隐藏的文件
3. 代表当前目录   cp /users/rochestor/test.sh . 将test.sh 复制到当前目录

\ 反斜杠【转译符】

\n 换行
\t 制表符

/ 正斜杠【文件分割符】

分割路径的作用 /Users/rochestor/test.sh
除法运算符 12 / 3

` 命令替换符 [backquotes] [backticks]

var=command 使得命令的输出结果赋值给一个变量
跟$(command) 的作用类似

: 空命令 【冒号】,等价于 no op ,即 空命令

# 它与true效果一样,并且都是内建命令
:
echo $?   # 返回 0


# 可在 if/then 中充当占位符:
if condition
then :   # 什么都不做,跳出判断执行下一条语句
else
   take-some-action
fi


#与>重定向操作符结合,可以在不改变文件权限的情况下清空文件。如果文件不存在,那么将创建这个文件。+
: > data.xxx   # 文件 "data.xxx" 已被清空

# 与 cat /dev/null >data.xxx 作用相同
# 但是此操作不会产生一个新进程,因为 ":" 是shell内建命令。


#:也可以作为一个域分隔符,比如在/etc/passwd和 $PATH 变量中
echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games

$ 取值符号,用来进行变量替换

# $variable 这种写法是 ${variable} 的简化形式。在某些特殊情况下,使用 $variable 写法会造成语法错误,使用完整形式会更好

var1=5
var2=6

echo ${var1}  # 等价于 echo $var1


在正则表达式中,$ 匹配行尾字符串

$@  $* 位置参数
$$  运行脚本的进程ID
$?  保存上一个命令的执行结果

() 括号

#命令组(a=hello;echo $a)
#通过括号执行一系列命令会产生一个子shell(subshell)。 括号中的变量,即在子shell中的变量,在脚本的其他部分是不可见的。父进程脚本不能访问子进程(子shell)所创建的变量。

数组初始化
array=(ele1 ele2 ele3 ele4)

{} 花括号扩展结构

echo \"{these, words,are,qupted}\" # 除非被引用或被转义,否则空白符不应在花括号中出现。
# output: "These" "words" "are" "quoted"

{a..z}  扩展的花括号结构
echo {a..z}  #  a b c d e f g h i j k l m n o p q r s t u v w x y z

# 使用扩展花括号初始化一个数组
base64_charset=( {A..Z} {a..z} {0..9} + / = )

#代码块[花括号],又被称作内联组(inline group)。它实际上创建了一个匿名函数(anonymous function),即没有名字的函数。但是,不同于那些“标准”函数,代码块内的变量在脚本的其他部分仍旧是可见的

#!/bin/bash
# 读取文件 /etc/fstab

File=/etc/fstab

{
read line1
read line2
} < ${File}

echo "First line in ${File} is:"
echo "${line1}"
echo
echo "Second line in ${File} is:"
echo "${line2}"

exit 0
#与由圆括号包裹起来的命令组不同,由花括号包裹起来的代码块不产生子进程


# 文本占位符。在 xargs -i 后作为输出的占位符使用
# -t是处理之前打印出命令,  使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符
ls . | xargs -i -t cp ./{} $1 
 

{} ; 路径名 import 这个很重要,所以单独拉出来说

#通常在 find 命令中使用,但这不是shell的内建命令
在执行find -exec时最后需要加上;,但是分号需要被转义以保证其不会被shell解释。
find .  -type f --maxdepth 1 -name "*.log" -ctime +7 -exec rm {} \;
# 删除当前目录下面, 7天以前的log文件

[ ] 测试

[ 是shell内建命令 test 的一个组成部分

[[ ]] 测试

在 [[ ]] 之间填写测试表达式。相比起单括号测试 ([ ]),它更加的灵活。它是一个shell的关键字

$[ ... ], 整数扩展符

a=3
b=7

echo $[$a+$b]   # 10

(( )) 整数扩展符

整数扩展符。在 (( )) 中可以计算整数的算术表达式。

> &> >& >> < <> 重定向

command &>filename 
# 将命令 command 的标准输出(stdout) 和标准错误输出(stderr) 重定向到 filename。

# 将命令的标准输出重定向至标准错误输出。
command >&2 

#重定向在用于清除测试条件的输出时特别有效,只想知道命令是否执行成功,不想获取执行的输出

type bogus_command &>/dev/null
echo $?

# 正则表达式中的单词边界(word boundary)
grep '\<the\>' textfile

&, 后台运行操作符

nohup sh mudi.sh 2 > mudi.log 2>&1 &
# 将脚本 mudi.sh 放到后台跑

|| ,逻辑或

# 在测试结构中,任意一个测试条件为真,整个表达式为真。返回 0(成功标志位)

Ctrl-U

删除光标所在字符之前的所有字符。 在一些情况下,不管光标在哪个位置,Ctrl-U 都会删除整行文字。

参考

[find命令之xargs](http://www.cnblogs.com/peida/archive/2012/11/15/2770888.html)
[自动删除n天前日志](http://www.cnblogs.com/peida/archive/2013/03/25/2980121.html)

唯爱与技术不可辜负

上一篇下一篇

猜你喜欢

热点阅读