我们在服务器上经常能看到很多复制,启动停止程序的脚本,下面就来慢慢学学…… 菜鸟一枚如有错误还请大家指教
一、文件状态的测试
1、文件状态有: -d(directory):目录 -L(link): 符号链接 -f (file): 正规文件 -r (read) 可读 -w (write) : 可写 -x(ecexute) 可执行 -u(set user id) 文件有suid 位设置
-s : 文件长度大于0 非空
这里冒昧的写了简称的全称,这样写便于记忆,如有写错请指正谢谢~
2、测试的方式有两种:
1)、test condition
2)、[ condition ] 这里注意[ 和字符以及] 和字符之间有空格的。
3、实例 ,测试是正规文件还是目录:
1)、 test -f java && echo "file" || "not file"
2)、[ -f java ] && echo "file" || "not file"
3)、test -r java && echo "can read" || echo "can not read"
3、&& 、||命令执行控制 解释:
&&、语法格式如下:
command1 && command2 [&& command3 ...]
a.命令之间使用 && 连接,实现逻辑与的功能。
b.只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
c.只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。
||、语法格式如下:
command1 || command2 [|| command3 ...]
a.命令之间使用 || 连接,实现逻辑或的功能。
b.只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
c.只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。
4、在判断的时候添加逻辑操作
1)、[ -f java -a -f java1] && echo " all file" || echo " not file all" 只有在java和java1 为标准文件的时候 才会输出 all file 否则为not file all
2)、[-f java -o -f java1] && echo "file" || echo "all not file" 只要有一个是标准文件则会输出file 否则会输出 all not file
5、 -a 、-o 、! 解释
1)、-a 操作符两边都为真的时候才是正,否则为假。
2)、-o 操作符一边为真则为真,否则为假。
3)、! 条件为假 结果为真,条件为真结果为假。
二、字符串的判断比较
字符串的判断,比较我们经常看到的有,是否为空,两个字符串是否相等等这些方式,下面看看具体的比较:
1、比较方式和上面的一致,即使用 test 和[ ] 两种方式。
2、 字符串中常见的判断,比较符号如下:
= 两个字符串相等,和java c/c++ 中判断相等不同 != 两个字符串不相等 -z 空字符 -n 非空字符
3、实例如下:
1)、测试字符串相等: a="java" b="c" test "$a" = "$b" 执行后查看比较结果: echo $? 如果为1 则表示不相等如果是0 则表示相等
2)、 不适用test 而是使用 [ ] 来实现 但要记得两边的空格 [ "$a" = "$b" ] echo $? 如果输出为1 则表示不相等如果输出为0 则表示相等
不相等和 相等的判断格式是一样的。
3)、判断是否为空 : test -z "test" 如果echo $? 输出为 1 则表示为空 0 则表示非空
4)、 test -n "test" 如果 echo$? 输出为1 则表示不为空而0 则表示为空
5)、同样字符串的比较也可以使用 [ ] 来实现。 [ -z "test" ] 如果 echo $? 输出1 则表示为空 0 则表示非空 [ -n "test" ] 他的echo $? 结果和之前的相反了。
[ -z "$a" ] [ -n "$a" ] 来判断变量是否为空。
三、判断数值的大小以及相等
1、 其实数值的大小比较和字符串是否相等的比较的格式是一样的,所以这里就不一一例举了。下面将各个简称的全拼列出来这样方便记忆
2、各个简称、全称如下:(greater 教大的)
-eq 就是 EQUAL等于
-nq 就是 NOT EQUAL不等于
-gt 就是 GREATER THAN大于
-lt 就是 LESS THAN小于
-ge 就是 GREATER THAN OR EQUAL 大于等于
-le 就是 LESS THAN OR EQUAL 小于等于
四、expr命令
1、expr 的命令格式
expr argumeng operator argument 来计算数值,如果最后的结果是 数值则 输出的是0 即 $? 的值为0 否则不为0
五、上面列举了一些命令的格式,下面就使用这些命令来编写一下脚本实现某些功能
1、使用 && 、|| 命令执行控制符来复制文件,如果文件复制成功则删除原来的文件,否则输出复制失败。
cd /usr/src/ cp java1 ./source/ && rm -r java1 || echo "copy failed"
这个可以一个一个的敲代码也可以 写到文件中执行
注意: 在linux中 获取系统当前的时间的方式有两种
(1)、获取时间并赋值给变量 var=`date +%Y-%m-%d` (这里注意 将date 等圈起来的不是单引号而是左上角的英文点号,也就是反引号)
(2)、var =$(date +%Y%m%d) (1和2是两种不同的获取时间的方式,而%Y 和%m之间的是 显示时间的格式,和获取没有关系)
获取时间到秒: var=$(date +%Y%m%d%H%M%S)
从两种获取时间的方式看 感觉$() 这种方式简洁些, 这里的这种圆括号和反引号吧里面的内容当做了命令来执行,这和单引号和双引号不同。
2、上面我们获取了当前时间,但是我们要想获取当前时间的 前一天,前一个星期,前一个月,前一年,后一天,后一星期等怎么获取那具体的方式如下:
(1)、获取当前时间: var=$(date +%Y%m%d)
(2)、获取当前时间的前一天: var=$(date -d "1 day ago" +%Y%m%d)
(3)、获取当前时间的前一星期: var=$(date -d "1 week ago" +%Y%m%d)
(4)、获取当前时间的前一个月:var=$(date -d "1 month ago" +%Y%m%d)
(5)、获取当前时间的前一年: var=$(date -d "1 year ago" +%Y%m%d)
获取后一天,一周,一星期,一个月,一年前面加负号就可以
(1)、获取当前时间: var=$(date +%Y%m%d)
(2)、获取当前时间的后一天: var=$(date -d "-1 days ago" +%Y%m%d)
(3)、获取当前时间的后一星期: var=$(date -d "-1 week ago" +%Y%m%d)
(4)、获取当前时间的后一月:var=$(date -d "-1 month ago" +%Y%m%d)
(5)、获取当前时间的后一年: var=$(date -d "-1 year ago" +%Y%m%d)
平时我们看到的日志文件都是按照时间命名的,要么在前面,要么在后面,所以我们可以使用获取时间的方式来定期删除某些日志文件:
var=$(date -d"1 days ago" +%Y%m%d) va=$var.txt if test -f "$va" then rm "$va" echo "rm $va success" else echo "no file" fi
这样就删除了当前时间(20151012)的前一天的那个文件 即:20151011.txt 文件
六、 单引号 、双引号、反引号以及各种括号的了解(部分来自网络)
**、 在上面我们也看到了 反引号和 小括号的使用,下面我们就了解一下 平时常用到的引号以及括号的区别
1、单引号和双引号
首先,单引号和双引号,都是为了解决中间有空格的问题。
因为空格在linux中作为一个很典型的分隔符,比如string1=this is string,这样执行就会报错。为了避免这个问题,因此就产生了单引号和双引号。
(1)、他们的区别在于,单引号将剥夺其中的所有字符的特殊含义,而双引号中的'$'(参数替换)和'`'(命令替换)是例外。所以,两者基本上没有什么区别,除非在内容中遇到了参数替换符$和命令替换符`。
所以下面的结果:
num=1
echo ‘$num’
$num
echo “$num”
1
所以,如果需要在双引号””里面使用这两种符号,需要用反斜杠转义。
2、反引号``
反引号和$()是一样的。在执行一条命令时,会先将其中的 ``,或者是$() 中的语句当作命令执行一遍,再将结果重新加入到原命令行中,例如:
echo `ls`
会先执行 ls 得到xx.sh等,再替换原命令为:
echo xx.sh
最后执行结果为
xx.sh
那么,平时我们遇到的把一堆命令的执行结果输出到一个变量中,需要用这个命令替换符括起来,也就可以理解了。
这里又涉及到了一个问题,虽然不少系统工程师在使用替换功能时,喜欢使用反引号将命令括起来。但是根据POSIX规范,要求系统工程师采用的是$(命令)的形式。所以,我们最好还是遵循这个规范,少用``,多用$()
3、小括号,中括号,和大括号的区别
那么,下面又涉及到了一个问题,就是小括号,中括号,和大括号的区别。
先说说小括号和大括号的区别。这两者,实际上是“命令群组”的概念,也就是commandgroup。
( ) 把 command group 放在subshell去执行,也叫做 nested sub-shell。
{ } 则是在同一个 shell 內完成,也称为 non-namedcommand group。
所以说,如果在shell里面执行“函数”,需要用到{},实际上也就是一个命令群组么。
不过,根据实测,test=$(ls -a)可以执行,但是test=${ls–a}语法上面是有错误的。估计也和上面所说的原因有关。
4、$( )的用途和反引号` `一样,用来表示优先执行的命令,比如ls -l
5、${ }就是取变量的值,比如:echo ${PATH}