shell中的(),{}几种语法用法

查看脚本语法是否有错误:

bash -n modify_suffix.sh

跟踪执行

sh -x modify_suffix.sh aaa

1. ${var}
2. $(cmd)
3. ()和{}
4. ${var:-string},${var:+string},${var:=string},${var:?string}
5. $((exp))
6. $(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)

1.Shell中变量的原形:${var}

但当你要显示变量值加随意的字符(我这里用_AA)时,就会出错

这时应该用变量的原形:${var},即是加一个大括号来限定变量名称的范围

[root@localhost sh]# aa='ajax'
[root@localhost sh]# echo $aa
ajax
[root@localhost sh]# echo $aa_AA [root@localhost sh]# echo ${aa}_AA
ajax_AA

批量修改一个目录里文件名

[root@localhost ~]# cat modify_suffix.sh
#!/bin/bash
dst_path=$1
for file in `ls $dst_path`
do
if [ -d $1/$file ]
then echo `$0 $1/$file`
elif [ -f $1/$file ]
then mv $1/$file $1/${file}._mod
else
echo $1/${file} is unknow file type
fi done;
./modify_suffix.sh ./f
将 ./f 下的所有文件文件名添加了.mod

演示使用${ }括号中的特殊字符%号和#号

[root@localhost ~]# file="modify_suffix.sh.tar.gz"
[root@localhost ~]# echo "${file%%.*}"
modify_suffix
[root@localhost ~]# echo "${file%.*}"
modify_suffix.sh.tar
[root@localhost ~]# echo "${file#*.}"
sh.tar.gz
[root@localhost ~]# echo "${file##*.}"
gz

2.$(cmd)变量调用

[root@localhost t]# ls
1.txt 2.txt
[root@localhost t]# echo $(ls)
1.txt 2.txt
echo $(ls) 执行过程
shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,
再将此输出放到原来命令 echo $(ls)中的 $(ls)位置,即替换了$(ls),再执行echo命令
如下:
echo $(ls)被替换成了echo 1.txt 2.txt
这里要注意的是$(cmd)中的命令的错误输出是不会被替换的,替换的只是标准输出
[root@localhost t]# var=$(cat 3.txt)
cat: 3.txt: 没有那个文件或目录
[root@localhost t]# echo $var $var显然是空的

3.一串的命令执行()和{}

()和{}都是对一串的命令进行执行,但有所区别:

相同点:

()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开

不同点:

()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行

()最后一个命令可以不用分号,{}最后一个命令要用分号

()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格

()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

[root@localhost t]# var=test
[root@localhost t]# echo $var
test
[root@localhost t]# (var=notest;echo $var)
notest
[root@localhost t]# echo $var
test
[root@localhost t]# { var=notest;echo $var;}
notest
[root@localhost t]# echo $var
notest
[root@localhost t]#

