# 注释符
#!/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)
唯爱与技术不可辜负
网友评论