linux shell 编程1文件权限检测、字符串比较判断、数值大小比较、时间获取以及单引号双引号反引号等的使用

时间:2022-12-17 05:40:45

我们在服务器上经常能看到很多复制,启动停止程序的脚本,下面就来慢慢学学…… 菜鸟一枚如有错误还请大家指教

一、文件状态的测试

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}