在{}中 第一个命令和{之间必须有空格,结束必须有;

{}中的修改了$var的值 说明在当前shell执行

[root@localhost t]# { var1=test1;var2=test2;echo $var1>a;echo $var2;}
test2
[root@localhost t]# cat a
test1
[root@localhost t]# { var1=test1;var2=test2;echo $var1;echo $var2;}>a
[root@localhost t]# cat a
test1
test2
脚本实例
(
echo "1"
echo "2"
) | awk '{print NR,$0}'

4.几种特殊的替换结构:

${var:-string},${var:+string},${var:=string},${var:?string}

(1) \({var:-string}和\){var:=string}

若变量var为空或者未定义,则用在命令行中用string来替换\({var:-string}**
**否则变量var不为空时,则用变量var的值来替换\){var:-string}

[root@localhost ~]# echo $a

[root@localhost ~]# echo ${a:-bcc}
bcc
[root@localhost ~]# echo $a [root@localhost ~]# a=ajax
[root@localhost ~]# echo ${a:-bcc}
ajax
[root@localhost ~]# unset a
[root@localhost ~]# echo $a [root@localhost ~]# echo ${a:=bbc}
bbc
[root@localhost ~]# echo $a
bbc

发现

${var:-string}和${var:=string}

比较 后者发现$var为空时,把string赋值给了var

后者是一种赋值默认值的常见做法

(2) ${var:+string}

规则和上面的完全相反

即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量var的值,即空值

[root@localhost ~]# a=ajax
[root@localhost ~]# echo $a
ajax
[root@localhost ~]# echo ${a:+bbc}
bbc
[root@localhost ~]# echo $a
ajax
[root@localhost ~]# unset a
[root@localhost ~]# echo $a [root@localhost ~]# echo ${a:+bbc} [root@localhost ~]#

(3). \({var:?string}**
**替换规则:若变量var不为空,则用变量var的值来替换\){var:?string}


若变量var为空,则把string输出到标准错误中,并从脚本中退出。

可利用此特性来检查是否设置了变量的值

[root@localhost ~]# echo $a

[root@localhost ~]# echo ${a:?bbc}
-bash: a: bbc
[root@localhost ~]# a=ajax
[root@localhost ~]# echo ${a:?bbc}
ajax
[root@localhost ~]# a=ajax
[root@localhost ~]# echo ${a:-`date`}
ajax
[root@localhost ~]# unset a
[root@localhost ~]# echo ${a:-`date`}
2017年 02月 21日 星期二 10:13:46 CST
[root@localhost ~]# echo ${a:-$(date)}
2017年 02月 21日 星期二 10:13:59 CST
[root@localhost ~]# b=bbc
[root@localhost ~]# echo ${a:-$b}
bbc

(4).\(((exp)) POSIX标准的扩展计算**
**这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在\)((exp)),包括三目运算符


注意:这种扩展计算是整数型的计算,不支持浮点型和字符串等

若是逻辑判断,表达式exp为真则为1,假则为0

[root@localhost ~]# echo $(3+2)
-bash: 3+2: 未找到命令 [root@localhost ~]# echo $((3+2))
5
[root@localhost ~]# echo $((3.5+2))
-bash: 3.5+2: 语法错误: 无效的算术运算符 (错误符号是 ".5+2")
[root@localhost ~]# echo $((3>2))
1
[root@localhost ~]# echo $((3>2?'a':'b'))
-bash: 3>2?'a':'b': 语法错误: 期待操作数 (错误符号是 "'a':'b'")
[root@localhost ~]# echo $((3>2?a:b))
0
[root@localhost ~]# echo $((a=3+2))
5
[root@localhost ~]# echo $((a++))
5
[root@localhost ~]# echo $a
6

(5).四种模式匹配替换结构:

${var%pattern}
${var%%pattern}
${var#pattern}
${var##pattern} ${var%pattern},${var%%pattern} 从右边向左开始匹配,如果正则表达式匹配到就删除
${var#pattern},${var##pattern} 从左边向右开始匹配,如果正则表达式匹配到就删除
${var%pattern} ,${var#pattern} 表示最短匹配,匹配到就停止,非贪婪,如果正则表达式匹配到就删除
${var%%pattern},${var##pattern} 是最长匹配,如果正则表达式匹配到就删除

只有在pattern中使用了通配符才能有最长最短的匹配,否则没有最 长最短匹配之分

结构中的pattern支持通配符

*** 表示零个或多个任意字符**

?表示零个或一个任意字符

[...]表示匹配中括号里面的字符

[!...]表示不匹配中括号里面的字符

[root@localhost ~]# f=a.tar.gz
[root@localhost ~]# echo ${f##*.}
gz
[root@localhost ~]# echo ${f%%.*}
a
[root@localhost ~]# var=abcdccbbdaa
[root@localhost ~]# echo ${var%%d*}
abc
[root@localhost ~]# echo ${var%d*}
abcdccbb
[root@localhost ~]# echo ${var#*d}
ccbbdaa
[root@localhost ~]# echo ${var##*d}
aa
#发现输出的内容是var去掉pattern的那部分字符串的值

参考:https://www.cnblogs.com/HKUI/p/6423918.html

Shell中的(),{}几种语法用法-单独总结的更多相关文章

  1. shell中的(),{}几种语法用法

    转自:https://www.cnblogs.com/HKUI/p/6423918.html 查看脚本语法是否有错误:bash -n modify_suffix.sh跟踪执行sh -x modify_ ...

  2. [记录]Shell中的getopts和getopt用法

    Shell中的getopts和getopt用法 1.getopts getopts(shell内置命令)不能直接处理长的选项(如:--prefix=/home等),getopts有两个参数,第一个参数 ...

  3. Linux shell中&,&&,|,||的用法

    前言 在玩dvwa的命令注入漏洞的时候,遇到了没有预料到的错误,执行 ping 127.0.0.1 & echo "<?php phpinfo(); ?>" & ...

  4. 不可不看!CSS3中三十一种选择器用法

    原文 The 30 CSS Selectors you Must Memorize 由 Jeffrey Way 发表于 2012 年 6 月,介绍了 30 种最常用的 CSS 选择器用法,多加了一种, ...

  5. shell中echo基础及高级用法详解-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月19日 1.1 基础用法 echo命令用来输出文本,在shell脚本中用来输出提示信息用的比较多. 单引号:原样输出所有的内容,不用转义就能输出特殊 ...

  6. shell中的四种模式匹配

    POSIX为shell为进行模式匹配提供了四种参数替换结构(老版本的shell可能不支持),每种结构有两个参数:变量名(或变量号)及模式. 第一种模式:    ${variable%pattern}, ...

  7. 推荐掌握Linux shell中这7种运算命令

    #常见的算术运算符号 .+.-:加减 .*./.%:乘.除.取余 .**:幂运算 .++.--:增加记减少 .!.&&.||:取反,并且,或 .<,<=,>,=> ...

  8. Shell中read的选项及用法

    1. Read的一些选项 Read可以带有-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项. -a :将内容读入到数值中 echo -n "Input muliple ...

  9. shell 中的三种引号的作用

    1. 单引号(' ') 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用. 2. 双 ...

随机推荐

  1. flutter 自定义TabBar

    这里有个工作示例 import 'dart:async'; import 'package:flutter/material.dart'; import 'package:rxdart/subject ...

  2. 03.Jupyter Notebook高级-魔法命令

    %run %run C:\Users\User\Desktop\hello.py hello world %timeit %timeit L = [i for i in range(1000)] 29 ...

  3. (十) 数据库查询处理之排序(sorting)

    1. 为什么我们需要对数据排序 可以支持对于重复元素的清除(支持DISTINCT) 可以支持GROUP BY 操作 对于关系运算中的一些运算能够得到高效的实现 2. 引入外部排序算法 对于不能全部放在 ...

  4. Numpy初体验

    目录 Numpy 一.简介 1.安装 2.特殊的导包 二.ndarray-多维数组对象 1.创建ndarray数组 1.1 array 1.2 arange 1.3 linspace 1.4 zero ...

  5. Django框架的forms组件与一些补充

    目录 一.多对多的三种创建方式 1. 全自动 2. 纯手撸(了解) 3. 半自动(强烈推荐) 二.forms组件 1. 如何使用forms组件 2. 使用forms组件校验数据 3. 使用forms组 ...

  6. MySQL:逻辑库与表管理

    逻辑库管理 语句 说明 CREATE DATABASE 逻辑库名; 创建逻辑库 SHOW DATABASES; 显示所有逻辑库 DROP DATABASE 逻辑库名; 删除逻辑库 USE 逻辑库名; ...

  7. 微信小程序封装请求接口

    var rootDocment = 'https://123.com';//你的域名 function postData(url, data, cb) { wx.request({ url: root ...

  8. django Form 效验

    Django 登入效验 .py from django import forms from student import models from django.core.exceptions impo ...

  9. golang——win10环境protobuf的使用

    1.protobuf配置 (1)https://github.com/protocolbuffers/protobuf/releases (2)选择适合的版本:protoc-3.8.0-win64.z ...

  10. FreeBSD 开发已经迁移至 git

    FreeBSD 开发已经迁移至 git 全部预计于 2021 年 3 月完成迁移. https://git.freebsd.org/src.git 或者 https://cgit.freebsd.or ...