shell 脚本学习

发布时间 2023-06-16 17:54:41作者: redrobot

 

shell 通配符

 

3、通配符和正则表达式比较

(1)通配符和正则表达式看起来有点像,不能混淆。可以简单的理解为通配符只有*,?,[],{}这4种,而正则表达式复杂多了。

2*在通配符和正则表达式中有其不一样的地方,在通配符中*可以匹配任意的0个或多个字符,而在正则表达式中他是重复之前的一个或者多个字符,不能独立使用的。比如通配符可以用*来匹配任意字符,而正则表达式不行,他只匹配任意长度的前面的字符。

(3)使用场景:通配符 是文件名。正则表达式 文本内容

(4) 使用命令 通配符 find rm ls cp  由shell解析; 正则表达式 vi grep sed awk

 

sh新建一个子shell进程,变量在主shell中无法获取 source在当前shell中执行脚本,变量在主shell即当前shell中可以获取
例子:
1.新建一个test.sh脚本,内容为:A=1
2.然后使其可执行chmod +x test.sh
3.运行sh test.sh后,echo $A,显示为空,因为A=1并未传回给当前shell
4.运行./test.sh后,也是一样的效果
5.运行source test.sh 或者 . test.sh,然后echo $A,则会显示1,说明A=1的变量在当前shell中
拓展: source filename 等价于 . filename 文件没有执行权限也可以;而sh file.sh 等价于 ./file.sh(执行表示当前路径下的file.sh) 当然如果全路径就是/xx/xx.sh了 文件要有执行权限

 

1、shell检测某一文件是否存在

当你在#shell#中需要检查一个文件是否存在时,通常需要使用到文件操作符-e-f。第一个-e用来检查文件是否存在,而不管文件类型。第二个-f仅仅用来检查文件是常规文件(不是目录或设备)时返回true。

 

2、shell检测某一目录是否存在

Linux系统中运算符-d允许你测试一个文件是否时目录。

例如检查/etc/docker目录是否存在,你可以使用如下脚本:

 3.检查文件是否不存在

