首页 > 系统相关 >shell 脚本学习

shell 脚本学习

时间:2023-06-16 17:56:29浏览次数:35  
标签:脚本 shell 是否 echo 学习 括号 sh file

 

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.[ 和test 是 Shell 的内部命令,而[[是Shell的关键字





前言

首先在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
方括号与双方括号的区别: [ 和test 是 Shell 的内部命令,而[[是Shell的关键字  

$test -f settings.py && echo True
True

$[ -f settings.py ] && echo True
True

 [ 和test 是相等的。

 


$[ 2 < 1 ] && echo True || echo False
True

$[[ 2 < 1 ]] && echo True || echo False
False

既然是命令, 它就和参数组合为一体被 shell 解释,那样比如 ">" "<" 就被 shell 解释为重定向符号了。关键字却不这样。

[[中使用&&||表示逻辑与和逻辑或。[中使用-a 和-o 表示逻辑与和逻辑或。

$[[ 'abcd' == a*d ]] && echo True || echo False
True


$[ 'abcd' == a*d ] && echo True || echo False
False

[[支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

总结:

使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,

但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]]

如果不使用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]

bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。


$[ !(pip list | grep pip) ] && echo True || echo False
-bash: [: too many arguments
False


$[[ !(pip list | grep pip) ]] && echo True || echo False
True
 

 

https://www.cnblogs.com/zeweiwu/p/5485711.html


2023.6.16 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:脚本,shell,是否,echo,学习,括号,sh,file
From: https://www.cnblogs.com/rebrobot/p/17486182.html

相关文章

  • attention学习-课程笔记
    attention层计算过程:相似度函数fatt计算输入X和查询向量q之间的相似度e;相似度e经过softmax计算得到权重a。 向量e和a的长度与输入X的第一个维度相同。权重a与输入X相乘,得到输出y。相似度计算可使用点积dotprodecut,由于输入X的维度通常较高,q.X值会很大,因此使用sqrt(Dq)进......
  • redis学习十:数据类型命令及落地运用 (HyperLogLog)
    需求:统计某个网站的UV,统计某个文章的UV(UV,uniquevisitor,独立访客,一般理解为客户端ip,需要去重考虑);用户搜索网站关键词的数量(非同一个ip);是什么:去重复统计功能的基数估计算法——HyperLogLog;基数:是一种数据集去重后的真实个数————全集{1,2,3,4,2,3,3}  基数{1,2,3,4}=4用......
  • redis学习九:数据类型命令及落地运用 (bitmap)
    redis位图bitmap:由0和1状态表现得二进制位的bit数组需求:用户是否登录过Y,N,比如京东每日签到送豆;电影,广告是否被点击播放过钉钉打卡上下班大厂签到必备是什么:用于状态记录,Y,N不用去mysql读写。1.bitmap的偏移量从0开始,setbitkey0/1设置对应下标值图中就是1000010,对应as......
  • 1.新手学习Linux 操作命令
     ......
  • 前端学习C语言 - 数组和字节序
    数组本篇主要介绍:一维二维数组、字符数组、数组名和初始化注意点以及字节序。一维数组初始化有以下几种方式对数组初始化://定义一个有5个元素的数组,未初始化inta[5];//定义一个有5个元素的数组,将第一个初始化0,后面几个元素默认初始化为0inta[5]={0};//定义一个......
  • 【gtest】Visual Studio 2019 单元测试学习Google Test
    前言记录在VS2019中使用自带的GoogleTest进行单元测试的方法和经验项目介绍总共2个项目,Work为项目工程,TestWork为Work工程的单元测试工程,TestWork依赖于Work工程,但是Work不依赖TestWork,TestWork是Work的旁路辅助工程,用于对代码的检查和测试。创建项目创建C++的常规Work工程......
  • 前端新手学习入门路径推荐
    背景目的方便新手学习前端技术,整理了一些资源和教程帮助大家更好的入门。基础知识了解一遍有个印象即可,不懂暂时不必深究,在后续实践中会融会贯通。大家重点关注“训战结合”的部分,动手练习并解决问题进步最有效。 Vue学习顺序https://zhuanlan.zhihu.com/p/23134551起......
  • 用户+文件同步脚本
    cat /opt/inotify_rsync.sh#!/bin/bashexportRSYNC_PASSWORD=JxwKRl%!xxxxxx#实时监控61.212主机/sftp/的变化INOTIFY_CMD="/usr/local/bin/inotifywait-mrq-emodify,create,attrib,move,delete/sftp/"#RSYNC_CMD="rsync-azH--delete/sftp/back......
  • 人工智能领域:面试常见问题超全(深度学习基础、卷积模型、对抗神经网络、预训练模型、计
    人工智能领域:面试常见问题超全(深度学习基础、卷积模型、对抗神经网络、预训练模型、计算机视觉、自然语言处理、推荐系统、模型压缩、强化学习、元学习)人工智能领域:面试常见问题1.深度学习基础为什么归一化能够提高求解最优解的速度?为什么要归一化?归一化与标准化有什么联系......
  • 深度学习实践篇[17]:模型压缩技术、模型蒸馏算法:Patient-KD、DistilBERT、DynaBERT、Ti
    深度学习实践篇[17]:模型压缩技术、模型蒸馏算法:Patient-KD、DistilBERT、DynaBERT、TinyBERT1.模型压缩概述1.2模型压缩原有理论上来说,深度神经网络模型越深,非线性程度也就越大,相应的对现实问题的表达能力越强,但相应的代价是,训练成本和模型大小的增加。同时,在部署时,大模型预测......