4、检查是否存在多个文件
不使用复杂的嵌套if/else构造,您可以使用-a(或带[[的&&预算符)来测试是否存在多个文件,示例如下:

 

参考:https://baijiahao.baidu.com/s?id=1767844801168947948&wfr=spider&for=pc

shell 判断文件夹或文件是否存在

文件夹不存在则创建

if [ ! -d "/data/" ];then
  mkdir /data
  else
  echo "文件夹已经存在"
fi

文件存在则删除

if [ ! -f "/data/filename" ];then
  echo "文件不存在"
  else
  rm -f /data/filename
fi

判断文件夹是否存在

if [ -d "/data/" ];then
  echo "文件夹存在"
  else
  echo "文件夹不存在"
fi

判断文件是否存在

if [ -f "/data/filename" ];then
  echo "文件存在"
  else
  echo "文件不存在"
fi

文件比较符

-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2  [ "/data/file1" -nt "/data/file2" ]
-ot 判断file1是否比file2  [ "/data/file1" -ot "/data/file2" ]
https://www.runoob.com/note/47027

参考: shell脚本中空格的注意问题
1. =
赋值时:两边不能有空格

(())内外部括号之间无空格,( () )这样报错。但内部括号内不限制,随便如s=$(( $i+1 ))可以

还有${path}  无空格。
i=1
i=$((i+1))
比较时:两边必须有空格
if [ $a = $b ]
2. if
整数比较时:中括号前后必须有空格
if [ a -xx b ]
参考: Linux#Shell#if [ $# -ne 1 ];then 是什么意思?
看来双括号还有问题…再学吧…
1. 变量名、等号、值之间不能有空格
2. 变量的引用是用 $ 符号加上变量名
echo ${a}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,建议给所有变量加上花括号,这是个好习惯,既便于阅读,又不易出错。

3 条件比较  = 前后都需要空格
4. if 需要 then ; elif 也需要then
5.操作符之间需要空格 test ! -d $1 ; 其中的!与-d 需要隔开
6.命令与对象之间需要空格 if [ -x "/root/a.sh" ];then if 中换一行的执行语句开头,不强制需要空格。
7.A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A。 A=$(ls -la) 等价于反引号
8.





前言

首先在Shell中,括号表示条件测试方法。主要用在if-then、case等需要条件判断的语句结构中。

最近在看bash,括号搞的我一头雾水,所以总结一下,理清思路!

括号

  • 括号一般在命令替换的时候使用。
#!/bin/bash

today=$(date +%y%m%d)
touch log.$today

双括号

  • 使用双括号,在比较过程中使用高级数学表达式
符号描述
val++ 后增
val-- 后减
++val 先增
--val 先减
逻辑求反
位求反
** 幂求反
<< 左位移
>> 右位移
&& 逻辑和
    逻辑或
$ cat test23.sh
#!/bin/bash

val1=10
if(( $val1 ** 2 > 90 ))
then
    ((val2 = $val1 ** 2))
    echo "The square of $val1 is $val2"
fi

# seal @ bogon in ~/Desktop/Shell [16:48:19]
$ ./test23.sh
The square of 10 is 100
  • 注意,不需要将双括号中表达式里的大于号转义。这是双括号命令提供的另一个高级特性。

方括号

  • 方括号定义了测试条件。

  • 第一个方括号后和第二个方括号前都要加一个空格,否则会报错。

  • 方括号主要包括4类判断:

    • 数值比较
    比较描述
    n1 -eq n2 检查n1是否与n2相等
    n1 -ge n2 检查n1是否大于或等于n2
    n1 -gt n2 检查n1是否大于n2
    n1 -le n2 检查n1是否小于或等于n2
    n1 -lt n2 检查n1是否小于n2
    n1 -ne n2 检查n1是否不等于n2
    #!/bin/bash
    # Using numeric test evaluations
    value1=10
    value2=11
    #
    if [ $value1 -gt 5 ]
    then
        echo "The test value $value1 is greater than 5"
    fi
    #
    if [ $value1 -eq $value2 ]
    then
        echo "The values are equal"
    else
        echo "The values are different"
    fi
    #
    
    • 字符串比较
    比较描述
    str1 = str2 检查str1是否和str2相同
    str1 != str2 检查str1是否和str2不同
    str1 < str2 检查str1是否比str2小
    str1 > str2 检查str1是否比str2大
    -n str1 检查str1的长度是否非0
    -z str1 检查str1的长度是否为0
    $ cat test8.sh
    #!/bin/bash
    # testing string equality testuser=baduser
    #
    if [ $USER != $testuser ] then
        echo "This is not $testuser"
    else
        echo "Welcome $testuser"
    fi
    $
    $ ./test8.sh
    This is not baduser
    
    • 文件比较
    比较描述
    -d file 检查file是否存在并是一个目录
    -e file 检查file是否存在
    -f file 检查file是否存在并是一个文件
    -r file 检查file是否存在并可读
    -s file 检查file是否存在并非空
    -w file 检查file是否存在并可写
    -x file 检查file是否存在并可执行
    -O file 检查file是否存在并属当前用户所有
    -G file 检查file是否存在并且默认组与当前用户相同
    file1 -nt file2 检查file1是否比file2新
    file1 -ot file2 检查file1是否比file2旧
    $ cat test11.sh
    #!/bin/bash
    # Look before you leap
    # jump_directory=/home/arthur #
    if [ -d $jump_directory ] then
       echo "The $jump_directory directory exists"
       cd $jump_directory
       ls
    else
       echo "The $jump_directory directory does not exist"
    fi #
    $
    $ ./test11.sh
    The /home/arthur directory does not exist
    
    • 符合条件比较
    [ condition1 ] && [ condition2 ]
    [ condition1 ] || [ condition2 ]
    

双方括号

  • 双方括号提供了字符串比较的高级特性。
  • 括号中可以定义一些正则表达式来匹配字符串
  • 注意不是所有的shell都支持双方括号!
$ cat test24.sh
#!/bin/bash

if [[ $USER == s* ]]
then
    echo "Hello Seal"
else
    echo "Sorry, I do not know you"
fi

# seal @ bogon in ~/Desktop/Shell [17:36:57]
$ ./test24.sh
Hello Seal


来自:https://www.jianshu.com/p/3e1eaaa3fee8



2023.6.16